I am developing a share market type website. I was wondering how I would go about allowing users to save company quotes into a watchlist with all the updated data within similar to many others out there available.
Would appreciate any help on the matter.
For anything that is always set for every user you should tend to keep that in the Users
table, per usual normalization. As for optional config I tend to like the following table structure:
TABLE Users:
id INT AI
name VARCHAR
...
TABLE User_Settings
user_id INT PK,FK
name VARCHAR PK
type BOOL
value_int INT NULL
value_str VARCHAR NULL
Where User_Settings.type
specifies whether the integer or string field should be referenced.
ie:
INSERT INTO Users (id, name) VALUES (1, 'Sammitch');
INSERT INTO User_Settings (user_id, name, type, value_int) VALUES (1, 'level', 1, 75);
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'en');
And for the INSERT/UPDATE issue:
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'fr')
ON DUPLICATE KEY UPDATE value_str='fr';
Also, as most other people are saying, serializing and storing the preferences is not a particularly good idea because:
You can't retrieve a single value with a query, you must retrieve the entire serialized string, de-serialize it, and discard the unnecessary data.
It's easily corruptable, and difficult to recover from.
It's a pain in the booty to write a raw query for, ie: to globally fix a certain setting.
You're storing what is essentially tabular data within a single table field.
This should do the job. If so, please feel free to accept the answer.