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

Y a-t-il un avantage/inconvénient à stocker la valeur du champ sous forme de tableau JSON plutôt que de créer une nouvelle table et une relation un-à-plusieurs entre eux ?

D'après mon expérience, cela dépend à peu près des données qui sont stockées. Les deux manières ont des avantages et des inconvénients. S'il s'agit d'un MMORPG webgame puis dites que vous avez un PC qui a une ceinture. Et le PJ peut mettre des potions dans cette ceinture pour un accès rapide pendant une bataille. Nous voulons donc enregistrer les identifiants des potions, qui sont stockés dans la ceinture du personnage.

La demande la plus courante serait "obtenir toutes les potions que possède le personnage X". Et cela irait assez vite dans les deux cas.

Les avantages de stocker ces identifiants de potion dans un tableau séparé :

  • Vous pouvez rechercher un identifiant de potion spécifique et c'est très rapide. Exemple dans le jeu :les administrateurs ont supprimé une potion du jeu et vous devez donc mettre à jour les ceintures de tout le monde
  • Vous pouvez obtenir de belles statistiques. Exemple en jeu :recherchez la potion la plus utilisée parmi tous les joueurs
  • La base de données maintiendra l'intégrité des données. Exemple dans le jeu :vous ne rencontrerez jamais une situation où vous avez utilisé la potion et le jeu dit "Oups, une potion avec cet identifiant n'existe pas"
  • C'est bon pour la cohérence. Exemple dans le jeu :vous avez pris une potion de la ceinture et l'avez mise dans le sac à dos. Le jeu peut l'implémenter en appelant une transaction avec deux simples instructions SQL claires.
  • Vous pouvez faire des JOIN. Exemple dans le jeu :nous devons obtenir une liste des potions dans la ceinture avec leurs noms, poids et images qui sont stockés dans le tableau séparé.
  • Vous pouvez mettre à jour un seul élément, sans avoir à mettre à jour toute la ceinture. Exemple forcé dans le jeu :vous avez un million de potions dans votre ceinture et vous en avez bu une.

Les avantages du stockage au format JSON :

  • S'il s'agit d'un jeu par navigateur qui utilise javascript côté client, vous obtenez l'objet Belt json avec une simple requête au lieu de faire Select-query puis de le convertir en json
  • Il est beaucoup plus facile de maintenir l'ordre des éléments, puisque les tableaux json sont déjà commandés. Avec l'approche par table, vous auriez besoin d'une colonne supplémentaire appelée "commande" et mettez-la à jour à chaque fois et vérifiez si deux articles n'ont pas la même commande, etc.
  • Vous pouvez faire un tas de réarrangements dans la ceinture côté client, puis cliquer sur "Appliquer" - boum, avec une seule requête, vous pouvez mettre à jour toute la ceinture. Alors qu'avec l'approche par table, vous auriez besoin d'au moins deux requêtes pour cela (DELETE + INSERT)
  • en plus, les SGBD populaires ont des plugins prenant en charge les fonctions json dans la base de données

En bout de ligne :ce ne sont pas majeures avantages et non critiques problèmes. Tous peuvent être résolus et avec une conception appropriée de l'application, les deux solutions fonctionneront correctement. Avant de décider comment stocker les données, demandez-vous quels sont les cas d'utilisation les plus courants pour ces données et choisissez la solution par la suite.