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

Wie speichert man mehrere Werte in einer einzelnen Spalte, wo weniger Speicher benötigt wird?

Wenn ein Benutzer mehrere Rollen haben kann, ist es wahrscheinlich besser, eine user_role zu haben Tabelle, die diese Informationen speichert. Es ist normalisiert und lässt sich viel einfacher abfragen.

Eine Tabelle wie:

user_id | role
--------+-----------------
      1 | Admin
      2 | User
      2 | Admin
      3 | User
      3 | Author

Ermöglicht die Abfrage aller Benutzer mit einer bestimmten Rolle, z. B. SELECT user_id, user.name FROM user_role JOIN user WHERE role='Admin' anstatt String-Parsing verwenden zu müssen, um Details aus einer Spalte zu bekommen.

Unter anderem wird dies schneller sein, da Sie die Spalten richtig indizieren können und geringfügig mehr Platz benötigen als jede Lösung, die mehrere Werte in eine einzelne Spalte schreibt – was im Gegensatz zu dem steht, wofür relationale Datenbanken entwickelt wurden.

Der Grund, warum dies nicht gespeichert werden sollte, ist, dass es ineffizient ist, aus dem Grund, den DCoder im Kommentar dazu angibt diese Antwort . Um zu überprüfen, ob ein Benutzer eine Rolle hat, muss jede Zeile der Benutzertabelle gescannt werden, und dann muss die Spalte „Rollen“ mithilfe von String-Matching gescannt werden – unabhängig davon, wie diese Aktion offengelegt wird, muss das RMDBS dies tun Führen Sie Zeichenfolgenoperationen aus, um den Inhalt zu analysieren. Dies sind sehr teure Operationen und überhaupt kein gutes Datenbankdesign.

Wenn Sie brauchen Um eine einzige Spalte zu haben, würde ich dringend vorschlagen, dass Sie kein technisches Problem mehr haben, sondern ein Personalmanagementproblem . Das Hinzufügen zusätzlicher Tabellen zu einer bestehenden Datenbank, die sich in der Entwicklung befindet, sollte nicht schwierig sein. Wenn Sie dazu nicht berechtigt sind, erklären Sie der richtigen Person, warum die zusätzliche Tabelle benötigt wird - weil Munging mehrere Werte in einer einzigen Spalte sind schlecht, schlecht Idee .