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

Gibt es einen Vorteil/Nachteil, Feldwerte als JSON-Array zu speichern, anstatt eine neue Tabelle zu erstellen und sie auf eine Eins-zu-Viele-Beziehung zu setzen?

Meiner Erfahrung nach hängt das stark von den gespeicherten Daten ab. Beide Wege haben Vor- und Nachteile. Wenn es sich um ein MMORPG handelt webgame dann sagen, dass Sie einen PC haben das hat einen Gürtel. Und der SC kann Tränke in diesen Gürtel stecken, um während eines Kampfes schnell darauf zugreifen zu können. Wir wollen also die IDs der Tränke speichern, die im Gürtel des Charakters aufbewahrt werden.

Die häufigste Anfrage wäre „alle Tränke besorgen, die der Charakter X hat“. Und das würde in beiden Fällen ziemlich schnell gehen.

Die Vorteile des Speicherns dieser Potion-IDs als separate Tabelle:

  • Du kannst nach einer bestimmten Trank-ID suchen und das sehr schnell. In-Game-Beispiel:Admins haben einen Trank aus dem Spiel entfernt und deshalb müssen Sie alle Gürtel aktualisieren
  • Sie können einige schöne Statistiken erhalten. In-Game-Beispiel:Suche den am häufigsten verwendeten Trank unter allen Spielern
  • Die Datenbank bewahrt die Datenintegrität. In-Game-Beispiel:Sie werden nie auf eine Situation stoßen, in der Sie den Trank verwendet haben und das Spiel sagt:"Ups, ein Trank mit dieser ID existiert nicht"
  • Es ist gut für die Konsistenz. Beispiel im Spiel:Du hast einen Trank aus dem Gürtel genommen und ihn in den Rucksack gesteckt. Das Spiel kann es implementieren, indem es eine Transaktion mit zwei einfachen klaren SQL-Anweisungen aufruft.
  • Sie können JOINs machen. Beispiel im Spiel:Wir brauchen eine Liste der Tränke im Gürtel zusammen mit ihren Namen, Gewichten und Bildern, die in der separaten Tabelle gespeichert sind.
  • Sie können einen einzelnen Artikel aktualisieren, ohne den gesamten Gürtel aktualisieren zu müssen. Erzwungenes Beispiel im Spiel:Du hast eine Million Tränke in deinem Gürtel und du hast einen getrunken.

Die Vorteile des Speicherns als json:

  • Wenn es sich um ein Browserspiel handelt, das Javascript auf der Client-Seite verwendet, erhalten Sie das Belt-json-Objekt mit einer einfachen Anfrage, anstatt Select-query auszuführen und dann in json zu konvertieren
  • Es ist viel einfacher, die Reihenfolge der Elemente beizubehalten, da json-Arrays bereits geordnet sind. Mit dem Tabellen-Ansatz bräuchte man eine zusätzliche Spalte namens „Bestellung“ und aktualisiere sie jedes Mal und prüfe, ob zwei Artikel nicht die gleiche Reihenfolge haben etc.
  • Sie können im Gürtel auf Client-Seite eine Reihe von Neuanordnungen vornehmen und dann auf „Übernehmen“ klicken – Boom, mit einer Abfrage können Sie den gesamten Gürtel aktualisieren. Wohingegen man beim Tabellen-Ansatz dafür mindestens zwei Abfragen benötigt (DELETE + INSERT)
  • Außerdem haben beliebte DBMS Plugins die json-Funktionen in der Datenbank unterstützen

Fazit:Das sind keine großen Vorteile und nicht kritisch Probleme. Alle von ihnen sind lösbar und mit einem geeigneten Design der Anwendung werden beide Lösungen gut funktionieren. Bevor Sie entscheiden, wie Sie die Daten speichern, fragen Sie sich, was die häufigsten Anwendungsfälle für diese Daten sind, und wählen Sie anschließend die Lösung aus.