Stocker des données dans MySQL au format JSON

121

Je pensais que c'était une chose n00b à faire. Et donc, je ne l'ai jamais fait. Ensuite, j'ai vu que FriendFeed a fait cela et a en fait amélioré son échelle de base de données et réduit la latence. Je suis curieux de savoir si je devrais faire ça. Et, si oui, quelle est la bonne façon de le faire?

En gros, quel est le bon endroit pour apprendre à tout stocker dans MySQL comme une sorte de base de données CouchDB? Tout stocker au format JSON semble être plus facile et plus rapide (ne pas créer, moins de latence).

De plus, est-il facile de modifier, supprimer, etc., des éléments stockés au format JSON sur la base de données?

Oscar Godson
la source
Pour référence, je crois que c'est la discussion de FriendFeed sur l'utilisation de JSON dans MySQL: backchannel.org/blog/friendfeed-schemaless-mysql
dimo414
10
MySQL 5.7 prend désormais en charge une banque de données JSON native.
eecue

Réponses:

57

CouchDB et MySQL sont deux bêtes très différentes. JSON est le moyen natif de stocker des éléments dans CouchDB. Dans MySQL, le mieux que vous puissiez faire est de stocker les données JSON sous forme de texte dans un seul champ. Cela irait totalement à l'encontre de l'objectif de le stocker dans un SGBDR et compliquerait considérablement chaque transaction de base de données.

Ne fais pas ça.

Cela dit, FriendFeed semblait utiliser un schéma extrêmement personnalisé en plus de MySQL. Cela dépend vraiment de ce que vous voulez stocker exactement, il n'y a guère de réponse définitive sur la façon d'abuser d'un système de base de données, donc cela a du sens pour vous. Étant donné que l'article est très ancien et que leur principale raison contre Mongo et Couch était l'immaturité, je réévaluerais ces deux éléments si MySQL ne le coupe pas pour vous. Ils devraient avoir beaucoup grandi maintenant.

déceler
la source
3
Oui, je regarde Mongo, et php a une extension pour cela et la syntaxe réelle des transactions DB semble plus facile que MySQL et le travail global avec il semble plus facile que couchDB. Merci, je pense que je vais aller avec MongoDB :)
Oscar Godson
67
Il existe certainement des cas valides pour stocker des objets blob JSON dans un SGBDR. Si vous souhaitez simplement stocker et récupérer des objets blob opaques de données JSON sans avoir besoin d'interroger ces données, ce qui se produit assez souvent dans certains scénarios, vous pouvez très bien le faire.
markus
9
@markus Je le fais en fait sur l'un de mes sites Web, en particulier les champs d'un formulaire compliqué qui ne sont jamais recherchés directement dans les requêtes MySQL, mais utilisés lors de la visualisation de formulaires (soit à partir d'une vue de table ou directement via un lien). Ce n'est probablement pas l'idéal, mais cela rend certainement la mise en œuvre beaucoup plus rapide et supprime le besoin d'un nombre exorbitant de tables ou de colonnes de table.
Nick Bedford
1
Si vous souhaitez disposer à la fois d'un SGBDR et d'un stockage de type de document pour votre application, c'est une bonne approche pour ne pas avoir à gérer plusieurs bases de données.
rjarmstrong le
5
C'est un conseil assez court, peut-être par quelqu'un qui passe beaucoup trop de temps sur l'échange de piles? Lorsque j'ai un enregistrement avec 100 champs que je veux stocker et que je n'ai besoin de rechercher que sur 3 ou 4 des champs, créer une table avec 100 champs n'a pas de sens. Vous pouvez stocker un enregistrement client avec l'intégralité de son carnet d'adresses stocké dans 1 champ dans JSON, et ajouter simplement l'ID client, le nom de famille, l'entreprise comme autres champs à utiliser pour rechercher des enregistrements. C'est un. un gain de temps énorme.
Danial
102

Tout le monde qui commente semble venir du mauvais angle, il est bon de stocker du code JSON via PHP dans une base de données relationnelle et il sera en fait plus rapide de charger et d'afficher des données complexes comme celle-ci, mais vous aurez des considérations de conception telles que recherche, indexation, etc.

La meilleure façon de faire est d'utiliser des données hybrides, par exemple si vous devez effectuer une recherche basée sur datetime MySQL (optimisé pour les performances) va être beaucoup plus rapide que PHP et pour quelque chose comme la recherche de la distance des lieux, MySQL devrait également être beaucoup plus rapide (remarquez que la recherche n'accède pas). Les données sur lesquelles vous n'avez pas besoin de rechercher peuvent ensuite être stockées au format JSON, BLOB ou tout autre format que vous jugez vraiment nécessaire.

