sql >> Databáze >  >> RDS >> Mysql

Nejlepší způsob uložení uživatelských nastavení v MySQL?

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:

  1. Dotazem nelze načíst jednu hodnotu, musíte načíst celý serializovaný řetězec, zrušit serializaci a zahodit nepotřebná data.
  2. Je snadno poničitelný a obtížně se z něj obnovuje.
  3. Psát nezpracovaný dotaz, tj. globálně opravit určité nastavení, je problém.
  4. 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:

  1. Vše se načítá najednou, žádné vybírání nebo vybírání.
  2. 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.



  1. Jak importovat excelový soubor do MySQL Workbench?

  2. Jak volat uloženou proceduru z režimu spánku s parametry IN i OUT

  3. Licencování MySQL a GPL

  4. Pole v klauzuli IN() Oracle PLSQL