Ich habe folgende Tabellen und ihre Beziehung. Ich speichere JSON-Daten in der Tabelle client_services. Ist es eine Möglichkeit, JSON-Werte mit mysql-Abfrage abzurufen. wie:
%Vor%ODER
Kann ich die Tabelle client_services weiter normalisieren?
Dienstleistungen:
%Vor%service_features:
%Vor%client_services:
%Vor%client_feature_mappers:
%Vor%Da viele Leute mir diese Frage persönlich gestellt haben, dachte ich, ich würde dieser Antwort eine zweite Überarbeitung geben. Hier ist ein Kern, der die komplette SQL mit SELECT, Migration und View Creation und eine Live-Sql-Geige (Verfügbarkeit nicht garantiert für Geige) .
Nehmen wir an, Sie haben eine Tabelle (mit dem Namen: JSON_TABLE) wie folgt:
%Vor%Um die einzelnen json-Felder auszuwählen, können Sie Folgendes tun:
%Vor%was ergibt:
%Vor%Dies könnte eine kostspielige Operation sein, die basierend auf Ihrer Datengröße und json-Komplexität ausgeführt wird. Ich schlage vor, es für
zu verwendenAchten Sie auf Folgendes: Sie können json haben, beginnend mit doppelten Anführungszeichen (stringifiziert):
%Vor%Getestet mit Mysql 5.7 auf Ubuntu und Mac OSX Sierra.
Zuerst sollten Sie sich bewusst sein, dass Ihr Modell oben nicht in der ersten Normalform ist, was bedeutet, dass Sie nur einen einzelnen Wert in jedem Feld haben sollten. Diese Definition hängt jedoch von den Anforderungen Ihrer Anwendungsabfrageverarbeitung ab.
Wenn Sie also nur eine Menge JSON-Daten in ein Feld einfügen und sie an die Anwendung zurückgeben möchten, ist das in Ordnung. Sie könnten die gesamten JSON-Daten zurückgeben und die Anwendung die gewünschten JSON-Attribute auswählen lassen.
Aber wenn Sie wie in Ihrem Fall Kriterien oder Feldausdrücke haben, die in die Details der JSON-Daten schauen, dann ist das definitiv ein No-Go. Es wird ein Albtraum in der Abfragekomplexität und langsamen Verarbeitung sein.
Sie können Ihre Tabellen natürlich weiter normalisieren, um die JSON-Datenstruktur vollständig zu ersetzen. Wenn Ihre Anwendung jedoch ein flexibles Schema benötigt, vielleicht der Hauptgrund für die Verwendung von NOSQL-DBs, aber Sie bei MySQL stecken bleiben, gibt es zwei Lösungen:
a) benutze MySQL 5.6 (oder MariaDB v. ??) für NoSQL-Unterstützung (ich habe nicht ins Detail gegangen) Ссылка MariaDBs dynamische Spalten: Ссылка
b) benutze mysql ohne ein explizites Schema, siehe hier für eine sehr gut gemachte Lösung, die keine Skalierbarkeitsprobleme hat: Ссылка