Na cokoli, co je vždy nastavit pro každý uživatele, měli byste to mít tendenci ponechat v Users
podle obvyklé normalizace. Pokud jde o volitelnou konfiguraci, mám rád následující strukturu tabulky:
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
Kde User_Settings.type
určuje, zda se má odkazovat na pole typu celé číslo nebo řetězec.
tj.:
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');
A pro problém INSERT/UPDATE:
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'fr')
ON DUPLICATE KEY UPDATE value_str='fr';
Také, jak říká většina ostatních lidí, serializace a ukládání preferencí není zvlášť dobrý nápad, protože:
- Dotazem nelze načíst jednu hodnotu, musíte načíst celý serializovaný řetězec, zrušit serializaci a zahodit nepotřebná data.
- Je snadno poničitelný a obtížně se z něj obnovuje.
- Psát nezpracovaný dotaz, tj. globálně opravit určité nastavení, je problém.
- Ukládáte v podstatě tabulková data do jednoho pole tabulky.
Retrospektivní úprava září 2016:
Mezitím jsem měl několik sporů s lidmi o tom, jak nejlépe uložit volitelná nastavení a také obecnou strukturu tabulky definovanou výše.
I když struktura tabulky není vyloženě špatná , není to zrovna dobré buď. Snaží se ze špatné situace vytěžit to nejlepší. Serializace volitelných nastavení může fungovat, pokud se můžete přizpůsobit těmto nastavením:
- Vše se načítá najednou, žádné vybírání nebo vybírání.
- Nelze indexovat, vyhledávat nebo snadno upravovat hromadně .
Pak můžete zvážit přidání pole jako optional_settings
v Users
tabulka obsahující serializovanou [např.:JSON] formu nastavení. Výše uvedené sice neměníte, ale je to přímočařejší přístup a můžete ukládat složitější nastavení.
Také, pokud používáte typ LOB jako TEXT
pro ukládání nejsou data nutně uložena "v řadě" alespoň v MySQL.
Každopádně je to na vás zjistit, jaké jsou požadavky a omezení vaší aplikace, a na základě těchto informací učinit nejlepší volbu.