11

根据定义,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)
)
4

6 回答 6

10

没有任何理由不能将连接表用于一对多关系。问题通常是性能之一。为什么在不需要时让数据库加入一个额外的表?

于 2009-05-09T18:15:07.437 回答
8

是的,仍然可以在联结表中存储和强制执行一对多关系。

在您的示例中,您没有对UserOrders联结表实施任何约束,因此单个订单可以属于两个用户(假设这是不正确的)。为了强制您可以成为联结表OrderKey的主键UserOrders(或对该列具有唯一约束)。从技术上讲,这将成为and之间的多对一关系,而and之间具有一对一的关系。UserOrdersUsersOrdersUserOrders

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

于 2009-05-09T18:16:34.000 回答
5

这将是多对多的:

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 约束的区别。

于 2014-01-28T06:22:28.253 回答
3

一旦你建立了一个表,它就没有“Junction”表、“associative”表、“join”表——它只是一个表。

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

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

因此,这些表可以充当任何其他表可以履行的任何角色。没有关于其他表如何与它们关联的规则。

于 2009-05-09T19:37:11.717 回答
0

您可以在连接/连接表中强制执行“一个”约束,将唯一约束(或使其成为连接表的主键,因为只是该属性本身标识关系)到作为“多”的一面。那是因为您希望多方中的 rwos 只有一个关系,并且关系在联接/联结表中说明。

于 2014-05-30T12:06:01.833 回答
0

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

于 2014-10-23T14:53:11.597 回答