web-dev-qa-db-fra.com

Ce qui est préférable pour l'évolutivité de la base de données à long terme: Ajout de colonnes ou avoir une boutique de clé / valeur

Pour l'application, qui compte peu (5-10) paramètres pour le moment, mais aura beaucoup plus (jusqu'à 100) à l'avenir, ce qui serait une meilleure approche:

  1. pour ajouter de nouvelles colonnes à la table des paramètres chaque fois que le nouveau paramètre est introduit
  2. pour avoir des paramètres sous forme de stockage clé/valeur

Considérez que la demande peut avoir des millions d'instances (qui sont toutes exécutées sur le même dB et utilisent la même table pour les paramètres), DB pourrait être fragile. DB est relationnel, c'est-à-dire mysql ou t-SQL.

En tant que développeur, je préférerais la 2e variante, je pourrais donc évoluer l'application sans modifier le schéma de base de données et ajouter/supprimer des paramètres à volonté. Pour autant que je sache avoir plusieurs millions d'enregistrements dans une seule table ne devrait pas être un problème si l'index est regroupé sur l'instance d'application. Y a-t-il des inconvénients que je ne suis pas au courant?

Et qu'en est-il de la 1ère variante? Y a-t-il de gros avantages? Et qu'en est-il du nombre de colonnes: y a-t-il une limite théorique des colonnes que la table peut avoir? Que s'est-il passé si j'avais une table avec 1000 (10 000, 1000 000 000) colonnes? Cela serait-il lent?

4
valentinas

L'option 2 est connue sous le nom de "EAV" ou valeur d'entité-attribut

  • non relationnel
  • pas de contraintes de niveau DB
  • nécessite des contorsions de lire les données que si une liste simple

Mais cela dépend de ce que vous entendez par "Paramètres". Si vous avez quelques 1000 lignes qui ne sont pas des objets et ne nécessitent pas de contraintes, utilisez ce modèle. C'est ce que fait SQL Server avec Sys.Configurations

Si vous essayez d'avoir un "schéma flexible" qui puisse stocker quoi que ce soit, alors tout simplement pas . Cela se terminera par des larmes. Voir aussi questions EAV ici sur dba.se

Notez que "les colonnes supplémentaires" (option 1) vous permet de définir les défauts et la sécurité de données-sécurité, tandis que "l'absence de ligne" (option 2) nécessite une valeur par défaut à enregistrer dans le code et tout est une chaîne dans la base de données.

"Ça dépend"

6
gbn