Reputation: 4464
According to the definition, a Junction Table (bridge table/link table) is used for many-to-many relationships, when used like this:
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)
)
But couldn't it also be used just as easily for a one-to-many relationships, as in this example in which one user is associated with many orders:
(I don't understand databases well so please correct me if I have misunderstood something.)
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)
)
Upvotes: 15
Views: 10947
Reputation: 11952
Yes, it is still possible to store and enforce one-to-many relationship in a junction table.
In your example you are not enforcing any constraints on the UserOrders
junction table, so a single order can belong to two users (assuming that's incorrect). To enforce that you could make OrderKey
be the primary key of the UserOrders
junction table (or have a unique constraint on that column). Technically that will just become a many-to-one relationship between UserOrders
and Users
, while having one-to-one relationship between Orders
and UserOrders
.
I can only think about one reason for designing the many-to-one relationship using junction table - if you plan to allow the many-to-many relationship in future and don't want to deal with data migration. But in the mean time you will pay the cost of storing and joining with additional table.
Upvotes: 12
Reputation: 119
I think you got the concept wrong - Here is the simple explanation if it could help: To achieve a Many-Many relationship between two tables(say, A and B), we need to take the help of a junction table(say, table c) which will have one-many relationship with both tables A and B.
Upvotes: 0
Reputation: 1
You can enforce de "one" constraint in thee join/junction table adding a unique constraint (or making it the primary key of the join table, because just that atribute itself identifies the relationship) to the column that is a foreign key to the "many" side. That is because you want rwos in the many side have only one relationship and relationships are stated in the join/junction table.
Upvotes: 0
Reputation: 25534
This would be many-to-many:
CREATE TABLE UserOrders
(UserLogin varchar(50) REFERENCES Users (UserLogin),
OrderKey varchar(50) REFERENCES Orders (OrderKey),
PRIMARY KEY (UserLogin, OrderKey));
This would be one-to-many (one user has many orders):
CREATE TABLE UserOrders
(UserLogin varchar(50) REFERENCES Users (UserLogin),
OrderKey varchar(50) REFERENCES Orders (OrderKey),
PRIMARY KEY (OrderKey));
Note the difference in the PRIMARY KEY constraint.
Upvotes: 5
Reputation: 483
Once you've built a table, it really doesn't have a type of "Junction" table, "associative" table, "join" table -- it's just a table.
We use these terms to describe a specific reason why an entity (and resulting table) was initially created. Associative entities are created, initially, to resolve a many-to-many situation. But these tables quite often have attributes of their own (such as the time of the association, a reason for the association, etc.). So SQL Server, Oracle or your code has no reason to know why a table was created...just that it's a table.
From a technical point of view, there really isn't any difference between an associative table and any other table.
So these tables can fill any role that any other table can fulfill. There are no rules around how other tables can also be related to them.
Upvotes: 3
Reputation: 1108
There is not any reason why a junction table couldn't be used for a one-to-many relationship. The question is usually one of performance. Why make the database join an additional table when it is unnecessary?
Upvotes: 10