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

Er der nogen måde at bruge json-objekter i SQL

JSON som hensigt

Der er ingen måde at arbejde med JSON i MySQL. Nogle DBMS understøtter muligvis JSON, men det er udelukket, og desuden handler enhver form for sådan "support" kun om at udføre nogle JSON-specifikke operationer, men ikke om at modellere din arkitektur (og de to ting er helt forskellige) Mere , i fuld forstand, er modelkonceptet (dvs. relationer) for MySQL anderledes end JSON er:som en Relationel DBMS følger den relationel datamodel , og JSON er et helt andet format. Du gemmer den som almindelig strengværdi, så det er umuligt at gøre noget med det på anden måde, hvis ikke brug strengfunktioner. Så selv når du arbejder med JSON, vil du gøre det ikke inden for relationsmodellen, og det vil derfor ikke være muligt at opretholde relationelle funktioner, såsom referentiel integritet, for eksempel.

Valgmuligheder for at løse

Du har flere muligheder:

  • Migrer til Postgree SQL, da det har udvidet understøttelse af json, siden version 9.4 er det jsonb og det er endnu hurtigere. Dette kan være den bedste mulighed, da det er RDBMS, og derfor vil migreringen ikke være så svær som for ægte dokumentorienteret DBMS.
  • Eller migrer til Mongo nu (hvis det er din hensigt), før det er for sent. Tag i betragtning, at Mongo er en helt anden ting end RDBMS, den er dokumentorienteret. Jeg gætter på, at dette er den bedste mulighed både for dit projekt og for din klient (og din opgave ville være at forklare det)
  • Skift hele arkitekturen, så du ikke gemmer JSON-objekter og vil arbejde med normaliserede (med hensyn til relations-DB) entiteter. Det betyder - ja, fuldstændig refaktorering af al kode, ændring af alle relationer osv. I den virkelige situation er det kun en teoretisk mulighed, du vil ikke blive givet hverken tid eller penge til det.
  • Implementer dit eget JSON-bibliotek til MySQL. Er det svært? Afhænger af, hvad du vil gøre med din JSON, men JSON er offentligt format, så du ved i hvert fald, hvad du skal gøre. Du kan gøre det enten som UDF eller på brugerland (så med CREATE FUNCTION udmelding). Dette vil naturligvis kræve specifikke færdigheder og tid. De dårlige ting:bugs. Selvom du vil være i stand til at skabe disse funktioner hurtigere end at omstrukturere din arkitektur eller migrere til Mongo, vil du aldrig være sikker på kvaliteten af ​​disse funktioner. Der er ingen måde at teste den kode på. Jeg kan dog give et tip til tilfældet med brugerland-funktioner - du kan bruge mysql-unit for at teste din lagrede kode, hvis din MySQL er 5.6 eller højere (nå, jeg har skrevet dette værktøj, men .. det kan også indeholde fejl)

"Standard" funktioner

Endelig, hvis du kører MySQL 5.7, så kan der være en stråle af håb med pre-release JSON-funktioner a> - så du kan prøve at bruge alfa-version af JSON-funktionalitet, som i øjeblikket findes til MySQL 5.7. Men jeg vil ikke (stærkt) anbefale at bruge det i et rigtigt projekt, da disse funktioner hverken er gennemtestede eller komplette overhovedet. Men for at installere disse funktioner skal du downloade den tilsvarende pakke og derefter tilslutte dem til din server, f.eks.:

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

Og derefter vil du være i stand til at prøve dem.



  1. BESTIL EFTER tilstand

  2. Gem følsomme data i Silverstripe 3.1

  3. MySQL-strengfunktioner (fuld liste)

  4. hvordan kan man sammenkæde mere end to kolonner i plsql-udvikler?