La décomposition d'un ternaire relation binaire des relations
Je suis en train de concevoir une base de données qui gère les utilisateurs, les comptes et les projets avec les relations suivantes et les contraintes:
- Un compte a de nombreux utilisateurs
- Un utilisateur appartient à plusieurs comptes
- Un compte a de nombreux projets
- Un projet appartient à seulement un compte
- Un utilisateur collabore à de nombreux projets (redondant remarque: chacun d'entre eux, appartenant à son propre compte).
En d'autres termes, un utilisateur peut collaborer à de nombreux projets de le même compte. Mais depuis un utilisateur peut appartenir à plusieurs comptes, ainsi, un utilisateur peut collaborer à de nombreux projets de plusieurs comptes. Cela m'amène à un ternaire collabore relation:
Après la lecture de quelques documents sur la conversion ternaire relations binaires relations, je suis venu avec le schéma équivalent suivant les relations:
Deux question se pose ici:
- Est cette conversion correcte? J'ai trouvé que j'ai à ajouter des contrôles supplémentaires au niveau de l'application pour gérer les insertions. Par exemple, avant d'ajouter un nouveau
(User,Project)
je dois vérifier que l'utilisateur appartient au même compte que le projet appartient à. - Est-il vraiment nécessaire d'établir la relation entre
Account
etUser
? Une fois que la relation entreUser
etProject
a été ajouté, ne pourrions-nous pas connaître le compte d'un utilisateur appartient à en accédant au projet?
Merci!!
OriginalL'auteur elitalon | 2012-05-15
Vous devez vous connecter pour publier un commentaire.
Si par "correct" tu veux dire "équivalent", alors non.
Il n'y a rien pour vous empêcher de vous connecter de projet et compte sans de la connexion d'un utilisateur (etc...), ce qui ne serait pas possible dans une véritable relation ternaire.
En fait, nous ne savons comptes sont les "candidats" à être connecté à l'utilisateur, mais nous n'aurions pas la bonne façon de choisir un.
Le vrai problème de ce système est qu'il vous permet de vous connecter à l'utilisateur d'un compte a rien à voir avec l'utilisateur projets.
À mon avis, si vous avez besoin d'une relation ternaire, juste aller de l'avant et de représenter directement dans le modèle physique. Si je comprends vos exigences correctement, cela ressemblerait à quelque chose comme ceci:
Remarque comment
AccountId
est à l'extérieur deCollaboration
PK. Cela signifie que chaque projet/combinaison utilisateur doit être connecté qu'à un seul compte (un différents combinaison peut toujours être connecté à un compte différent).L'oms recommande que la décomposition par défaut?
Ne jamais faire quelque chose juste parce que quelqu'un (moi y compris!) vous l'ordonne. Toujours comprendre ce que tu fais et pourquoi, sinon, vous allez être programmation par hasard.
Vous seriez surpris de voir, après une minutieuse recherche sur Google :p
Je ne suis pas sûr de savoir comment OP le deuxième modèle "élimine la redondance". En règle générale, au niveau de la base déclarative intégrité, doit être préféré au niveau de l'application de l'intégrité. Les raisons sont nombreuses, mais en un mot: DB contraintes de minimiser le risque d'erreurs (de par leur nature déclarative), promouvoir la réutilisation (puisqu'ils sont centralisées et ne peut pas être contournée par un buggy demande) et sont généralement plus performante et évolutive. Il y a des cas où au niveau de l'application de l'intégrité est justifié, mais d'intégrité DB devrait définitivement être votre "par défaut".
OriginalL'auteur Branko Dimitrijevic