Les données auxquelles vous devez accéder sont très facilement stockées au format JSON, par exemple un système de facturation de base par cas. Ils ne bénéficient pas du tout du SGBDR et pourraient être stockés dans JSON simplement par json_encoding ($ _ POST ['entires']) si vous avez la bonne structure de formulaire HTML.

Je suis heureux que vous soyez heureux d'utiliser MongoDB et j'espère que cela continuera à bien vous servir, mais ne pensez pas que MySQL sera toujours hors de votre radar, car votre application augmente en complexité, vous pourriez bien avoir besoin d'un SGBDR pour certaines fonctionnalités et fonctionnalités (même s'il s'agit simplement de retirer des données archivées ou des rapports commerciaux)

Lewis Richard Phillip Cowles
la source
8
-1 pour "il est bon de stocker du code JSON via PHP dans une base de données relationnelle" - Le stockage de JSON (qui peut représenter une entité entière sous forme de données non atomiques) dans un seul champ viole le modèle relationnel et empêche 1NF. De plus, ne faites pas de déclarations radicales sur les performances sans mesures pour vous soutenir.
Sage Gerard
80
Comme mentionné, cela dépend de ce que vous stockez, c'est-à-dire que pour une facture, avez-vous vraiment besoin de stocker chaque entrée séparément? NON, votre commentaire apparaît comme vous en savez tant mais 1NF n'est pas pour tous les champs ou il n'y aurait pas de types BLOB et texte ... c'est un pur non-sens pour un système de production, il vous suffit d'optimiser ce dont vous avez besoin pour rechercher c'est-à-dire des dates, des clés et des index de configuration sur certaines données. Je n'ai pas dit tout stocker en JSON, j'ai dit stocker certaines données en JSON si cela aide à résoudre votre problème.
Lewis Richard Phillip Cowles
2
Ce que vous dites est possible et pratique, mais s'écarter de relations bien formées signifie faire plus de travail pour accommoder et maintenir ces écarts. Bastardiser le modèle relationnel nécessite une meilleure justification que ce que vous avez fourni. Voir Traitement de la base de données par Kroenke et Auer pour plus d'informations sur les complications liées à votre réponse, car elles concernent l'utilisation abusive d'attributs dans les relations.
Sage Gerard
29
Vous supposez que je n'ai pas consulté un DBA sur cette question et que je ne comprends pas ce que vous dites. Je ne suis pas tenu au courant des implications exactes de cela, à la fois pour les petits systèmes et plus tard, mais ce que je dis, c'est que vous vous trompez et que la recherche que vous indiquez est ancienne et n'utilise pas notre application. stratégie. Son tout simplement faux, et les problèmes résiduels dans les mauvaises mises en œuvre de ce processus. Par exemple, je ne dis pas avoir un seul modèle ou ne pas utiliser de SGBDR, je dis être intelligent sur les endroits où vous utilisez le SGBDR et là où vous n'en avez pas besoin.
Lewis Richard Phillip Cowles
6
C'était la meilleure réponse de mon expérience. Vous pouvez utiliser le SGBDR mais stocker JSON uniquement dans des situations spécifiques si vous savez ce que vous faites. En fait, je l'ai beaucoup utilisé pour le stockage en cache temporaire des données de la baie et dans d'autres situations où vous obtenez un résultat plus rapide et moins de code. De nombreux projets ont en réalité des caractéristiques mitigées.
Heroselohim
72

