sql >> Database >  >> RDS >> Mysql

Is er een manier om json-objecten in SQL te gebruiken?

JSON als intentie

Er is geen manier om met JSON in MySQL te werken. Sommige DBMS ondersteunen mogelijk JSON, maar dat is uitgesloten, en bovendien gaat elke vorm van dergelijke "ondersteuning" alleen over het uitvoeren van een aantal JSON-specifieke bewerkingen, maar niet over het modelleren van uw architectuur (en die twee dingen zijn totaal verschillend) Meer , in volledige zin, is het modelconcept (d.w.z. relaties) voor MySQL anders dan JSON is:als een relationeel DBMS volgt het relationeel gegevensmodel , en JSON heeft een compleet ander formaat. Je slaat het op als een gewone tekenreekswaarde, dus het is onmogelijk om er op een andere manier iets mee te doen, als je geen tekenreeksfuncties gebruikt. Dus zelfs als je met JSON werkt, doe je dat niet binnen het relationele model, dus het zal niet mogelijk zijn om relationele functies te behouden, zoals referentiële integriteit, bijvoorbeeld.

Oplossingen om op te lossen

Je hebt verschillende opties:

  • Migreer naar Postgree SQL omdat het uitgebreide ondersteuning heeft voor json, sinds versie 9.4 is het jsonb en het is nog sneller. Dit is misschien de beste optie omdat het RDBMS is en daarom zal de migratie niet zo moeilijk zijn als voor echt documentgeoriënteerde DBMS.
  • Of migreer nu naar Mongo (als dat je bedoeling is), voordat het te laat is. Houd er rekening mee dat Mongo iets heel anders is dan RDBMS, het is documentgericht. Ik denk dat dit de beste optie is, zowel voor uw project als voor uw klant (en uw taak zou zijn om dat uit te leggen)
  • Verander de hele architectuur zodat je geen JSON-objecten opslaat en met genormaliseerde (in termen van relatie-DB) entiteiten werkt. Dit betekent - ja, volledige refactoring van alle code, het veranderen van alle relaties enz. In de echte situatie is het slechts een theoretische optie, u krijgt daar geen tijd of geld voor.
  • Implementeer uw eigen JSON-bibliotheek voor MySQL. Is het moeilijk? Hangt af van wat je met je JSON gaat doen, maar JSON is openbaar formaat, dus u weet in ieder geval wat u moet doen. U kunt het ofwel doen als UDF of bij user-land (dus met CREATE FUNCTION uitspraak). Dit vereist natuurlijk specifieke vaardigheden en tijd. De slechte dingen:bugs. Zelfs als u die functies sneller kunt maken dan uw architectuur opnieuw te structureren of naar Mongo te migreren, bent u nooit zeker van de kwaliteit van die functies. Er is geen manier om die code native te testen. Ik kan echter een hint geven voor het geval van user-land-functies - u kunt mysql-unit om uw opgeslagen code te testen, als uw MySQL 5.6 of hoger is (nou ja, ik heb deze tool geschreven, maar het kan ook bugs bevatten)

"Standaard" functies

Tot slot, als u MySQL 5.7 gebruikt, kan er een sprankje hoop zijn met pre-release JSON-functies - dus u kunt proberen om de alfa-versie van JSON-functionaliteit te gebruiken, die momenteel bestaat voor MySQL 5.7. Maar ik zou het niet (sterk) aanbevelen om dat in een echt project te gebruiken, omdat die functies niet goed getest of helemaal niet compleet zijn. Maar om die functie te installeren, moet u het bijbehorende pakket downloaden en vervolgens op uw server aansluiten, zoals:

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

En daarna kun je ze proberen.



  1. Een Enum-veld wijzigen met Alembic

  2. org.hibernate.HibernateException:de database heeft geen native gegenereerde identiteitswaarde geretourneerd

  3. Postgres docker-container bouwen met initieel schema

  4. 2 manieren om de minuten te halen uit een datetime-waarde in Oracle Database