Mysql
 sql >> Database >  >> RDS >> Mysql

C'è un modo per usare oggetti json in SQL

JSON come intenzione

Non c'è modo di lavorare con JSON in MySQL. Alcuni DBMS possono supportare JSON, ma è fuori questione e, inoltre, qualsiasi tipo di "supporto" di questo tipo riguarda solo l'esecuzione di alcune operazioni specifiche per JSON, ma non la modellazione della tua architettura (e queste due cose sono completamente diverse) Altro , in senso pieno, il concetto di modello (cioè le relazioni) per MySQL è diverso da JSON:come DBMS relazionale, segue modello di dati relazionali e JSON ha un formato completamente diverso. Lo memorizzerai come semplice valore di stringa, quindi, impossibile fare qualsiasi cosa con esso in qualche altro modo, se non utilizzare le funzioni di stringa. Quindi, anche lavorando con JSON lo farai non all'interno del modello relazionale, quindi non sarà possibile mantenere le caratteristiche relazionali, come l'integrità referenziale, ad esempio.

Opzioni da risolvere

Hai diverse opzioni:

  • Migra a Postgree SQL poiché ha esteso il supporto per json, dalla versione 9.4 è jsonb ed è ancora più veloce. Questa potrebbe essere l'opzione migliore poiché si tratta di RDBMS e quindi la migrazione non sarà così difficile come per DBMS veramente orientati ai documenti.
  • Oppure migra subito a Mongo (se è questa la tua intenzione), prima che sia troppo tardi. Tieni presente che Mongo è una cosa completamente diversa da RDBMS, è orientato ai documenti. Immagino che questa sia l'opzione migliore sia per il tuo progetto che per il tuo cliente (e il tuo compito sarebbe spiegarlo)
  • Cambia l'intera architettura in modo da non archiviare oggetti JSON e lavorare con entità normalizzate (in termini di DB di relazione). Ciò significa - sì, l'intero refactoring di tutto il codice, la modifica di tutte le relazioni ecc. Nella situazione reale è solo un'opzione teorica, non ti verrà dato né tempo né denaro per questo.
  • Implementa la tua libreria JSON per MySQL. È difficile? Dipende da cosa farai con il tuo JSON, ma JSON è in formato pubblico, quindi saprai almeno cosa fare. Puoi farlo come UDF o su user-land (quindi con CREATE FUNCTION dichiarazione). Ciò richiederà abilità e tempo specifici, ovviamente. Le cose brutte:bug. Anche se sarai in grado di creare quelle funzioni più velocemente che ristrutturare la tua architettura o migrare a Mongo, non sarai mai certo della qualità di quelle funzioni. Non c'è modo di testare quel codice in modo nativo. Tuttavia, posso dare un suggerimento per il caso delle funzioni user-land:puoi usare mysql-unit per testare il tuo codice memorizzato, se il tuo MySQL è 5.6 o superiore (beh, ho scritto questo strumento, ma... potrebbe contenere anche dei bug)

Funzioni "standard"

Infine, se stai utilizzando MySQL 5.7, potrebbe esserci un raggio di speranza con le funzioni JSON pre-release - quindi puoi provare per utilizzare la versione alfa della funzionalità JSON, che attualmente esiste per MySQL 5.7. Ma non consiglierei (fortemente) di usarlo in un progetto reale poiché quelle funzioni non sono né ben testate né complete. Ma, per installare queste funzioni, dovrai scaricare il pacchetto corrispondente, quindi collegarlo al tuo server, come:

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';

E dopo potrai provarli.