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.
la source
Réponses:
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.
Mais quelque chose dans ce sens pourrait le faire.
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".
la source
Si vous ne pouvez vraiment pas combiner de tables, pourquoi ne pas en créer une
TRIGGER
sur la table de base pour éviter la suppression?Commencez ici: http://msdn.microsoft.com/en-us/library/ms189799(v=sql.90).aspx
la source
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.
la source
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.