Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Beste Möglichkeit, Benutzereinstellungen in MySQL zu speichern?

Für alles, was immer ist für alle festlegen user sollten Sie dies eher in Users belassen Tabelle, pro üblicher Normalisierung. Was die optionale Konfiguration anbelangt, bevorzuge ich die folgende Tabellenstruktur:

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

Wobei User_Settings.type gibt an, ob auf das Integer- oder das String-Feld verwiesen werden soll.

dh:

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

Und für das INSERT/UPDATE-Problem:

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

Wie die meisten anderen Leute auch sagen, ist das Serialisieren und Speichern der Einstellungen keine besonders gute Idee, weil:

  1. Sie können keinen einzelnen Wert mit einer Abfrage abrufen, Sie müssen den gesamten serialisierten String abrufen, ihn deserialisieren und die unnötigen Daten verwerfen.
  2. Es ist leicht zu korrumpieren und schwer zu beheben.
  3. Es ist mühselig, eine rohe Abfrage zu schreiben, dh um eine bestimmte Einstellung global zu korrigieren.
  4. Sie speichern im Wesentlichen tabellarische Daten in einem einzigen Tabellenfeld.

September 2016 Retrospektive Bearbeitung:

In der Zwischenzeit hatte ich ein paar Auseinandersetzungen mit Leuten darüber, wie man am besten optionale Einstellungen sowie die oben definierte allgemeine Tabellenstruktur speichert.

Dabei ist diese Tabellenstruktur nicht unbedingt schlecht , es ist nicht gerade gut entweder. Es versucht, das Beste aus einer schlechten Situation zu machen. Die Serialisierung optionaler Einstellungen kann funktionieren, solange Sie diese Einstellungen berücksichtigen können:

  1. Alles wird auf einmal geladen, kein Auswählen oder Aussuchen.
  2. Nicht indexierbar, durchsuchbar oder massenhaft leicht änderbar .

Dann könnten Sie erwägen, ein Feld wie optional_settings hinzuzufügen in den Users Tabelle, die eine serialisierte [zB:JSON] Form der Einstellungen enthält. Sie tauschen das obige aus, aber es ist ein einfacherer Ansatz und Sie können komplexere Einstellungen speichern.

Auch, wenn Sie einen LOB-Typ wie TEXT verwenden zur Speicherung werden die Daten zumindest in MySQL nicht unbedingt "in the row" gespeichert.

Wie auch immer, es liegt an dir um die Anforderungen und Einschränkungen Ihrer Anwendung zu ermitteln und auf der Grundlage dieser Informationen die beste Wahl zu treffen.