MySQL 5.7 prend désormais en charge un type de données JSON natif similaire à MongoDB et à d'autres magasins de données de documents sans schéma:

Prise en charge JSON

À partir de MySQL 5.7.8, MySQL prend en charge un type JSON natif. Les valeurs JSON ne sont pas stockées sous forme de chaînes, mais en utilisant un format binaire interne qui permet un accès en lecture rapide aux éléments du document. Les documents JSON stockés dans les colonnes JSON sont automatiquement validés chaque fois qu'ils sont insérés ou mis à jour, un document non valide produisant une erreur. Les documents JSON sont normalisés à la création et peuvent être comparés à l'aide de la plupart des opérateurs de comparaison tels que =, <, <=,>,> =, <>,! = Et <=>; pour plus d'informations sur les opérateurs pris en charge ainsi que sur la priorité et les autres règles suivies par MySQL lors de la comparaison des valeurs JSON, consultez Comparaison et classement des valeurs JSON.

MySQL 5.7.8 introduit également un certain nombre de fonctions pour travailler avec des valeurs JSON. Ces fonctions incluent celles répertoriées ici:

  1. Fonctions qui créent des valeurs JSON: JSON_ARRAY (), JSON_MERGE () et JSON_OBJECT (). Reportez-vous à la Section 12.16.2, «Fonctions qui créent des valeurs JSON».
  2. Fonctions qui recherchent les valeurs JSON: JSON_CONTAINS (), JSON_CONTAINS_PATH (), JSON_EXTRACT (), JSON_KEYS () et JSON_SEARCH (). See Section 12.16.3, «Fonctions qui recherchent des valeurs JSON».
  3. Fonctions qui modifient les valeurs JSON: JSON_APPEND (), JSON_ARRAY_APPEND (), JSON_ARRAY_INSERT (), JSON_INSERT (), JSON_QUOTE (), JSON_REMOVE (), JSON_REPLACE (), JSON_SET () et JSON_UNQUOTE (). Reportez-vous à la Section 12.16.4, «Fonctions qui modifient les valeurs JSON».
  4. Fonctions qui fournissent des informations sur les valeurs JSON: JSON_DEPTH (), JSON_LENGTH (), JSON_TYPE () et JSON_VALID (). See Section 12.16.5, «Fonctions qui renvoient des attributs de valeur JSON».

Dans MySQL 5.7.9 et versions ultérieures, vous pouvez utiliser colonne-> chemin comme raccourci pour JSON_EXTRACT (colonne, chemin). Cela fonctionne comme un alias pour une colonne partout où un identificateur de colonne peut apparaître dans une instruction SQL, y compris les clauses WHERE, ORDER BY et GROUP BY. Cela inclut SELECT, UPDATE, DELETE, CREATE TABLE et d'autres instructions SQL. Le côté gauche doit être un identificateur de colonne JSON (et non un alias). Le côté droit est une expression de chemin JSON entre guillemets qui est évaluée par rapport au document JSON renvoyé en tant que valeur de colonne.

Voir Section 12.16.3, «Fonctions qui recherchent des valeurs JSON», pour plus d'informations sur -> et JSON_EXTRACT (). Pour plus d'informations sur la prise en charge des chemins JSON dans MySQL 5.7, consultez Recherche et modification des valeurs JSON. Voir aussi Index secondaires et Colonnes générées virtuelles.

Plus d'informations:

https://dev.mysql.com/doc/refman/5.7/en/json.html

eecue
la source
26

les caractères json n'ont rien de spécial en ce qui concerne le stockage, des caractères tels que

{, }, [, ], ', a-z,0-9 .... sont vraiment rien de spécial et peut être stocké sous forme de texte.

le premier problème que tu vas avoir est celui-ci

