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

Speichern von JSON in der Datenbank im Vergleich zu einer neuen Spalte für jeden Schlüssel

Aktualisiert am 4. Juni 2017

Angesichts der Tatsache, dass diese Frage/Antwort an Popularität gewonnen hat, dachte ich, dass es eine Aktualisierung wert ist.

Als diese Frage ursprünglich gepostet wurde, hatte MySQL keine Unterstützung für JSON-Datentypen und die Unterstützung in PostgreSQL steckte noch in den Kinderschuhen. Seit 5.7 unterstützt MySQL jetzt einen JSON-Datentyp (in einem binären Speicherformat) und PostgreSQL JSONB ist deutlich gereift. Beide Produkte bieten performante JSON-Typen, die beliebige Dokumente speichern können, einschließlich der Unterstützung für die Indizierung bestimmter Schlüssel des JSON-Objekts.

Ich bleibe jedoch immer noch bei meiner ursprünglichen Aussage, dass Ihre Standardeinstellung bei der Verwendung einer relationalen Datenbank immer noch Spalte pro Wert sein sollte. Relationale Datenbanken basieren immer noch auf der Annahme, dass die darin enthaltenen Daten ziemlich gut normalisiert sind. Der Abfrageplaner verfügt beim Betrachten von Spalten über bessere Optimierungsinformationen als beim Betrachten von Schlüsseln in einem JSON-Dokument. Fremdschlüssel können zwischen Spalten erstellt werden (jedoch nicht zwischen Schlüsseln in JSON-Dokumenten). Wichtig:Wenn der Großteil Ihres Schemas flüchtig genug ist, um die Verwendung von JSON zu rechtfertigen, sollten Sie zumindest überlegen, ob eine relationale Datenbank die richtige Wahl ist.

Allerdings sind nur wenige Anwendungen perfekt relational oder dokumentenorientiert. Die meisten Anwendungen haben eine Mischung aus beidem. Hier sind einige Beispiele, bei denen ich persönlich JSON in einer relationalen Datenbank als nützlich empfunden habe:

  • Beim Speichern von E-Mail-Adressen und Telefonnummern für einen Kontakt, wo das Speichern als Werte in einem JSON-Array viel einfacher zu verwalten ist als mehrere separate Tabellen

  • Speichern beliebiger Schlüssel/Wert-Benutzereinstellungen (wobei der Wert boolesch, textuell oder numerisch sein kann und Sie keine separaten Spalten für verschiedene Datentypen haben möchten)

  • Speichern von Konfigurationsdaten ohne definiertes Schema (wenn Sie Zapier oder IFTTT erstellen und Konfigurationsdaten für jede Integration speichern müssen)

Ich bin mir sicher, dass es auch andere gibt, aber das sind nur ein paar kurze Beispiele.

Originalantwort

Wenn Sie wirklich so viele Felder hinzufügen möchten, wie Sie möchten, ohne Einschränkung (abgesehen von einer willkürlichen Begrenzung der Dokumentgröße), sollten Sie eine NoSQL-Lösung wie MongoDB in Betracht ziehen.

Für relationale Datenbanken:Verwenden Sie eine Spalte pro Wert. Das Platzieren eines JSON-Blobs in einer Spalte macht es praktisch unmöglich, Abfragen durchzuführen (und quälend langsam, wenn Sie tatsächlich eine funktionierende Abfrage finden).

Relationale Datenbanken nutzen Datentypen beim Indizieren und sollen mit einem normalisierten implementiert werden Struktur.

Als Randnotiz:Das soll nicht heißen, dass Sie JSON niemals in einer relationalen Datenbank speichern sollten. Wenn Sie echte Metadaten hinzufügen oder wenn Ihr JSON Informationen beschreibt, die nicht abgefragt werden müssen und nur zur Anzeige verwendet wird, kann es zu viel des Guten sein, eine separate Spalte für alle Datenpunkte zu erstellen.