Quelles alternatives existent lorsqu'une table nécessite trop de clés étrangères?


8

Nous avons une table de base qui définit les pièces et contient des informations comme le numéro de pièce, la description, le prix, le poids, etc. Nous avons également environ 400 tables qui font référence à la table de base et fournissent des informations supplémentaires sur les pièces en fonction de leur type / catégorie.

Nous avons commencé par utiliser des contraintes de clé étrangère afin qu'une partie ne puisse pas être supprimée de la table de base si elle est référencée dans l'une des 400 tables spécifiques à une partie, mais nous avons rapidement atteint le maximum de 253 clés étrangères recommandées pour SQL Server 2005.

Existe-t-il des alternatives aux clés étrangères dans cette situation qui garantiront l'intégrité des données? Nous n'avons pas vu de problèmes de performances lors de l'accès aux données, mais la mise à jour d'une pièce existante dans la table de base échouera car le plan de requête est trop complexe.


14
Pensez-vous vraiment avoir besoin de 400 tableaux spécifiques à une pièce? Dans quelle mesure chacune de ces tables est-elle vraiment différente? Je pense que vous essayez de réparer la mauvaise partie de cette conception.
Aaron Bertrand

2
À peu près combien de lignes traitez-vous dans cette base de données?
Jon Seigel

4
Je dois être d'accord avec Aaron Bertrand, si votre conception vous oblige à maximiser les supports du serveur sql de clés étrangères, il peut être temps d'envisager une refonte.
DForck42

5
J'ai fait de nombreux designs dans ce domaine - tarification, gestion des produits, spécifications des produits. Même dans des conceptions hautement normalisées, je n'ai jamais approché autant de FK sur la même table. Faites-vous peut-être une sorte de stratégie de partitionnement des données (par client ou par temps ou quelque chose comme ça) qui vous a amené à concevoir dans cette direction? Il est difficile de fournir une réponse sans plus d'informations sur votre conception et vos objectifs de conception.
Karen Lopez

4
Pourriez-vous fournir un exemple de schéma pour disons 5 de ces tableaux ...
Damir Sudarevic

Réponses:


6

S'il existe un moyen de regrouper des pièces, vous pourrez peut-être introduire des tables intermédiaires comme solution de contournement. Ça ne marchera pas.

Parts
+ Table 1
+ Table 2
+ ...
+ Table 400

Mais quelque chose dans ce sens pourrait le faire.

Parts
+ RedOrangeYellow parts
  + Table 1
  + Table 2
  + ...
  + Table 200

+ GreenBlueIndigoViolet parts
  + Table 201
  + Table 202
  + ...
  + Table 400

Je voudrais examiner attentivement votre DDL avant de recommander de le faire, cependant. Et si vous faites cela, ne commencez pas à lancer des numéros d'identification partout. Vous devriez pouvoir joindre directement "Table 400" à "Parts" sans inclure "GreenBlueIndigoViolet parts".



-4

Remplacez les 400+ tables par une. Seulement besoin de 3 champs (+1 numéro automatique ou n'importe quelle clé primaire si vous le souhaitez, ne devez pas l'avoir, vous pouvez le former à partir des autres champs)

Valeur d'attribut de l'ID d'article

Donc, là où dans vos autres tables, chaque champ représente un attribut, dans cette table, vos attributs sont tous dans un champ. Vous auriez quelque chose comme ça

Valeur d'attribut ItemID

Matériau de chaussette Laine

Couleur de chaussette Rouge

Poids de la chaussette 20 livres

Alien Planet Alpha Centauri

Alien Color Purple

Alien Friendly Non

Les ID d'article devraient probablement être un nombre / alphanumérique ofc. Ensuite, vous venez de croiser w / Atrributes comme en-têtes de colonne lorsque cela est nécessaire pour générer les tables comme vous le souhaitez. Cela permet également de meilleures requêtes pour des choses comme "Montrez-moi tous les articles qui viennent d'Alpha Centauri" qui pourraient vous rendre l'Alien et également le fragment de météorite qui contenait la peste qui anéantit l'humanité (ça arrive .....)

L'optimisation peut être délicate en fonction du nombre d'enregistrements, mais c'est une bien meilleure façon de concevoir cela. J'ai fait de même pour une base de données qui contenait un tas de recettes (10k +) qui avaient peu de chevauchements. A bien fonctionné dans ce cas. Je n'ai pas vraiment eu de problèmes de vitesse. Le vôtre peut être plus difficile selon le nombre de personnes avec qui vous avez affaire.


4
C'est ce qu'on appelle le modèle de valeur d'attribut d'entité et c'est normalement une idée assez terrible pour beaucoup de raisons. Pour votre exemple du scénario "alpha centauri", vous examineriez probablement 2 analyses de table et les index ne peuvent pas être utilisés. En outre, il annule tout avantage des types de données, rend les contraintes relationnelles impossibles et n'est généralement pas optimisable ou évolutif à aucun degré. Si vous devez stocker plus d'une centaine de lignes comme celle-ci, ne le faites pas.
JNK

2
Comme le souligne @JNK, ce n'est généralement pas une bonne solution. Et pire encore lorsque vous le faites avec une seule table. Je dirais que le minimum est de 3 tables ( Entity, Entity_Attribute, Entity_Attribute_Value). Si vous souhaitez ajouter un traitement semi-approprié pour différents types de données et contraintes référentielles, vous en aurez besoin de plus.
ypercubeᵀᴹ

1
Alors que le PO peut approcher une sorte de limite avec une conception normalisée traditionnelle en raison de la complexité des entités de leur système, la plupart des systèmes extrêmement complexes ne sont pas vraiment mieux gérés dans l'EAV, car il offre un support de type beaucoup plus faible et un niveau d'application l'intégrité référentielle puisque les données sont toutes stockées de façon assez générique. L'EAV a sa place utile, mais je ne serais pas prêt à le recommander comme réponse à ce problème comme indiqué actuellement.
Cade Roux

Huh, learn something new every day. I'm self-taught and that was somethign i came up with to solve the recipe problem I was having, which sounds similar to this guys issue. Ah well. Thanks for the info on that, I'll look into EAV, maybe there's a cleaner way to solve my problem as well. Could be it worked easier for me since all the values were the same datatype. I dunno.
user2125055

2
@user2125055 It's no problem, and don't take any of the criticism personally. We are just downvoting the idea of using EAV! There are definitely use cases where it makes sense, but because of the drawbacks you need to be very careful with it.
JNK
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.