{profile_id: 22, nom d'utilisateur: 'Robert', mot de passe: 'skhgeeht893htgn34ythg9er'}

qui stocké dans une base de données n'est pas si simple à mettre à jour à moins que vous n'ayez votre propre procédure et développé un jsondecode pour mysql

UPDATE users SET JSON(user_data,'username') = 'New User';

Donc, comme vous ne pouvez pas faire cela, vous devriez d'abord sélectionner le json, le décoder, le changer, le mettre à jour, donc en théorie, vous pourriez aussi bien passer plus de temps à construire une structure de base de données appropriée!

J'utilise json pour stocker des données, mais uniquement des métadonnées, des données qui ne sont pas mises à jour souvent, qui ne sont pas liées à l'utilisateur spécifique .. exemple si un utilisateur ajoute un message, et dans ce message, il ajoute des images mal analyser les images et créer des pouces et puis utilisez les URL du pouce au format json.

RobertPitt
la source
Est-il suffisant de stocker la chaîne json dans la base de données, lorsque je ne la mets pas à jour du tout? Je veux juste effectuer une recherche normale sur les données json en utilisant LIKE. Je vois que même Wordpress stocke les métadonnées du plugin sous forme de chaîne json dans la base de données.
shasi kanth
@shasikanth, si vous recherchez des valeurs dans les données JSON, je rechercherais une meilleure approche
Kirby
15

Pour illustrer à quel point il est difficile d'obtenir des données JSON à l'aide d'une requête, je vais partager la requête que j'ai faite pour gérer cela.

Il ne prend pas en compte les tableaux ou autres objets, juste les types de données de base. Vous devez remplacer les 4 instances de la colonne par le nom de la colonne stockant le JSON et les 4 instances de myfield par le champ JSON auquel vous souhaitez accéder.

SELECT
    SUBSTRING(
        REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', ''),
        LOCATE(
            CONCAT('myfield', ':'),
            REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', '')
        ) + CHAR_LENGTH(CONCAT('myfield', ':')),
        LOCATE(
            ',',
            SUBSTRING(
                REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', ''),
                LOCATE(
                    CONCAT('myfield', ':'),
                    REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', '')
                ) + CHAR_LENGTH(CONCAT('myfield', ':'))
            )
        ) - 1
    )
    AS myfield
FROM mytable WHERE id = '3435'
Jorjon
la source
5
Vous n'interrogeriez pas ce côté serveur. Ce serait de stocker un objet blob et de le récupérer côté client. Vous utiliseriez alors simplement JS pour l'interroger. C'était il y a longtemps tho :) J'ai depuis déménagé à MongoDB pour ce truc :) Votez pour cette jolie requête tho.
Oscar Godson
Je pense que c'est une question de savoir si la personne va accéder régulièrement à ces données JSON. Dans l'exemple, je déplace les en-têtes non essentiels dans un tableau, je les analyse en JSON, puis je les stocke. Quand je récupérerai le JSON (pour les rares requêtes AJAX extra-headers), je vais simplement extraire de MySQL, lire le JSON dans un tableau et faire écho aux en-têtes. Pour quelque chose de plus gourmand en données, il ne devrait probablement pas être stocké au format JSON.
John
10

Cela dépend vraiment de votre cas d'utilisation. Si vous stockez des informations qui n'ont absolument aucune valeur dans les rapports et qui ne seront pas interrogées via des JOIN avec d'autres tables, il peut être judicieux pour vous de stocker vos données dans un champ de texte unique, codé en JSON.

Cela pourrait grandement simplifier votre modèle de données. Cependant, comme mentionné par RobertPitt, ne vous attendez pas à pouvoir combiner ces données avec d'autres données qui ont été normalisées.

