Mysql
 sql >> Database >  >> RDS >> Mysql

Il modo migliore per memorizzare le impostazioni utente in MySQL?

Per tutto ciò che è sempre impostato per ogni utente dovresti tendere a tenerlo in Users tabella, per normale normalizzazione. Per quanto riguarda la configurazione opzionale, tendo ad apprezzare la seguente struttura della tabella:

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

Dove User_Settings.type specifica se deve essere fatto riferimento al campo intero o stringa.

cioè:

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');

E per il problema INSERT/UPDATE:

INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'fr')
  ON DUPLICATE KEY UPDATE value_str='fr';

Inoltre, come dice la maggior parte delle altre persone, serializzare e archiviare le preferenze non è una buona idea perché:

  1. Non puoi recuperare un singolo valore con una query, devi recuperare l'intera stringa serializzata, de-serializzarla ed eliminare i dati non necessari.
  2. È facilmente corruttibile e difficile da recuperare.
  3. È una seccatura scrivere una query grezza per, ad esempio:per correggere globalmente una determinata impostazione.
  4. Stai archiviando quelli che sono essenzialmente dati tabulari all'interno di un singolo campo di tabella.

Modifica retrospettiva di settembre 2016:

Nel frattempo ho avuto alcune discussioni con le persone su come archiviare al meglio le impostazioni opzionali, nonché la struttura generale della tabella definita sopra.

Anche se la struttura della tabella non è del tutto cattiva , non è esattamente buono o. Sta cercando di trarre il meglio da una brutta situazione. La serializzazione delle impostazioni facoltative può funzionare purché tu possa soddisfare queste impostazioni:

  1. Tutto caricato in una volta, nessun prelievo o scelta.
  2. Non è indicizzabile, ricercabile o facilmente modificabile in massa .

Quindi potresti considerare di aggiungere un campo come optional_settings nel Users tabella contenente una forma serializzata [es:JSON] delle impostazioni. Scambia quanto sopra, ma è un approccio più semplice e puoi memorizzare impostazioni più complesse.

Inoltre, se utilizzi un tipo LOB come TEXT per l'archiviazione i dati non sono necessariamente archiviati "nella riga" almeno in MySQL.

Comunque, dipende da tu per determinare quali sono i requisiti e i vincoli della tua applicazione e fare la scelta migliore in base a tali informazioni.