sql >> Databáze >  >> RDS >> Mysql

Existuje nějaký způsob, jak použít objekty json v SQL

JSON jako záměr

V MySQL není možné pracovat s JSON. Některé DBMS mohou podporovat JSON, ale to nepřipadá v úvahu, a kromě toho, jakákoli taková "podpora" je pouze o provádění některých operací specifických pro JSON, ale ne o modelování vaší architektury (a tyto dvě věci jsou zcela odlišné) Více , v plném smyslu je koncept modelu (tj. vztahů) pro MySQL jiný než JSON:jako relační DBMS se řídí relační datový model a JSON je úplně jiný formát. Uložíte ji jako prostou řetězcovou hodnotu, takže s ní nelze nic dělat jiným způsobem, pokud nepoužijete řetězcové funkce. Takže i při práci s JSON to nebudete dělat uvnitř relačního modelu, takže nebude možné udržovat relační funkce, jako je například referenční integrita.

Možnosti řešení

Máte několik možností:

  • Přejděte na Postgree SQL, protože má rozšířenou podporu pro json, od verze 9.4 je to jsonb a je to ještě rychlejší. Toto může být nejlepší volba, protože se jedná o RDBMS, a proto migrace nebude tak obtížná jako u skutečně dokumentově orientovaného DBMS.
  • Nebo migrujte do Mongo hned (pokud je to vaším záměrem), než bude příliš pozdě. Vezměte v úvahu, že Mongo je úplně jiná věc než RDBMS, je orientovaný na dokumenty. Myslím, že je to nejlepší možnost jak pro váš projekt, tak pro vašeho klienta (a vaším úkolem by bylo vysvětlit to)
  • Změňte celou architekturu tak, že nebudete ukládat objekty JSON a budete pracovat s normalizovanými (ve vztahu k DB) entitami. To znamená - ano, kompletní refaktoring celého kódu, změna všech vztahů atd. V reálné situaci je to jen teoretická možnost, na to nebudete mít čas ani peníze.
  • Implementujte svou vlastní knihovnu JSON pro MySQL. Je to těžké? Záleží na tom, co se svým JSON uděláte, ale JSON je veřejný formát, takže budete alespoň vědět, co dělat. Můžete to udělat buď jako UDF nebo v uživatelské zemi (takže pomocí CREATE FUNCTION tvrzení). To bude samozřejmě vyžadovat specifické dovednosti a čas. Špatné věci:chyby. I když budete schopni vytvářet tyto funkce rychleji než restrukturalizovat vaši architekturu nebo migrovat na Mongo, nikdy si nebudete jisti kvalitou těchto funkcí. Neexistuje způsob, jak tento kód nativně otestovat. Mohu však uvést nápovědu pro případ uživatelských funkcí – můžete použít mysql-unit k otestování vašeho uloženého kódu, pokud je vaše MySQL 5.6 nebo vyšší (dobře, napsal jsem tento nástroj, ale... může také obsahovat chyby)

Standardní funkce

A konečně, pokud používáte MySQL 5.7, pak tu může být paprsek naděje s funkcemi JSON před vydáním - takže to můžete zkusit používat alfa verzi funkce JSON, která aktuálně existuje pro MySQL 5.7. Ale to bych (důrazně) nedoporučoval používat v reálném projektu, protože tyto funkce nejsou ani dobře otestované, ani úplné. Chcete-li však tyto funkce nainstalovat, budete si muset stáhnout odpovídající balíček a poté je připojit k serveru, například:

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

A poté je budete moci vyzkoušet.



  1. Nelze vybrat, kde ip=inet_pton($ip)

  2. SQL Server 2016:Vylepšení skupiny dostupnosti

  3. Server zaznamenal vnitřní chybu nebo nesprávnou konfiguraci a nemohl dokončit váš požadavek

  4. mysql LIKE s dvojitým procentem