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

pez*_*ser 7 database many-to-many one-to-many 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)
)
Run Code Online (Sandbox Code Playgroud)

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

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

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)
)
Run Code Online (Sandbox Code Playgroud)

j0t*_*0tt 9

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

  • 在外键大多为NULL的情况下怎么办?如果很少查询或连接联结表或这些表之间的关联,那么是否可以更好地权衡一个节省空间的联结表? (3认同)

m_v*_*aly 5

是的,但是你要检查它对应用程序来说并不是很多,而不是在数据库中执行它.

  • 在联结表中,您可以分别在1列或2列上轻松强制执行一对多或一对一的唯一约束. (4认同)

nvo*_*gel 5

这将是多对多:

CREATE TABLE UserOrders
(UserLogin varchar(50) REFERENCES Users (UserLogin),
OrderKey varchar(50) REFERENCES Orders (OrderKey),
PRIMARY KEY (UserLogin, OrderKey));
Run Code Online (Sandbox Code Playgroud)

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

CREATE TABLE UserOrders
(UserLogin varchar(50) REFERENCES Users (UserLogin),
OrderKey varchar(50) REFERENCES Orders (OrderKey),
PRIMARY KEY (OrderKey));
Run Code Online (Sandbox Code Playgroud)

请注意 PRIMARY KEY 约束的差异。