JSON som avsikt
Det finns inget sätt att arbeta med JSON i MySQL. Vissa DBMS kan stödja JSON, men det är uteslutet, och dessutom handlar alla typer av sådant "stöd" bara om att utföra vissa JSON-specifika operationer, men inte om att modellera din arkitektur (och de två sakerna är helt olika) Mer , i full mening, är modellkonceptet (dvs. relationer) för MySQL annorlunda än vad JSON är:som ett Relational DBMS följer det relationsdatamodell , och JSON är ett helt annat format. Du kommer att lagra det som vanligt strängvärde, så det är omöjligt att göra något med det på något annat sätt, om inte använd strängfunktioner. Så även om du arbetar med JSON kommer du att göra det inte i relationsmodellen, så det kommer inte att vara möjligt att upprätthålla relationsfunktioner, såsom referensintegritet, till exempel.
Alternativ att lösa
Du har flera alternativ:
- Migrera till Postgree SQL eftersom det har utökat stöd för json, sedan version 9.4 är det jsonb och det är ännu snabbare. Detta kan vara det bästa alternativet eftersom det är RDBMS och därför blir migreringen inte så svår som för verkligt dokumentorienterade DBMS.
- Eller migrera till Mongo nu (om det är din avsikt), innan det är för sent. Tänk på att Mongo är en helt annan sak än RDBMS, det är dokumentorienterat. Jag antar att detta är det bästa alternativet både för ditt projekt och för din kund (och din uppgift skulle vara att förklara det)
- Ändra hela arkitekturen så att du inte lagrar JSON-objekt och kommer att arbeta med normaliserade (i termer av relation DB) entiteter. Detta innebär - ja, fullständig omfaktorering av all kod, ändra alla relationer etc. I verkliga situationer är det bara ett teoretiskt alternativ, du kommer inte att ges varken tid eller pengar för det.
- Implementera ditt eget JSON-bibliotek för MySQL. Är det svårt? Beror på vad du ska göra med din JSON, men JSON
är offentligt format, så du vet åtminstone vad du ska göra. Du kan göra det antingen som UDF
eller på användarlandet (så med
CREATE FUNCTION
påstående). Detta kommer naturligtvis att kräva specifika färdigheter och tid. De dåliga sakerna:buggar. Även om du kommer att kunna skapa dessa funktioner snabbare än att strukturera om din arkitektur eller migrera till Mongo, kommer du aldrig att vara säker på kvaliteten på dessa funktioner. Det finns inget sätt att testa den koden inbyggt. Däremot kan jag ge tips för fallet med användarlandfunktioner - du kan användamysql-unit
för att testa din lagrade kod, om din MySQL är 5.6 eller högre (jag har skrivit det här verktyget, men det kan också innehålla buggar)
"Standard"-funktioner
Slutligen, om du kör MySQL 5.7 kan det finnas en stråle av hopp med pre-release JSON-funktioner a> - så du kan försöka att använda alfa-versionen av JSON-funktionalitet, som för närvarande finns för MySQL 5.7. Men jag skulle inte (starkt) rekommendera att använda det i verkliga projekt eftersom dessa funktioner varken är väl testade eller kompletta alls. Men för att installera dessa funktioner måste du ladda ner motsvarande paket och sedan ansluta dem till din server, som:
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';
Och efter det kommer du att kunna prova dem.