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žítmysql-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.