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

Gibt es eine Möglichkeit, JSON-Objekte in SQL zu verwenden?

JSON als Absicht

Es gibt keine Möglichkeit, mit JSON in MySQL zu arbeiten. Einige DBMS unterstützen möglicherweise JSON, aber das kommt nicht in Frage, und außerdem geht es bei jeder Art von "Unterstützung" nur um die Durchführung einiger JSON-spezifischer Operationen, aber nicht um die Modellierung Ihrer Architektur (und diese beiden Dinge sind völlig unterschiedlich). Mehr , im wahrsten Sinne des Wortes, ist das Modellkonzept (d. h. die Beziehungen) für MySQL anders als für JSON:Als relationales DBMS folgt es relationales Datenmodell , und JSON ist ein völlig anderes Format. Sie werden es als einfachen String-Wert speichern, daher ist es unmöglich, etwas anderes damit zu tun, wenn Sie keine String-Funktionen verwenden. Selbst wenn Sie mit JSON arbeiten, tun Sie dies also nicht innerhalb des relationalen Modells, sodass es nicht möglich ist, relationale Funktionen wie beispielsweise die referenzielle Integrität beizubehalten.

Zu lösende Optionen

Sie haben mehrere Möglichkeiten:

  • Migrieren Sie zu Postgree SQL, da es erweiterte Unterstützung für json bietet, seit Version 9.4 ist es jsonb und es geht noch schneller. Dies ist möglicherweise die beste Option, da es sich um ein RDBMS handelt und die Migration daher nicht so schwierig ist wie bei einem wirklich dokumentenorientierten DBMS.
  • Oder migrieren Sie jetzt zu Mongo (falls Sie dies beabsichtigen), bevor es zu spät ist. Beachten Sie, dass Mongo etwas völlig anderes ist als RDBMS, es ist dokumentenorientiert. Ich denke, das ist die beste Option sowohl für Ihr Projekt als auch für Ihren Kunden (und Ihre Aufgabe wäre es, das zu erklären)
  • Ändern Sie die gesamte Architektur, sodass Sie keine JSON-Objekte speichern und mit normalisierten (in Bezug auf die Beziehungs-DB) Entitäten arbeiten. Das bedeutet - ja, komplettes Refactoring des gesamten Codes, Änderung aller Relationen usw. In der realen Situation ist es nur eine theoretische Option, dafür bekommt man weder Zeit noch Geld.
  • Implementieren Sie Ihre eigene JSON-Bibliothek für MySQL. Ist es schwer? Hängt davon ab, was Sie mit Ihrem JSON machen, aber JSON ist ein öffentliches Format, sodass Sie zumindest wissen, was zu tun ist. Sie können dies entweder als UDF tun oder im User-Land (also mit CREATE FUNCTION Aussage). Dies erfordert natürlich spezifische Fähigkeiten und Zeit. Die schlechten Dinge:Fehler. Selbst wenn Sie diese Funktionen schneller erstellen können als Ihre Architektur neu zu strukturieren oder zu Mongo zu migrieren, können Sie sich der Qualität dieser Funktionen nie sicher sein. Es gibt keine Möglichkeit, diesen Code nativ zu testen. Ich kann jedoch einen Hinweis für den Fall von Benutzerlandfunktionen geben - Sie können mysql-unit um Ihren gespeicherten Code zu testen, wenn Ihr MySQL 5.6 oder höher ist (nun, ich habe dieses Tool geschrieben, aber ... es kann auch Fehler enthalten)

"Standard"-Funktionen

Und schließlich, wenn Sie MySQL 5.7 verwenden, gibt es vielleicht einen Hoffnungsschimmer mit vorab veröffentlichten JSON-Funktionen - Sie können es also versuchen um die Alpha-Version der JSON-Funktionalität zu verwenden, die derzeit für MySQL 5.7 existiert. Aber ich würde nicht (dringend) empfehlen, das in einem echten Projekt zu verwenden, da diese Funktionen weder gut getestet noch vollständig sind. Aber um diese Funktion zu installieren, müssen Sie das entsprechende Paket herunterladen und es dann an Ihren Server anschließen, wie:

CREATE FUNCTION json_append       RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_valid        RETURNS integer SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_extract      RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_replace      RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_remove       RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_set          RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_merge        RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_search       RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_contains_key RETURNS integer SONAME 'libmy_json_udf.so';

Und danach können Sie sie ausprobieren.