De nombreux de Nombreux Rapport de Conception - Table d'Intersection de la Conception
Je me demandais quoi de mieux qu'une conception est à l'intersection de la table pour un plusieurs-à-plusieurs relations.
Les deux approches que j'envisage sont:
CREATE TABLE SomeIntersection
(
IntersectionId UNIQUEIDENTIFIER PRIMARY KEY,
TableAId UNIQUEIDENTIFIER REFERENCES TableA NOT NULL,
TableBId UNIQUEIDENTIFIER REFERENCES TableB NOT NULL,
CONSTRAINT IX_Intersection UNIQUE(TableAId, TableBId )
)
ou
CREATE TABLE SomeIntersection
(
TableAId UNIQUEIDENTIFIER REFERENCES TableA NOT NULL,
TableBId UNIQUEIDENTIFIER REFERENCES TableB NOT NULL,
PRIMARY KEY(TableAId, TableBId )
)
Sont là les avantages de l'un sur l'autre?
EDIT 2:****Veuillez Noter: j'ai l'intention d'utiliser Entity Framework pour fournir une API pour la base de données. Avec cela à l'esprit, n'est une solution mieux travailler avec EF que les autres?
EDIT: Sur une note connexe, pour une table d'intersection que les deux colonnes font référence à la même table (exemple ci-dessous), est-il un moyen de faire les deux champs différents sur un enregistrement?
CREATE TABLE SomeIntersection
(
ParentRecord INT REFERENCES TableA NOT NULL,
ChildRecord INT REFERENCES TableA NOT NULL,
PRIMARY KEY(TableAId, TableBId )
)
Je veux éviter le suivant
ParentRecord ChildRecord
=================================
1 1 --Cyclical reference!
- Pour éviter que votre exemple (ce qui est appelé "l'Auto-référence"), il suffit d'ajouter une CONTRAINTE de VÉRIFICATION sur le niveau de la TABLE "ALTER TABLE dbo.SomeIntersection ADD CONSTRAINT CHK_SomeIntersection_SelfRefNoNono VÉRIFIER (ParentRecord <> ChildRecord)" --- Mais vous ne résoudra pas le cas A->B->C->d'Une manière aussi simple.
- Je suis plus inquiet à propos de l'auto-références que ronde sur les références, merci!
Vous devez vous connecter pour publier un commentaire.
La deuxième version est le mieux pour moi, il évite la création d'un index.
C'est un sujet de débat. Je préfère la première forme, car je considère qu'il est préférable d'être en mesure de regarder la rangée de mappage par une valeur unique, et comme pour faire respecter un peut-être stupide consistance d'avoir une seule colonne de clé primaire disponible dans chaque table sans échec. D'autres pensent que le fait d'avoir cette colonne est une bête de gaspillage de l'espace.
Nous rencontrer pour quelques tours de mains nues de la boxe à un bar dans le New Jersey, tous les quelques mois.
Utilisation version-1 si votre "intersection" EST en fait une entité en soi, sens:
Utilisateur version-2 si elle est purement N-M table de relation. Auquel cas, assurez-vous également que:
vous pouvez toujours avoir une autre d'une colonne d'identifiant UNIQUE, mais juste:
Dans les deux cas, vous souhaiterez peut-être créer un autre INDICE dont les 2 colonnes, mais dans un autre ordre, si vous recherchez de l'autre côté de la relation souvent.
si vous aller avec le premier, il suffit d'utiliser une IDENTITÉ sur le PK, vous n'avez pas besoin de gaspiller de l'espace disque et de la mémoire cache) avec un UNIQUEIDENTIFIER .
Ce que vous êtes en bâtiment est appelé "Carrefour".
J'ai une très nette de la mémoire de ma base de données, professeur à l'école en disant qu'une intersection relation est presque toujours une entité dans son propre droit, et donc c'est normalement la valeur de l'allocation de l'espace en tant que tel. Cela semble indiquer que l'ancien est plus "correct".
Cela dit, personnellement, j'ai tendance à préférer le premier. Il s'agit vraiment de savoir si vous aurez jamais récupérer l'un de ces enregistrements directement ou si vous n'aurez qu'à utiliser la table lors de l'adhésion à l'une des tables d'origine.
À partir d'un point de vue du développeur de vue, je préfère l'ancien.
Il est plus facile d'écrire et de tester lorsque vous traitez avec elle.
Je n'ai pas besoin de vérifier pour deux clés à récupérer un enregistrement unique.
Si vous n'avez pas tous les champs dans la table d'intersection il n'a vraiment pas besoin d'un ID de son propre, et en ajoutant l'on ne doit pas ajouter n'importe quel avantage. Toutefois, si vous allez mettre les autres champs dans cette table, et dans de nombreux cas, il devrait avoir son propre ID comme clé primaire.
Règle de pouce, bien sûr, mais là vous allez.
Répondre à votre deuxième question...
Vous avez juste besoin d'ajouter une contrainte de vérification, comme ceci:
Avantages de la première:
La capacité de rechercher la table de jointure par une valeur unique. Cela rend certaines tâches de recherche plus simple sur le côté client.
Certains Orm (NHibernate) exigent également des id dans chaque entité de la persistance de travailler correctement.
Avantages de la seconde:
Plus simple, modèle de données, sans avoir besoin de créer l'index supplémentaire.
Moins de mémoire nécessaire.
La deuxième est mieux. Elle contraint la boîte de jonction (intersection de la boîte) pour ne pas avoir plus d'un aspect de la même paire. Si il n'y a pas d'autres colonnes dans la boîte de jonction, vous n'aurez pas à faire des recherches de ce tableau, de toute façon, sauf par le biais de deux clés étrangères.
Étant donné que la TableAId-TableBId combinaison est unique et que la table est utilisée uniquement pour implemet plusieurs-à-plusieurs relations, j'irais avec la deuxième option. À partir d'un point de vue purement logique, le poing implemtnation réduit à la seconde. À partir d'un point de vue structurel vos bases de données a besoin pour maintenir à la fois une clé primaire/index comme une contrainte sur la première mise en œuvre alors que sur le second, il a seulement besoin de maintenir la clé primaire/index.