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

Stocker JSON dans la base de données par rapport à avoir une nouvelle colonne pour chaque clé

Mis à jour le 4 juin 2017

Étant donné que cette question/réponse a gagné en popularité, j'ai pensé qu'elle valait la peine d'être mise à jour.

Lorsque cette question a été initialement publiée, MySQL n'avait pas de support pour les types de données JSON et le support dans PostgreSQL en était à ses balbutiements. Depuis la version 5.7, MySQL prend désormais en charge un type de données JSON (dans un format de stockage binaire) et PostgreSQL JSONB a considérablement mûri. Les deux produits fournissent des types JSON performants qui peuvent stocker des documents arbitraires, y compris la prise en charge de l'indexation de clés spécifiques de l'objet JSON.

Cependant, je maintiens toujours ma déclaration d'origine selon laquelle votre préférence par défaut, lors de l'utilisation d'une base de données relationnelle, devrait toujours être colonne par valeur. Les bases de données relationnelles sont toujours construites sur l'hypothèse que les données qu'elles contiennent seront assez bien normalisées. Le planificateur de requêtes dispose de meilleures informations d'optimisation lorsqu'il examine les colonnes que lorsqu'il examine les clés dans un document JSON. Les clés étrangères peuvent être créées entre les colonnes (mais pas entre les clés dans les documents JSON). Important :si la majorité de votre schéma est suffisamment volatile pour justifier l'utilisation de JSON, vous voudrez peut-être au moins déterminer si une base de données relationnelle est le bon choix.

Cela dit, peu d'applications sont parfaitement relationnelles ou orientées document. La plupart des applications ont un mélange des deux. Voici quelques exemples où j'ai personnellement trouvé JSON utile dans une base de données relationnelle :

  • Lors du stockage des adresses e-mail et des numéros de téléphone d'un contact, où les stocker en tant que valeurs dans un tableau JSON est beaucoup plus facile à gérer que plusieurs tables séparées

  • Enregistrement des préférences utilisateur clé/valeur arbitraires (où la valeur peut être booléenne, textuelle ou numérique, et vous ne voulez pas avoir de colonnes séparées pour différents types de données)

  • Stocker des données de configuration sans schéma défini (si vous créez Zapier ou IFTTT et que vous devez stocker des données de configuration pour chaque intégration)

Je suis sûr qu'il y en a d'autres aussi, mais ce ne sont que quelques exemples rapides.

Réponse originale

Si vous voulez vraiment pouvoir ajouter autant de champs que vous le souhaitez sans limitation (autre qu'une limite de taille de document arbitraire), envisagez une solution NoSQL telle que MongoDB.

Pour les bases de données relationnelles :utilisez une colonne par valeur. Placer un blob JSON dans une colonne rend pratiquement impossible l'interrogation (et extrêmement lente lorsque vous trouvez une requête qui fonctionne).

Les bases de données relationnelles tirent parti des types de données lors de l'indexation et sont destinées à être implémentées avec un élément normalisé structure.

En remarque :cela ne veut pas dire que vous ne devriez jamais stocker JSON dans une base de données relationnelle. Si vous ajoutez de vraies métadonnées ou si votre JSON décrit des informations qui n'ont pas besoin d'être interrogées et n'est utilisé que pour l'affichage, il peut être exagéré de créer une colonne distincte pour tous les points de données.