Phil LaNasa
la source
2
Mes pensées exactement. Si ses données ne sont jamais jointes / recherchées ou même rarement mises à jour, pourquoi ne pas utiliser json dans un champ TEXT. Un bon exemple de ceci est un tableau des éléments alimentaires où chaque élément alimentaire aurait besoin de stocker les informations nutritionnelles. Portion, protien, glucides, lipides totaux, gras saturés, etc. Mais non seulement cela, vous auriez besoin de stocker la valeur (0,2) et l'unité dans laquelle elle a été mesurée (g, oz, fl oz, ml). Étant donné que ce sont des données qui (selon ce que vous faites, je suppose) n'ont pas besoin d'être recherchées, je dirais que 1 TEXT vs 16 colonnes int / varchar / enum est un bon compromis.
Brad Moore
Exactement!!! C'est utile lorsque vous devez stocker des variables et / ou une structure de données inconnue que vous ne prévoyez pas du tout de filtrer avec SQL. Les données sont simplement stockées telles quelles et quelqu'un d'autre (code de l'application) peut connaître la structure et ce qu'il faut en faire.
Delmo
9

C'est une vieille question, mais je peux toujours la voir en haut des résultats de recherche de Google, donc je suppose qu'il serait utile d'ajouter une nouvelle réponse 4 ans après que la question soit posée.

Tout d'abord, il existe une meilleure prise en charge du stockage de JSON dans le SGBDR. Vous pouvez envisager de passer à PostgreSQL (bien que MySQL prenne en charge JSON depuis la version 5.7.7). PostgreSQL utilise des commandes SQL très similaires à MySQL sauf qu'elles prennent en charge plus de fonctions. L'une des fonctions qu'ils ont ajoutées est qu'elles fournissent le type de données JSON et vous pouvez maintenant interroger le JSON stocké. ( Quelques références à ce sujet ) Si vous ne créez pas la requête directement dans votre programme, par exemple en utilisant PDO en php ou éloquent en Laravel, tout ce que vous avez à faire est simplement d'installer PostgreSQL sur votre serveur et de modifier les paramètres de connexion à la base de données. Vous n'avez même pas besoin de changer votre code.

La plupart du temps, comme le suggèrent les autres réponses, stocker des données au format JSON directement dans le SGBDR n'est pas une bonne idée. Il y a cependant quelques exceptions. Une situation à laquelle je peux penser est un champ avec un nombre variable d'entrées liées.

Par exemple, pour stocker la balise d'un article de blog, vous aurez normalement besoin d'un tableau pour l'article de blog, d'un tableau de balises et d'un tableau correspondant. Ainsi, lorsque l'utilisateur souhaite modifier un message et que vous devez afficher la balise associée à ce message, vous devrez interroger 3 tables. Cela endommagera beaucoup les performances si votre table / table de balises correspondante est longue.

En stockant les balises au format JSON dans la table des articles de blog, la même action ne nécessite qu'une seule recherche de table. L'utilisateur pourra alors voir l'article de blog à éditer plus rapidement, mais cela nuira aux performances si vous souhaitez faire un rapport sur l'article lié à une balise, ou peut-être effectuer une recherche par tag.

