联结表(连接表)是否也可用于一对多关系?

时间:2009-05-09 18:09:06

标签: many-to-many database one-to-many junction-table

根据定义,Junction Table(桥接表/链接表)用于多对多关系,如下所示:

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)
)

但它也不能像一对多关系那样容易使用,就像这个例子中一个用户与许多订单相关联:

(我不太了解数据库,所以如果我误解了某些内容,请纠正我。)

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)
)

6 个答案:

答案 0 :(得分:9)

没有任何理由说明联结表无法用于一对多关系。问题通常是表现。为什么在不需要时让数据库加入另一个表?

答案 1 :(得分:5)

是的,仍然可以在联结表中存储和实施一对多关系。

在您的示例中,您没有对UserOrders联结表强制执行任何约束,因此单个订单可以属于两个用户(假设不正确)。要强制执行,您可以使OrderKey成为UserOrders联结表的主键(或对该列具有唯一约束)。从技术上讲,这将成为UserOrdersUsers之间的多对一关系,而OrdersUserOrders之间存在一对一关系1}}和{{1}}。

我只能考虑使用联结表设计多对一关系的一个原因 - 如果您打算允许多对多关系未来并不想处理数据迁移。但与此同时,您将支付存储和加入附加表格的费用。

答案 2 :(得分:4)

这可能是多对多的:

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

这是一对多的(一个用户有很多订单):

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

注意PRIMARY KEY约束的区别。

答案 3 :(得分:2)

一旦你构建了一个表,它就没有一种“Junction”表,“associative”表,“join”表 - 它只是一个表。

我们使用这些术语来描述最初创建实体(和结果表)的具体原因。最初创建关联实体以解决多对多情况。但是这些表通常具有自己的属性(例如关联的时间,关联的原因等)。所以SQL Server,Oracle或你的代码没有理由知道为什么创建一个表......只是它是一个表。

从技术角度来看,关联表和任何其他表之间确实没有任何区别。

因此,这些表可以填充任何其他表可以实现的任何角色。没有关于其他表如何与它们相关的规则。

答案 4 :(得分:0)

您可以在连接/联结表中强制执行de“one”约束,从而向作为外键的列添加唯一约束(或使其成为连接表的主键,因为只是该属性本身标识关系)到了“很多”方面。那是因为你希望许多方面的rwos只有一个关系,并且在join / junction表中声明了关系。

答案 5 :(得分:0)

我认为你错了这个概念 - 这是一个简单的解释,如果它可以帮助: 要实现两个表(例如A和B)之间的多对多关系,我们需要借助一个与两个表都有一对多关系的联结表(比如表c) A和B.