Une table de jonction (table de jointure) peut-elle également être utilisée pour une relation un à plusieurs?

StackOverflow https://stackoverflow.com/questions/843772

Question

Selon la définition, une table de jonction (table de correspondance / lien). est utilisé pour les relations plusieurs à plusieurs, lorsqu'il est utilisé comme ceci:

CREATE TABLE Users
(
UserLogin varchar(50) PRIMARY KEY,
UserPassword varchar(50) NOT NULL,
UserName varchar(50) NOT NULL
)


CREATE TABLE Permissions
(
PermissionKey varchar(50) PRIMARY KEY,
PermissionDescription varchar(500) NOT NULL
)


--This is the junction table.
CREATE TABLE UserPermissions
(
UserLogin varchar(50) REFERENCES Users (UserLogin),
PermissionKey varchar(50) REFERENCES Permissions (PermissionKey),
PRIMARY KEY (UserLogin, PermissionKey)
)

Mais cela ne pourrait pas également être utilisé aussi facilement pour des relations un à plusieurs, comme dans cet exemple dans lequel un utilisateur est associé à plusieurs commandes:

(Je ne comprends pas bien les bases de données, alors corrigez-moi si j'ai mal compris quelque chose.)

CREATE TABLE Users
(
UserLogin varchar(50) PRIMARY KEY,
UserPassword varchar(50) NOT NULL,
UserName varchar(50) NOT NULL
)


CREATE TABLE Orders
(
OrderKey varchar(50) PRIMARY KEY,
OrderDescription varchar(500) NOT NULL
)


--This is the junction table.
CREATE TABLE UserOrders
(
UserLogin varchar(50) REFERENCES Users (UserLogin),
OrderKey varchar(50) REFERENCES Orders (OrderKey),
PRIMARY KEY (UserLogin, OrderKey)
)
Était-ce utile?

La solution

Oui, il est toujours possible de stocker et d'appliquer une relation un à plusieurs dans une table de jonction.

Dans votre exemple, vous n'appliquez aucune contrainte à la table de jonctions UserOrders. Par conséquent, une seule commande peut appartenir à deux utilisateurs (en supposant que ce soit incorrect). Pour imposer cela, vous pourriez faire de OrderKey la clé primaire de la Users table de jonctions (ou d’avoir une contrainte unique sur cette colonne). Techniquement, cela deviendra simplement une relation à plusieurs entre Orders et <=>, tout en ayant une relation un à un entre <=> et <= >.

Je ne peux penser qu'à une seule des raisons pour lesquelles la relation plusieurs-à-un a été créée à l'aide d'une table de jonction - si vous envisagez d'autoriser la relation plusieurs-à-plusieurs avenir et ne veulent pas faire face à la migration des données. Mais dans l’intervalle, vous devrez payer le coût de stockage et de réunion avec une table supplémentaire.

Autres conseils

Il n’existe aucune raison pour laquelle une table de jonction ne pourrait pas être utilisée pour une relation un à plusieurs. La question est généralement celle de la performance. Pourquoi faire en sorte que la base de données rejoigne une table supplémentaire lorsque cela n’est pas nécessaire?

Ce serait plusieurs-à-plusieurs:

CREATE TABLE UserOrders
(UserLogin varchar(50) REFERENCES Users (UserLogin),
OrderKey varchar(50) REFERENCES Orders (OrderKey),
PRIMARY KEY (UserLogin, OrderKey));

Ce serait un à plusieurs (un utilisateur a plusieurs commandes):

CREATE TABLE UserOrders
(UserLogin varchar(50) REFERENCES Users (UserLogin),
OrderKey varchar(50) REFERENCES Orders (OrderKey),
PRIMARY KEY (OrderKey));

Notez la différence dans la contrainte PRIMARY KEY.

Une fois que vous avez construit une table, elle n'a pas vraiment un type de & "Junction &"; table, " associative " table, " rejoindre " table - c'est juste une table.

Nous utilisons ces termes pour décrire une raison spécifique pour laquelle une entité (et la table résultante) a été créée. Des entités associatives sont créées, au départ, pour résoudre une situation plusieurs à plusieurs. Mais ces tables ont assez souvent des attributs qui leur sont propres (comme le moment de l’association, le motif de l’association, etc.). Donc, SQL Server, Oracle ou votre code n’ont aucune raison de savoir pourquoi une table a été créée, mais simplement qu’il s’agit d’une table.

D'un point de vue technique, il n'y a pas vraiment de différence entre une table associative et une autre table.

Ces tables peuvent donc remplir tout rôle que toute autre table peut jouer. Il n'y a pas de règles sur la manière dont d'autres tables peuvent également être liées à celles-ci.

Vous pouvez appliquer de " un " contrainte dans la table de jointure / jonction ajoutant une contrainte unique (ou en faisant la clé primaire de la table de jointure, parce que cet attribut identifie lui-même la relation) à la colonne qui est une clé étrangère du & "nombreux quot; côté. C’est parce que vous voulez que les membres du grand nombre n’ont qu’une seule relation et que les relations soient indiquées dans la table join / junction.

Je pense que vous avez mal compris le concept. Voici une explication simple si cela peut vous aider: Pour créer une relation multiple-multiple entre deux tables (par exemple, A et B), nous devons utiliser une table de jonction (par exemple, la table c) qui aura une relation un-plusieurs avec les deux tables. A et B.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top