Mysql
 sql >> база данни >  >> RDS >> Mysql

Има ли някакъв начин да се използват json обекти в SQL

JSON като намерение

Няма начин да се работи с JSON в MySQL. Някои СУБД може да поддържат JSON, но това е изключено и освен това всякакъв вид такава "поддръжка" е само за извършване на някои специфични за JSON операции, но не и за моделиране на вашата архитектура (и тези две неща са напълно различни) Още , в пълен смисъл, концепцията на модела (т.е. отношенията) за MySQL е различна от JSON:като релационна СУБД, тя следва релационен модел на данни , а JSON е напълно различен формат. Ще го съхраните като обикновена низова стойност, следователно е невъзможно да направите нещо с него по някакъв друг начин, ако не използвате низови функции. Така че дори да работите с JSON, вие ще правите това не в релационен модел, така че няма да е възможно да се поддържат релационни характеристики, като например референтна цялост.

Опции за разрешаване

Имате няколко опции:

  • Мигрирайте към Postgree SQL, тъй като има разширена поддръжка за json, от версия 9.4 това е jsonb и е още по-бързо. Това може да е най-добрият вариант, тъй като е RDBMS и следователно миграцията няма да е толкова трудна, както при наистина документно ориентирана СУБД.
  • Или мигрирайте към Mongo сега (ако това е вашето намерение), преди да е станало твърде късно. Имайте предвид, че Mongo е нещо съвсем различно от RDBMS, ориентирано е към документи. Предполагам, че това е най-добрият вариант както за вашия проект, така и за вашия клиент (и вашата задача би била да обясните това)
  • Променете цялата архитектура, така че да не съхранявате JSON обекти и да работите с нормализирани (по отношение на DB) обекти. Това означава - да, цялостно рефакториране на целия код, промяна на всички отношения и т.н. В реална ситуация това е само теоретична опция, няма да ви се даде нито време, нито пари за това.
  • Внедрете своя собствена JSON библиотека за MySQL. Трудно ли е? Зависи какво ще правите с вашия JSON, но JSON е публичен формат, така че поне ще знаете какво да правите. Можете да го направите или като UDF или на място на потребителя (така че с CREATE FUNCTION изявление). Това ще изисква специфични умения и време, разбира се. Лошите неща:бъгове. Дори ако ще можете да създадете тези функции по-бързо, отколкото да преструктурирате архитектурата си или да мигрирате към Mongo, никога няма да сте сигурни в качеството на тези функции. Няма начин да тествате този код естествено. Въпреки това, мога да дам намек за случая с функциите за земя на потребителя - можете да използвате mysql-unit за да тествате съхранения си код, ако вашият MySQL е 5.6 или по-висока (е, аз съм написал този инструмент, но.. може да съдържа и грешки)

"Стандартни" функции

И накрая, ако използвате MySQL 5.7, тогава може да има лъч надежда с предварителни JSON функции - така че можете да опитате да използвате алфа версия на JSON функционалността, която в момента съществува за MySQL 5.7. Но не бих (силно) препоръчал това да се използва в реален проект, тъй като тези функции изобщо не са нито добре тествани, нито завършени. Но за да инсталирате тези функции, ще трябва да изтеглите съответния пакет, след което да ги включите в сървъра си, като:

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

И след това ще можете да ги опитате.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Синтактична грешка на MySQL при изпълнение на SQL заявка

  2. Mysql:Оптимизиране на намирането на супер възел във вложено дърво на набори

  3. Изпълнение задейства съхранени процедури на SqlFiddle. Mysql

  4. LastInsertId на PDO за MySQL условие за състезание?

  5. Време за отпадане в DateTime