Storing a Hash in a database table using YAML--anything better?

Discussion in 'Ruby' started by J. B. Rainsberger, Oct 20, 2006.

  1. I'm a beginning Rails programmer, so please be gentle.

    I want to store a hash as a single row in a database table. I'm
    currently storing each name/value pair as a row with a reference back to
    the "parent" row, but that seems unnecessarily complex. I want to know
    whether you have any better suggestions than what I plan to try to do.

    I plan to write the hash into the row in a single column by YAMLing it.
    I would, of course, unYAML on read operations.

    I do not plan ever to need to run a query on a single key in this hash,
    so I feel comfortable storing it blob-like this way. I just wanted to
    know whether anyone knows of a better way than YAML formatting/parsing
    in my Rails model object.

    Thanks for your help!
    --
    J. B. (Joe) Rainsberger :: http://www.jbrains.ca
    Your guide to software craftsmanship
    JUnit Recipes: Practical Methods for Programmer Testing
    2005 Gordon Pask Award for contribution Agile Software Practice
     
    J. B. Rainsberger, Oct 20, 2006
    #1
    1. Advertising

  2. On Fri, Oct 20, 2006 at 08:51:47AM +0900, J. B. Rainsberger wrote:
    } I'm a beginning Rails programmer, so please be gentle.
    }
    } I want to store a hash as a single row in a database table. I'm
    } currently storing each name/value pair as a row with a reference back to
    } the "parent" row, but that seems unnecessarily complex. I want to know
    } whether you have any better suggestions than what I plan to try to do.
    }
    } I plan to write the hash into the row in a single column by YAMLing it.
    } I would, of course, unYAML on read operations.
    }
    } I do not plan ever to need to run a query on a single key in this hash,
    } so I feel comfortable storing it blob-like this way. I just wanted to
    } know whether anyone knows of a better way than YAML formatting/parsing
    } in my Rails model object.

    Look at ActiveRecord::Base.serialize. It lets you declare a column (make
    sure it's a TEXT column) to be a serialized Ruby object. You can store your
    hash automatically. You may also be interested in this example use of it:
    http://redcorundum.blogspot.com/2006/07/ror-additional-attributes-with-sti.html

    } Thanks for your help!
    } J. B. (Joe) Rainsberger :: http://www.jbrains.ca
    --Greg
     
    Gregory Seidman, Oct 20, 2006
    #2
    1. Advertising

  3. Gregory Seidman wrote:
    > On Fri, Oct 20, 2006 at 08:51:47AM +0900, J. B. Rainsberger wrote:
    > } I'm a beginning Rails programmer, so please be gentle.
    > }
    > } I want to store a hash as a single row in a database table. I'm
    > } currently storing each name/value pair as a row with a reference back to
    > } the "parent" row, but that seems unnecessarily complex. I want to know
    > } whether you have any better suggestions than what I plan to try to do.
    > }
    > } I plan to write the hash into the row in a single column by YAMLing it.
    > } I would, of course, unYAML on read operations.
    > }
    > } I do not plan ever to need to run a query on a single key in this hash,
    > } so I feel comfortable storing it blob-like this way. I just wanted to
    > } know whether anyone knows of a better way than YAML formatting/parsing
    > } in my Rails model object.
    >
    > Look at ActiveRecord::Base.serialize. It lets you declare a column (make
    > sure it's a TEXT column) to be a serialized Ruby object. You can store your
    > hash automatically. You may also be interested in this example use of it:
    > http://redcorundum.blogspot.com/2006/07/ror-additional-attributes-with-sti.html


    This is exactly the kind of thing I was hoping to see. Thank you, Greg!
    I'll let you know how it goes.
    --
    J. B. (Joe) Rainsberger :: http://www.jbrains.ca
    Your guide to software craftsmanship
    JUnit Recipes: Practical Methods for Programmer Testing
    2005 Gordon Pask Award for contribution Agile Software Practice
     
    J. B. Rainsberger, Oct 20, 2006
    #3
  4. --------------enig704D5B2FE891C78364F35FC6
    Content-Type: text/plain; charset=ISO-8859-1
    Content-Transfer-Encoding: quoted-printable

    J. B. Rainsberger wrote:
    > I want to store a hash as a single row in a database table. I'm
    > currently storing each name/value pair as a row with a reference back t=

    o
    > the "parent" row, but that seems unnecessarily complex. I want to know
    > whether you have any better suggestions than what I plan to try to do.
    >=20


    Disclaimer: A lot of the following will be database access performance
    related. In personal code with low usage, those can be safely ignored,
    but for a self-education project, I prefer following good practices to
    learn them even if they seem clunky.

    What's the structure of the hash? If it could be replaced by a data
    structure, I'd do so and keep this approach (it IS the correct one from
    the relational data modelling point of view), unless you're sure the
    hash is an atomic value object by design.

    I'd especially not use the serialization approach if you need to filter
    your data according to the contents of that hash - the "draw all records
    from the DB and filter them in Ruby" approach makes baby DBA Jesus cry
    and is a good candidate for becoming a bottleneck. I'd also not use the
    serialization approach if it's binary serialisation - if you ever had to
    access the database from anything except Rails (e.g. Crystal Reports),
    you're screwed.

    David Vallner


    --------------enig704D5B2FE891C78364F35FC6
    Content-Type: application/pgp-signature; name="signature.asc"
    Content-Description: OpenPGP digital signature
    Content-Disposition: attachment; filename="signature.asc"

    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.5 (MingW32)

    iD8DBQFFOKCNy6MhrS8astoRAvnRAJ9XWxWNifFw2JBYfAI3xFb9lJ71qgCfWkd9
    x0bBEMZ9UhagLEweL+9nOFY=
    =bKTY
    -----END PGP SIGNATURE-----

    --------------enig704D5B2FE891C78364F35FC6--
     
    David Vallner, Oct 20, 2006
    #4
  5. J. B. Rainsberger

    Bil Kleb Guest

    J. B. Rainsberger wrote:
    > I'm a beginning Rails programmer, so please be gentle.


    Hi JB! Welcome.

    Regards,
    --
    Bil Kleb
    http://fun3d.larc.nasa.gov
     
    Bil Kleb, Oct 22, 2006
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jonathan Wood
    Replies:
    1
    Views:
    511
    Jonathan Wood
    Jun 2, 2008
  2. rp
    Replies:
    1
    Views:
    539
    red floyd
    Nov 10, 2011
  3. RubyQuestions
    Replies:
    0
    Views:
    225
    RubyQuestions
    Dec 3, 2003
  4. Thibaut Barrère
    Replies:
    8
    Views:
    143
    Thibaut Barrère
    Mar 4, 2009
  5. Colvin
    Replies:
    3
    Views:
    169
    Colvin
    Dec 30, 2003
Loading...

Share This Page