views:

47

answers:

2

So I've got a users table; storing things like username, email, etc. I then have a user_settings table. Instead of standard columns like timestamp_logged_in, profile_views, etc., I have it organized as key/value combo. For example, the columns are:

user_settings_ID user_ID name value

A sample record would be: 82 2 'timestamp_logged_in' '2009-10-10 02:23:53'

This makes the settings a little more permeable. I don't need to have a column exist to store new user setting types. I'm concerned that doing this (which will store every value as a string, and I'll cast it to the appropriate type in the middle ware) will make it difficult to sort. So for example if I wanted to get a list of the users in order of last logged in, sorting would require an sql call such as:

SELECT user_ID FROM user.settings WHERE status='open' AND name='timestamp_logged_in' ORDER BY name

This would be sorting the found records as strings, however. Is there a way to make sure the sorting algorithm mysql is implemented based on a certain value type (eg. forcing it to treat the sort column as a string, integer, datetime, timestamp, etc.)?

Any thoughts would really be appreciated. Thanks. Oliver Nassar

+3  A: 

You would have to manually cast it to the correct data type.

If you expect the table to get large, storing as key-value pairs like this, while it seems like a good idea at the start, invariably ends up with really crappy performance, as you can't create useful indexes. Think about it now instead of changing later.

Donnie
good point. what's your classification of 'get large'?
onassar
A: 

Why not store the data in a "sortable" string representation .. "pre-casting to a sortable format"

instead of '11-28-2009 11:45' you could store it as '2009.11.28 11:45'

MySQL has the functions needed to typecast back to "datetime" or "date" in the "middleware".

lexu
im not quite sure why middleware was in quotes. that could work, but means a considerable amount of effort in the "middleware" to format things unconventionally.
onassar
The conversions will have to be done at one point or another, if you intend to sort data stored into a string. Either once when writing and once when reading (per row/field) or every time when comparing during a sort. I put middleware into quotes, since I'd probably do the conversion in the client, or appserver, not in the communications code. Also consider Donnie's comment on performance (best to design with performance/scaling in mind). If your row count in user.settings goes >100'000 I'd strongly suggest typed/dedicated fields per user.config entry
lexu
Thanks dude. I plan on the table being 200k+ records out the gate so I'll follow suggestions. Thanks sir.
onassar