Maison >Périphériques technologiques >Industrie informatique >Comment utiliser les champs de données JSON dans les bases de données MySQL
Cet article explore les détails de l'implémentation JSON dans MySQL 9.1 et poursuit l'argument selon lequel les limites entre les bases de données SQL et NOSQL sont floues dans l'article précédent "SQL vs Nosql: les différences", qui apprennent tous deux de l'autre de l'autre de l'autre de l'autre de l'autre caractéristiques. La base de données InNODB MySQL 5.7 et PostgreSQL 9.2 prennent directement en charge le stockage des types de documents JSON dans un seul champ.
Il convient de noter que toute base de données peut stocker des documents JSON en tant que blob de chaîne unique. Cependant, MySQL et PostgreSQL prennent en charge le stockage des données JSON validées en tant que paires de valeurs clés réelles au lieu de chaînes simples.
Points clés
Le stockage des documents JSON dans la colonne MySQL JSON ne signifie pas que vous devez le faire
La normalisation est une technologie utilisée pour optimiser la structure de la base de données. La première règle de formule normale (1NF) stipule que chaque colonne doit contenir une seule valeur et stocker des documents JSON à valeur multiple viole évidemment cette règle.
Si vos données ont des exigences de données relationnelles claires, veuillez utiliser le champ de valeur unique approprié. JSON doit être utilisé avec prudence en dernier recours. Les champs de valeur JSON ne peuvent pas être indexés directement, donc évitez de les utiliser sur des colonnes fréquemment mises à jour ou recherchées.
L'indice de fonction des colonnes générées dérivées des données JSON vous permet d'indexer certaines parties d'objets JSON, améliorant ainsi les performances de la requête.
c'est-à-dire que JSON a de bons cas d'utilisation pour les données clairsemées ou les propriétés personnalisées.
Créez une table avec la colonne de type de données JSON
Considérez un magasin vendant des livres. Tous les livres ont ID, ISBN, titre, éditeur, nombre de pages et autres données relationnelles claires.
Maintenant, si vous souhaitez ajouter autant de balises de catégorie à chaque livre. Vous pouvez l'implémenter dans SQL en utilisant la méthode suivante:
<code class="language-sql">CREATE TABLE `book` ( `id` MEDIUMINT() UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(200) NOT NULL, `tags` JSON DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB;</code>Les colonnes JSON MySQL ne peuvent pas avoir de valeurs par défaut, ne peuvent pas être utilisées comme clés principales, ne peuvent pas être utilisées comme clés étrangères et ne peuvent pas avoir d'index directs.
Cependant, avec MySQL 9.1, vous pouvez créer des index de fonction sur des colonnes générées dérivées de données JSON, ce qui permet d'indexer des éléments spécifiques dans les documents JSON. Ces colonnes générées peuvent être virtuelles ou stockées et indexées sous forme d'indices auxiliaires.
<code class="language-sql">ALTER TABLE book ADD COLUMN first_tag VARCHAR(50) AS (JSON_UNQUOTE(tags->'$[0]')), ADD INDEX idx_first_tag (first_tag);</code>
Ajouter des données JSON
L'ensemble du document JSON peut être passé dans une instruction INSERT ou UPDATE, ce qui facilite le déplacement de JSON vers MySQL pour le stockage et le fonctionnement.
Par exemple, nos balises de livre peuvent être passées sous forme de tableau (dans une chaîne):
<code class="language-sql">INSERT INTO `book` (`title`, `tags`) VALUES ( 'ECMAScript 2015: A SitePoint Anthology', '["JavaScript", "ES2015", "JSON"]' );</code>Vous pouvez également créer JSON en utilisant les fonctions suivantes:
<code class="language-sql">-- 返回ARRAY: SELECT JSON_TYPE('[1, 2, "abc"]'); -- 返回OBJECT: SELECT JSON_TYPE('{"a": 1, "b": 2}'); -- 返回错误: SELECT JSON_TYPE('{"a": 1, "b": 2');</code>JSON_VALID () Renvoie 1 Si JSON est valide, sinon 0 sera retourné:
<code class="language-sql">-- 返回1: SELECT JSON_TYPE('[1, 2, "abc"]'); -- 返回1: SELECT JSON_TYPE('{"a": 1, "b": 2}'); -- 返回0: SELECT JSON_TYPE('{"a": 1, "b": 2');</code>Tenter d'insérer un document JSON non valide lancera une erreur et l'intégralité de l'enregistrement ne sera pas inséré / mis à jour.
Rechercher des documents JSON dans la colonne MySQL JSON
En utilisant des fonctions JSON MySQL telles que la fonction JSON_CONTAINS (), vous pouvez vérifier si le document JSON contient une valeur spécifique. Renvoie 1 lorsqu'un match est trouvé. Par exemple:
<code class="language-sql">-- 所有带有“JavaScript”标签的书籍: SELECT * FROM `book` WHERE JSON_CONTAINS(tags, '["JavaScript"]');</code>JSON_SEARCH () Renvoie le chemin d'accès à la valeur dans le document JSON. Renvoie Null lorsqu'il n'y a pas de correspondance.
Vous pouvez également spécifier si vous devez trouver toutes les matchs ou une seule correspondance en passant les drapeaux "un" et "tous" et les chaînes de recherche (où% correspond à n'importe quel nombre de caractères, _ correspond à un personnage comme). Par exemple:
<code class="language-sql">-- 所有标签以“Java”开头的书籍: SELECT * FROM `book` WHERE JSON_SEARCH(tags, 'one', 'Java%') IS NOT NULL;</code>JSON_TABLE () Convertit les données JSON en formats relationnels pour faciliter la question de l'interrogation:
<code class="language-sql">SELECT * FROM JSON_TABLE( '[{"tag": "SQL"}, {"tag": "JSON"}]', '$[*]' COLUMNS (tag VARCHAR(50) PATH '$.tag') ) AS tags_table;</code>
JSON PATH
MySQL JSON Query Utilisation de la fonction JSON_Extract () peut récupérer des valeurs spécifiques à partir de documents JSON en fonction du chemin spécifié.
<code class="language-sql">CREATE TABLE `book` ( `id` MEDIUMINT() UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(200) NOT NULL, `tags` JSON DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB;</code>
Toutes les définitions de chemin commencent par $ suivi par d'autres sélecteurs:
L'exemple suivant fait référence au document JSON suivant:
<code class="language-sql">ALTER TABLE book ADD COLUMN first_tag VARCHAR(50) AS (JSON_UNQUOTE(tags->'$[0]')), ADD INDEX idx_first_tag (first_tag);</code>
Exemple de chemin:
Vous pouvez utiliser JSON pour extraire les fonctions MySQL pour extraire efficacement le nom et la première balise de votre table de livre:
<code class="language-sql">INSERT INTO `book` (`title`, `tags`) VALUES ( 'ECMAScript 2015: A SitePoint Anthology', '["JavaScript", "ES2015", "JSON"]' );</code>
Pour des exemples plus complexes, supposons que vous ayez un tableau utilisateur contenant des données de fichier de configuration JSON. Par exemple:
id | name | profile |
---|---|---|
1 | Craig | { "email": ["craig@email1.com", "craig@email2.com"], "twitter": "@craigbuckler" } |
2 | SitePoint | { "email": [], "twitter": "@sitepointdotcom" } |
Vous pouvez utiliser le chemin JSON pour extraire le nom Twitter. Par exemple:
<code class="language-sql">CREATE TABLE `book` ( `id` MEDIUMINT() UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(200) NOT NULL, `tags` JSON DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB;</code>
Vous pouvez utiliser le chemin JSON dans la clause WHERE pour retourner uniquement les utilisateurs avec un compte Twitter:
<code class="language-sql">ALTER TABLE book ADD COLUMN first_tag VARCHAR(50) AS (JSON_UNQUOTE(tags->'$[0]')), ADD INDEX idx_first_tag (first_tag);</code>
Modifier la partie du document JSON
Il existe plusieurs fonctions MySQL qui peuvent modifier une partie d'un document JSON en utilisant la notation de chemin. Ces fonctions incluent:
Par exemple, si vous souhaitez ajouter une balise "technique" à n'importe quel livre qui a déjà une balise "javascript", vous pouvez utiliser la fonction json_merge_patch ():
<code class="language-sql">INSERT INTO `book` (`title`, `tags`) VALUES ( 'ECMAScript 2015: A SitePoint Anthology', '["JavaScript", "ES2015", "JSON"]' );</code>
Plus d'informations
La documentation MySQL fournit des informations détaillées sur les types de données JSON MySQL et les fonctions JSON associées.
Rappelez à nouveau, n'utilisez pas JSON sauf si nécessaire. Vous pouvez simuler l'intégralité de la base de données NOSQL orientée document dans MySQL, mais cela compensera bon nombre des avantages de SQL, et vous pourriez aussi bien passer à un véritable système NOSQL!
c'est-à-dire que pour les exigences de données plus vagues dans les applications SQL, les types de données JSON peuvent économiser des efforts.
Des questions fréquemment posées sur l'utilisation des données JSON dans MySQL
Pouvez-vous utiliser JSON dans MySQL?
MySQL prend en charge JSON en fournissant un type de données JSON, qui est utilisé pour stocker les données au format JSON dans des colonnes. En commençant par MySQL 5.7.8, vous pouvez créer des tables avec des colonnes JSON, vous permettant d'insérer, de mettre à jour et d'interroger les données JSON à l'aide de SQL. MySQL fournit une série de fonctions JSON pour traiter les données JSON dans ces colonnes, afin que les données JSON puissent être extraites, modifiées et manipulées.
De plus, vous pouvez utiliser des données JSON dans les requêtes SQL et les convertir en données relationnelles à l'aide de fonctions telles que JSON_TABLE en cas de besoin. Cependant, il est important de comprendre que MySQL est fondamentalement une base de données relationnelle avec le support de type de données JSON conçu pour faciliter le traitement des données JSON dans un contexte relationnel plutôt que de devenir une base de données JSON NOSQL à part entière.
Comme mentionné ci-dessus, ce n'est pas parce que vous pouvez stocker JSON que vous devez le faire: la normalisation est une technique pour optimiser la structure de la base de données. La première règle de formule normale (1NF) indique que chaque colonne doit contenir une seule valeur et le stockage des documents JSON à valeur multiple viole cette règle.
Est-il acceptable de stocker JSON dans MySQL?
stocker json dans mysql est ok si:
Cependant, JSON ne doit pas remplacer le stockage relationnel normalisé des données structurées et fréquemment interrogées. Bien que MySQL 9.1 améliore la fonctionnalité JSON avec des fonctionnalités telles que l'indexation des fonctions et JSON_TABLE, les opérations JSON peuvent toujours provoquer des frais généraux pour de grands ensembles de données ou des requêtes complexes.
Comment utiliser JSON dans la requête MySQL?
Vous pouvez utiliser JSON dans les requêtes MySQL en utilisant la fonction JSON de MySQL. Ces fonctions vous permettent d'extraire, de manipuler et d'interroger les données JSON stockées dans des chaînes de format JSON dans des colonnes ou bases de données JSON. Pour accéder aux données JSON dans une colonne JSON, utilisez l'opérateur - & gt; suivi du chemin d'accès à l'élément JSON souhaité.
json_extract, json_set et json_objectagg et autres fonctions json vous permettent de filtrer, modifier, agréger et traiter les données JSON. Vous pouvez également utiliser la clause où filtrer les lignes en fonction des valeurs JSON. La fonctionnalité JSON de MySQL fournit un moyen flexible d'interagir et de manipuler les objets JSON directement dans les requêtes de base de données.
Quand dois-je utiliser JSON dans MySQL?
Vous devriez utiliser JSON dans MySQL dans les circonstances suivantes:
Cependant, évitez d'utiliser JSON quand:
Comment stocker les données JSON dans MySQL?
Pour stocker les données JSON dans MySQL, vous avez deux options principales. Tout d'abord, vous pouvez utiliser le type de données JSON introduit dans MySQL pour créer une table avec des colonnes JSON. Cette méthode fournit un stockage structuré et de meilleures performances de requête pour les données JSON.
Alternativement, vous pouvez stocker les données JSON en tant que texte dans les colonnes VARCHAR ou Texte ordinaires. Cette méthode s'applique lorsqu'il est principalement nécessaire de stocker et de récupérer les données JSON sans opérations de base de données complexes.
Comment indexer les données JSON dans MySQL?
Bien que vous ne puissiez pas indexer directement les colonnes JSON, MySQL vous permet de créer des index de fonction sur les colonnes générées dérivées de valeurs JSON.
par exemple, pour indexer le premier élément du tableau JSON:
<code class="language-sql">CREATE TABLE `book` ( `id` MEDIUMINT() UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(200) NOT NULL, `tags` JSON DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB;</code>
Cette méthode améliore les performances de la requête pour les chemins JSON fréquemment accessibles.
Pour les données JSON, devriez-vous utiliser la base de données MySQL ou NOSQL?
Cela dépend des exigences de votre projet:
La prise en charge JSON de MySQL est idéale pour les charges de travail hybrides, mais ce n'est pas un remplacement complet pour les bases de données NoSQL spécifiquement pour le stockage de documents.
Comment extraire des valeurs spécifiques du champ MySQL JSON?
Pour extraire une valeur spécifique du champ MySQL JSON, utilisez la fonction JSON_Extract () ou l'opérateur Abréviation - & gt;
<code class="language-sql">ALTER TABLE book ADD COLUMN first_tag VARCHAR(50) AS (JSON_UNQUOTE(tags->'$[0]')), ADD INDEX idx_first_tag (first_tag);</code>
Comment interroger et filtrer les données dans les champs MySQL JSON?
Pour interroger et filtrer les données stockées dans les champs MySQL JSON, vous pouvez utiliser des fonctions telles que JSON_CONTAINS () et JSON_SEARCH (). Vous pouvez également utiliser JSON_Extract () pour récupérer des valeurs spécifiques pour un filtrage supplémentaire.
<code class="language-sql">INSERT INTO `book` (`title`, `tags`) VALUES ( 'ECMAScript 2015: A SitePoint Anthology', '["JavaScript", "ES2015", "JSON"]' );</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!