Vous pouvez également essayer de dé-normaliser la base de données. En dupliquant les données et en stockant les données dans les deux sens, vous pouvez bénéficier des deux méthodes. Vous aurez juste besoin d'un peu plus de temps pour stocker vos données et de plus d'espace de stockage (ce qui est bon marché par rapport au coût d'une plus grande puissance de calcul)

cytsunny
la source
8

Je dirais que les deux seules raisons d'envisager cela sont:

  • les performances ne sont tout simplement pas assez bonnes avec une approche normalisée
  • vous ne pouvez pas facilement modéliser vos données particulièrement fluides / flexibles / changeantes

J'ai écrit un peu sur ma propre approche ici:

Quels problèmes d'évolutivité avez-vous rencontrés lors de l'utilisation d'un magasin de données NoSQL?

(voir la première réponse)

Même JSON n'était pas assez rapide, nous avons donc utilisé une approche de format de texte personnalisé. A travaillé / continue de bien fonctionner pour nous.

Y a-t-il une raison pour laquelle vous n'utilisez pas quelque chose comme MongoDB? (peut-être que MySQL est "requis"; juste curieux)

Brian
la source
6

Il me semble que tout le monde qui répond à cette question manque le seul problème critique, à l'exception de @deceze - utiliser le bon outil pour le travail . Vous pouvez forcer une base de données relationnelle à stocker presque tous les types de données et vous pouvez forcer Mongo à gérer des données relationnelles, mais à quel prix? Vous finissez par introduire de la complexité à tous les niveaux de développement et de maintenance, de la conception du schéma au code d'application; sans parler du succès des performances.

En 2014, nous avons accès à de nombreux serveurs de bases de données qui gèrent exceptionnellement bien des types de données spécifiques.

  • Mongo (stockage de documents)
  • Redis (stockage de données clé-valeur)
  • MySQL / Maria / PostgreSQL / Oracle / etc (données relationnelles)
  • CouchDB (JSON)

Je suis sûr que j'en ai manqué d'autres, comme RabbirMQ et Cassandra. Mon point est d'utiliser le bon outil pour les données que vous devez stocker.

Si votre application nécessite le stockage et la récupération d'une variété de données vraiment, très rapidement (et qui ne le fait pas), n'hésitez pas à utiliser plusieurs sources de données pour une application. Les frameworks Web les plus populaires prennent en charge plusieurs sources de données (Rails, Django, Grails, Cake, Zend, etc.). Cette stratégie limite la complexité à un domaine spécifique de l'application, l'ORM ou l'interface de source de données de l'application.

CheddarMonkey
la source
1
À votre avis, RabbitMQ est un serveur de base de données ou une sorte de? Je dirais que c'est un middleware orienté message avec une jolie petite fonction de persistance pour ne pas perdre de messages, mais rien avec lequel je ne sauverais de données. Juste mes deux cents.
Osiriz
@Osiriz: Vous avez raison. Je n'aurais probablement pas dû l'inclure dans cette discussion.
CheddarMonkey
5

Voici une fonction qui permettrait de sauvegarder / mettre à jour les clés d'un tableau JSON dans une colonne et une autre fonction qui récupère les valeurs JSON. Ces fonctions sont créées en supposant que le nom de la colonne de stockage du tableau JSON est json . Il utilise PDO .

Fonction de sauvegarde / mise à jour

function save($uid, $key, $val){
 global $dbh; // The PDO object
 $sql = $dbh->prepare("SELECT `json` FROM users WHERE `id`=?");
 $sql->execute(array($uid));
 $data      = $sql->fetch();
 $arr       = json_decode($data['json'],true);
 $arr[$key] = $val; // Update the value
 $sql=$dbh->prepare("UPDATE `users` SET `json`=? WHERE `id`=?");
 $sql->execute(array(
   json_encode($arr), 
   $uid
 ));
}

$ uid est l'identifiant de l'utilisateur, $ key - la clé JSON à mettre à jour et sa valeur est mentionnée comme $ val .

Fonction Get Value

function get($uid, $key){
 global $dbh;
 $sql = $dbh->prepare("SELECT `json` FROM `users` WHERE `id`=?");
 $sql->execute(array($uid));
 $data = $sql->fetch();
 $arr  = json_decode($data['json'], true);
 return $arr[$key];
}

$ key est une clé du tableau JSON dont nous avons besoin de la valeur.

Subin
la source
1
Cela échoue dans les cas de conflit, que se passe-t-il si le json que vous venez de lire, est mis à jour par un autre processus, puis que vous enregistrez le json dans le thread actuel en l'écrasant? Vous pourriez avoir besoin de verrous SELECT FOR UPDATEou de versions dans les données json.
DhruvPathak
@DhruvPathak Pouvez-vous s'il vous plaît mettre à jour la réponse en utilisant SELECT FOR UPDATEpour qu'elle soit plus meilleure. Je ne sais pas comment m'en servir.
Subin le
3

La prise en charge précoce du stockage de JSON dans MySQL a été ajoutée à la version MySQL 5.7.7 JSON labs ( binaires Linux , source )! La version semble être issue d'une série de fonctions définies par l'utilisateur liées à JSON et rendues publiques en 2013 .

Ce support JSON natif naissant semble se diriger dans une direction très positive, y compris la validation JSON sur INSERT, un format de stockage binaire optimisé comprenant une table de recherche dans le préambule qui permet à la fonction JSN_EXTRACT d'effectuer des recherches binaires plutôt que d'analyser à chaque accès. Il existe également toute une série de nouvelles fonctions pour gérer et interroger des types de données JSON spécifiques:

CREATE TABLE users (id INT, preferences JSON);

INSERT INTO users VALUES (1, JSN_OBJECT('showSideBar', true, 'fontSize', 12));

SELECT JSN_EXTRACT(preferences, '$.showSideBar') from users;

+--------------------------------------------------+
| id   | JSN_EXTRACT(preferences, '$.showSideBar') |
+--------------------------------------------------+
| 1    | true                                      |
+--------------------------------------------------+

IMHO, ce qui précède est un excellent cas d'utilisation pour cette nouvelle fonctionnalité; de nombreuses bases de données SQL ont déjà une table utilisateur et, plutôt que de faire des changements de schéma sans fin pour s'adapter à un ensemble évolutif de préférences utilisateur, avoir une seule colonne JSON à une seule JOINdistance est parfait. D'autant qu'il est peu probable qu'il ait jamais besoin d'être interrogé pour des éléments individuels.

Bien qu'il n'en soit encore qu'à ses débuts, l'équipe du serveur MySQL fait un excellent travail pour communiquer les changements sur le blog .

Pollock riche
la source
2

Je pense que le stockage de JSON dans une base de données mysql va en fait à l'encontre de l'objectif de l'utilisation du SGBDR tel qu'il est destiné à être utilisé. Je ne l'utiliserais dans aucune donnée qui serait manipulée à un moment donné ou rapportée, car elle ajoute non seulement de la complexité, mais pourrait également avoir un impact sur les performances en fonction de la façon dont elle est utilisée.

Cependant, j'étais curieux de savoir si quelqu'un d'autre pensait à une raison possible de faire cela. Je pensais faire une exception à des fins de journalisation. Dans mon cas, je souhaite enregistrer les demandes qui ont une quantité variable de paramètres et d'erreurs. Dans cette situation, je souhaite utiliser des tables pour le type de requêtes et les requêtes elles-mêmes avec une chaîne JSON de différentes valeurs obtenues.

Dans la situation ci-dessus, les demandes sont journalisées et jamais manipulées ou indexées dans le champ de chaîne JSON. CEPENDANT, dans un environnement plus complexe, j'essaierais probablement d'utiliser quelque chose qui a plus d'intention pour ce type de données et de le stocker avec ce système. Comme d'autres l'ont dit, cela dépend vraiment de ce que vous essayez d'accomplir, mais le respect des normes contribue toujours à la longévité et à la fiabilité!

marque
la source
2

JSON est également un type de données valide dans la base de données PostgreSQL. Cependant, la base de données MySQL n'a pas encore officiellement pris en charge JSON. Mais c'est de la cuisson: http://mysqlserverteam.com/json-labs-release-native-json-data-type-and-binary-format/

Je conviens également qu'il existe de nombreux cas valides où certaines données sont mieux sérialisées en une chaîne dans une base de données. La raison principale peut être lorsqu'elle n'est pas régulièrement interrogée et que son propre schéma peut changer - vous ne voulez pas changer le schéma de base de données correspondant à cela. La deuxième raison est que lorsque la chaîne sérialisée provient directement de sources externes, il se peut que vous ne souhaitiez pas toutes les analyser et les alimenter à tout prix jusqu'à ce que vous en utilisiez. J'attendrai donc que la nouvelle version de MySQL prenne en charge JSON, car il sera alors plus facile de basculer entre différentes bases de données.

Cerise Qianyu Liu
la source
1

J'utilise json pour enregistrer n'importe quoi pour un projet, j'utilise trois tables en fait! un pour les données en json, un pour l'index de chaque métadonnée de la structure json (chaque méta est encodée par un identifiant unique), et un pour l'utilisateur de session, c'est tout. Le benchmark ne peut pas être quantifié à cet état précoce du code, mais par exemple j'étais des vues utilisateur (jointure interne avec index) pour obtenir une catégorie (ou quoi que ce soit, en tant qu'utilisateur, ...), et c'était très lent (très très lent , la vue utilisée dans mysql n'est pas la bonne façon). Le module de recherche, dans cette structure, peut faire tout ce que je veux, mais je pense que mongodb sera plus efficace dans ce concept d'enregistrement de données json complet. Pour mon exemple, j'utilise des vues pour créer un arbre de catégorie, et du fil d'Ariane, mon dieu! tant de requêtes à faire! apache lui-même parti! et, en fait, pour ce petit site Web, j'utilise un php qui génère des arbres et du fil d'Ariane, l'extraction des données se fait par le module de recherche (qui n'utilise que l'index), la table de données n'est utilisée que pour la mise à jour. Si je veux, je peux détruire tous les index, et les régénérer avec chaque donnée, et faire le travail inverse pour, comme, détruire toutes les données (json) et les régénérer uniquement avec la table d'index. Mon projet est jeune, fonctionnant sous php et mysql, mais, parfois, j'utilise node js et mongodb sera plus efficace pour ce projet.

