Des attributs à valeurs multiples dans les bases de données Relationnelles?
Comment bien une idée sont les attributs à valeurs multiples dans une base de données relationnelle quand ils sont à être évoqué en détail?
Laissez-moi vous donner un exemple pour montrer ce que je veux dire. Supposons que j'ai le tableau suivant:
UserID Attribute1
User1 a,b,c
User2 x,y,z
User3 a,x,y
User4 c,b,z
[a,b,c,x,y,z are to be strings]
Il y a un autre utilisateur User5
à qui j'ai à faire quelques suggestions sur d'autres utilisateurs en fonction de si son Attribute1
correspond à l'un des 4 autres utilisateurs ou non.
[Graphique de bases de données, la tâche aurait été beaucoup plus facile que j'ai pu avoir créé plusieurs nœuds de l'utilisateur respectif à l'aide de la même relation.]
Maintenant, ce tableau est juste un micro-niveau d'abstraction de ce qu'est une base de données réelle va ressembler. Le nombre de lignes dans une table peut-être de centaines de milliers, voire des millions. Aussi, plusieurs valeurs peuvent en fait être beaucoup plus de 3. En dehors de cela, la base de données peut être sous une lourde charge, et dans cette situation, il peut y avoir quelques problèmes.
Sont des attributs à plusieurs valeurs utiles dans de tels cas? Ou est-il une meilleure façon de faire de même? Une façon évidente que je peux penser à est de le stocker en tant que:
UserID Attribute1
User1 a
User1 b
User1 c
User2 x
User2 y
User2 z
User3 a
User3 x
User3 y
User4 c
User4 b
User4 z
Aucun moyen plus rapide de traiter de telles situations dans les bases de données? Ou il y a des fonctions intégrées de moderne-jour des bases de données à exploiter?
- Mon intuition dit que le relationnel partie d'une base de données relationnelle est beaucoup plus optimisé que la chaîne de correspondance de la partie 🙂 Bases de données presque toujours meilleures et les plus faciles à optimiser lors de leur forme normalisée, ce qui serait la dernière option (tous les attributs d'étaler sur plusieurs lignes).
- Bases de données des rapports a l'habitude de faire mieux avec un bien pensé de dénormalisation..
- "Rapport De Base"??
- builderau.com.au/architecte/base de données/soa/...
- presque toujours meilleures et les plus faciles à optimiser lors de leur forme normalisée" -- pas vrai: la plus haute forme normale est 6NF peut entraîner une "explosion" de tables, nécessitant de nombreuses jointures pour écrire le plus simple de requêtes et de les forcer à utiliser des déclencheurs ou autre code de procédure à appliquer inter-contraintes de table, ni de ce qui est bon pour l'optimisation. Aussi une note que si un 5NF conception ne présente pas de redondance, il peut être, en pratique, peu de raison de le prendre à 6NF afin d'éliminer certains non-trivial dépendances.
Vous devez vous connecter pour publier un commentaire.
Avoir plusieurs valeurs dans un champ n'est utile que si les données sont des poids morts dans la base de données, c'est à dire si vous ne lisez pas le champ de la base de données et les traiter par la suite.
Dès que vous souhaitez utiliser les valeurs du champ dans une requête, il vous faudra prendre un énorme gain de performance d'avoir à analyser la valeur à comparer. Si vous mettez les valeurs dans des registres séparés comme dans ton deuxième exemple, de sorte que vous pouvez ajouter un index sur elle, il n'est pas illusoire de penser que la requête sera 10 000 fois plus rapide.
Avoir un million d'enregistrements dans une table n'est pas un problème. Nous avons quelques tables qui ont plus de 100 millions de disques en eux.
En dehors de ce que les autres ont dit au sujet de la normalisation, je voudrais répondre à la "Ou tout intégré fonction de moderne-jour databses à exploiter?" partie de votre question:
PostgreSQL dispose d'une assez chouette extension appelée
hstore
qui ne fait que cela et dans un très optimisé manière.La
hstore
type de données est essentiellement une paire clé/valeur, où vous pouvez stocker quoi que ce soit. Dans votre exemple, quelque chose comme ceci:Va insérer les clés
att1
etatt2
dans la colonne attributs. Cela peut être indexé à faire des recherches rapides.Vous pouvez interroger les données à l'aide de cette syntaxe:
Cela renvoie toutes les lignes qui ont une clé nommée
att1
et où est mappé à la valeur "Valeur". La déclaration ci-dessus va utiliser un index sur la colonne, de sorte que la recherche est presque aussi rapide qu'avec un "vrai" de la colonne. La déclaration ci-dessus prend ~2 ms sur mon portable afin de trouver une ligne dans une table avec 100.000 lignes.Vous pouvez également rechercher les lignes qui ont un attribut spécifique défini indépendamment de la valeur:
trouverez toutes les lignes où
att1
est défini et de sortie de la valeur de ceux-ci.Pour une n-n tableau, vous pouvez normaliser 3 tables (dans un modèle transactionnel) les utilisateurs - user_attribute - attributs où la user_attribute la table se compose de la clé primaire d'utilisateurs et d'attributs.. Clés sont généralement indexés et donc assez rapide pour les opérations de lecture
MODIFIER APRÈS LA QUESTION
cela aurait pour conséquence une table contenant seulement les utilisateurs, un tableau contenant uniquement les attributs d'une table de la tenue de l'utilisateur qui est tenue de ce
par exemple