Mysql
 sql >> Base de données >  >> RDS >> Mysql

Existe-t-il un moyen d'utiliser des objets json en SQL

JSON comme intention

Il n'y a aucun moyen de travailler avec JSON dans MySQL. Certains SGBD peuvent prendre en charge JSON, mais c'est hors de question, et, de plus, toute sorte de "support" ne consiste qu'à effectuer certaines opérations spécifiques à JSON, mais pas à modéliser votre architecture (et ces deux choses sont complètement différentes) Plus , au sens plein, le concept de modèle (c'est-à-dire les relations) pour MySQL est différent de JSON :en tant que SGBD relationnel, il suit modèle de données relationnel , et JSON est un format complètement différent. Vous le stockerez en tant que valeur de chaîne simple, il est donc impossible de faire quoi que ce soit avec d'une autre manière, sinon d'utiliser des fonctions de chaîne. Ainsi, même en travaillant avec JSON, vous ne le ferez pas à l'intérieur du modèle relationnel, il ne sera donc pas possible de maintenir les fonctionnalités relationnelles, telles que l'intégrité référentielle, par exemple.

Options de résolution

Vous avez plusieurs options :

  • Migrez vers Postgree SQL car il offre une prise en charge étendue de json, depuis la version 9.4, il s'agit de jsonb et c'est encore plus rapide. Cela pourrait être la meilleure option puisqu'il s'agit d'un SGBDR et que la migration ne sera donc pas aussi difficile que pour un SGBD véritablement orienté document.
  • Ou migrez vers Mongo maintenant (si c'est votre intention), avant qu'il ne soit trop tard. Tenez compte du fait que Mongo est une chose complètement différente de RDBMS, il est orienté document. Je suppose que c'est la meilleure option à la fois pour votre projet et pour votre client (et votre tâche serait de l'expliquer)
  • Modifiez toute l'architecture afin de ne pas stocker d'objets JSON et de travailler avec des entités normalisées (en termes de relation DB). Cela signifie - oui, refactorisation complète de tout le code, modification de toutes les relations, etc. En situation réelle, ce n'est qu'une option théorique, vous ne recevrez ni temps ni argent pour cela.
  • Mettez en œuvre votre propre bibliothèque JSON pour MySQL. Est-il difficile? Cela dépend de ce que vous ferez avec votre JSON, mais JSON est un format public, donc vous saurez quoi faire, au moins. Vous pouvez le faire soit en tant que UDF ou au niveau de l'utilisateur (donc avec CREATE FUNCTION déclaration). Cela nécessitera des compétences spécifiques et du temps, bien sûr. Les mauvaises choses :les bugs. Même si vous serez en mesure de créer ces fonctions plus rapidement que de restructurer votre architecture ou de migrer vers Mongo, vous ne serez jamais certain de la qualité de ces fonctions. Il n'y a aucun moyen de tester ce code nativement. Cependant, je peux donner un indice pour le cas des fonctions utilisateur - vous pouvez utiliser mysql-unit pour tester votre code stocké, si votre MySQL est 5.6 ou supérieur (enfin, j'ai écrit cet outil, mais... il peut aussi contenir des bogues)

Fonctions "standard"

Enfin, si vous utilisez MySQL 5.7, il peut y avoir une lueur d'espoir avec les fonctions JSON de pré-version - alors, vous pouvez essayer pour utiliser la version alfa de la fonctionnalité JSON, qui existe actuellement pour MySQL 5.7. Mais je ne recommanderais pas (fortement) de l'utiliser dans un projet réel car ces fonctions ne sont ni bien testées ni complètes du tout. Mais, pour installer ces fonctions, vous devrez télécharger le package correspondant, puis les brancher sur votre serveur, comme :

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

Et après cela, vous pourrez les essayer.