sql >> Databasteknik >  >> RDS >> Mysql

Finns det något sätt att använda json-objekt i SQL

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ända mysql-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.



  1. Returnera alla inaktiverade begränsningar i SQL Server (T-SQL-exempel)

  2. Hur återställer jag data från MySQL .frm?

  3. Spara data i mysql från hive hadoop till sqoop?

  4. php artisan migreringsfel:nodnamn eller servnamn tillhandahålls eller vet inte