2010-08-04 3 views
1

J'ai essayé de trouver une réponse pour cela et je ne connais pas la meilleure façon de le décrire. Fondamentalement, j'ai 3 tables source chacune avec des clés uniquesidentifier. Nous appellerons ces tables Skill1, Duty2, Custom3. Ils ne sont pas liés (facilement) d'une manière ou d'une autre, à part le fait qu'ils sont des attributs d'un travail particulier. Je veux lier des ressources à ces compétences (ex: un livre, une url, un identifiant de cours) à partir de ce qui est maintenant 8 tables différentes que j'appellerai Resource1 - Resource8. Ceci permet de relier n'importe quelle combinaison de ces types de ressources à l'un quelconque des attributs contenus dans les trois "tableaux de compétences".Table à un pont ou existe-t-il un meilleur moyen?

je suis venu avec beaucoup de dessins bizarres, mais je me suis installé sur les points suivants:

Tableau - Colonne -> FK

Skill1 - SkillUniqueId -> BridgeTable.AttributeUniqueId 
Duty2 - DutyUniqueId -> BridgeTable.AttributeUniqueId 
Custom3 - CustomUniqueId -> BridgeTable.AttributeUniqueId 

BridgeTable - AttributeUniqueId, ResourceUniqueId, AttributeType, ResourceType 

Resource1 - ResourceUniqueId -> BridgeTable.ResourceUniqueId 
Resource2 - ResourceUniqueId -> BridgeTable.ResourceUniqueId 
Resource3 - ResourceUniqueId -> BridgeTable.ResourceUniqueId 
...etc. 

Le « problème » avec cette conception simple est que J'ai une table de pont reliant 3 tables "attribut" à 8 tables de ressources et je dois utiliser AttributeType et ResourceType en logique dans les procédures stockées (et éventuellement l'application utilisant ces tables) afin d'utiliser les tables appropriées.

Existe-t-il un meilleur moyen de relier ces 3 tables d'attributs aux ressources sans dupliquer les données qui existent déjà ailleurs? (c'est-à-dire: créer une table "job" avec toutes les combinaisons possibles d'attributs, ou fusionner toutes mes tables de ressources dans une table avec beaucoup de colonnes nullables)

+0

Pourquoi 8 tables de ressources?7 Je pourrais comprendre - 3 pour chaque compétence, devoir et coutume, plus 3 pour chaque compétence et devoir, devoir et coutume, et compétence et coutume, plus 1 pour chacun 3. Quel est le 8ème tableau? –

+0

Certaines des ressources dont j'ai besoin sont des ressources d'affaires internes ... Je ne pense pas que je l'ai expliqué assez bien pour que vous puissiez attraper ce que je fais. Les ressources décrivent une ressource de formation (URL, livre, code de formation interne, ID de méthodes internes, ID LMS/URL, etc.) – Andir

Répondre

2

Dans une base de données de 3ème forme normale, basée sur ce que vous avez décrit que vous auriez besoin d'une table de pont reliant chaque attribut et chaque table de ressources possible. Tout type de raccourci (comme ce que vous avez proposé) conduit à des problèmes (comme ce que vous avez trouvé - un bon article sur ce sujet peut être trouvé sur SQL Server Central, ou peut-être Google sur "MUCK tables".)

pourrait les données contenues dans les 8 tableaux de ressources soient révisées dans une table, quelque chose comme:

ResourceUniqueId 
ResourceType 
ResourceName 
ResourceEtc 

avec peut-être une table « type » pour définir/contrôler les types de ressources? Si c'est le cas, vous n'avez besoin que d'une seule table de pont pour chaque table attributaire. Alternativement, peut-être un ensemble de tables de sous-type de type aiderait - table de ressource de niveau supérieur, avec les tables actuelles étant configurées en tant que sous-types. A défaut, une dénormalisation contrôlée pourrait aider. Créez cette table unique combinant toutes les ressources, puis copiez les données de chaque ressource dans celle-ci. Bien sûr, le coût de la dénormalisation est que quand (et non si) les ressources sont mises à jour, vous devrez les synchroniser à plusieurs endroits, et si les mises à jour sont fréquentes, cela peut être un cauchemar royal. En fin de compte, si vous avez des données complexes, alors vous aurez besoin de modèles complexes et de code pour les représenter correctement. Les raccourcis de dénormalisation peuvent être pris, mais reconnaissent immédiatement qu'ils sont des raccourcis et qu'ils nécessiteront des soins, un support et une maintenance supplémentaires au fil du temps. Le meilleur conseil que j'ai entendu sur ce sujet est de produire d'abord la mise en page entièrement et correctement normalisée, et ensuite seulement introduire des dénormalisations contrôlées pour soutenir vos objectifs.

+0

Ouais, je n'étais pas impatient de créer 24 tables de pont ... Aussi, merci pour le mot-clé "BOUE"! C'est ce dont j'avais besoin pour trouver plus d'informations. (Avant d'utiliser des termes de recherche terriblement génériques et de ne rien trouver.) J'essayais d'éviter de mettre toutes les ressources à la même table. Ils contiennent différents types de données (URL, ISBN, ID, etc.) – Andir

0

Espérons que cela se passe d'explication.

resource_model_v2

+0

C'était en fait l'un des premiers modèles que j'ai testés, mais mon plus gros "reproche" est que quelqu'un d'autre ne comprenait pas quoi. se passait et mettre le même ID de ressource dans Resource1 et Resource3. Le ResourceType est la logique externe à laquelle je faisais référence. Cela fonctionnerait, mais il n'est pas normalisé et n'applique pas l'intégrité des données dans la conception. (Ce que j'ai énuméré dans ma question ci-dessus n'est pas mieux ... Je ne dis pas ça ...) – Andir

+0

Ça me semble normalisé. Pour appliquer le sous-type exclusif, vous pouvez ajouter ResourceType dans chacune des tables de sous-types avec une contrainte de vérification sur le type. Plus tard, rejoignez ResourceId et ResourceType. –

+0

Mais en plaçant le type dans chaque enregistrement de la table de ressources, vous le dénormaliser ... Cela fonctionnerait, je ne dis pas cela. – Andir

Questions connexes