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

问题描述 投票:7回答:6

根据定义,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)
)
many-to-many database one-to-many junction-table
6个回答
5
投票

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

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

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


9
投票

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


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


2
投票

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

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

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

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.