Utilisez json si vous pensez que vous pouvez le faire, juste pour le faire, parce que vous le pouvez! et oubliez-le si c'était une erreur; essayez de faire un bon ou un mauvais choix, mais essayez!

Faible

un utilisateur français

faible
la source
1
Je n'ai pas compris. Je ne parle pas anglais de manière native, mais je vous recommande d'utiliser des points (.), Des virgules (,) et des paragraphes (la touche Entrée) pour organiser vos idées. Ensuite, alors seulement, essayez d'organiser une base de données ;-)
Diego Jancic
Vous avez raison, réponse confuse en fait, doit être plus explicite en montrant l'exemple. Mais, si mysql peut être remplacé par mongoDB, il sera plus efficace d'utiliser json (en natif pour mongodb), si mysql est obligatoire, ok, réessayons dans quelques jours!
bas le
1

Je sais que c'est vraiment tard, mais j'ai eu une situation similaire où j'ai utilisé une approche hybride de maintien des normes SGBDR de normalisation des tables jusqu'à un certain point, puis de stockage des données dans JSON en tant que valeur de texte au-delà de ce point. Donc par exemple je stocke les données dans 4 tableaux suivant les règles de normalisation du SGBDR. Cependant, dans le 4ème tableau pour accueillir le schéma dynamique, je stocke les données au format JSON. Chaque fois que je veux récupérer des données, je récupère les données JSON, les analyse et les affiche en Java. Cela a fonctionné pour moi jusqu'à présent et pour garantir que je suis toujours en mesure d'indexer les champs que je transforme en données json dans la table de manière normalisée à l'aide d'un ETL. Cela garantit que pendant que l'utilisateur travaille sur l'application, il fait face à un décalage minimal et que les champs sont transformés en un format convivial SGBDR pour l'analyse des données, etc.

prashant
la source
0

Vous pouvez utiliser l'essentiel: https://gist.github.com/AminaG/33d90cb99c26298c48f670b8ffac39c3

Après l'avoir installé sur le serveur (juste besoin du privilège root pas super), vous pouvez faire quelque chose comme ceci:

select extract_json_value('{"a":["a","2"]}','(/a)')

Il reviendra a 2 Vous pouvez renvoyer n'importe quoi à l'intérieur de JSON en utilisant ceci La bonne partie est qu'il prend en charge MySQL 5.1,5.2,5.6. Et vous n'avez pas besoin d'installer de binaire sur le serveur.

Basé sur un ancien projet common-schema, mais il fonctionne toujours aujourd'hui https://code.google.com/archive/p/common-schema/

Aminadav Glickshtein
la source
l'essentiel est maintenant 404
neoDev