为什么 sql 中多对多关系的联结点 table 将两个外键都实现为主键?
why does junction table of many to many relation in sql implemet both foreign key as primary key?
CREATE TABLE Books(
BookID SMALLINT NOT NULL PRIMARY KEY,
BookTitle VARCHAR(60) NOT NULL,
Copyright YEAR NOT NULL
)
CREATE TABLE Authors(
AuthID SMALLINT NOT NULL PRIMARY KEY,
AuthFN VARCHAR(20),
AuthMN VARCHAR(20),
AuthLN VARCHAR(20)
)
CREATE TABLE AuthorBook(
AuthID SMALLINT NOT NULL,
BookID SMALLINT NOT NULL,
PRIMARY KEY (AuthID, BookID),
FOREIGN KEY (AuthID) REFERENCES Authors (AuthID),
FOREIGN KEY (BookID) REFERENCES Books (BookID)
)
这里的路口 table 是作者书
为什么使用主键 (authorid,bookid)
为什么不使用单独的 table ID 并将其设为主键?
why not have a separate table id and make it primary key?
因为您随后需要在 AuthID
上创建唯一索引,BookID
以确保不会将 (AuthID, BookID)
的重复对插入此 table。
拥有许多索引通常会减慢插入和更新速度并增加磁盘上数据的大小。通过使用复合主键,可以最大限度地减少该问题。
话虽如此,某些 ORM 尤其是 Django, does not support multi colum primary keys. Therefor Django's ManyToManyField 确实在 (AuthID, BookID)
上确实有一个顺序主键和一个唯一键 - 正是您询问的替代方法。
CREATE TABLE Books(
BookID SMALLINT NOT NULL PRIMARY KEY,
BookTitle VARCHAR(60) NOT NULL,
Copyright YEAR NOT NULL
)
CREATE TABLE Authors(
AuthID SMALLINT NOT NULL PRIMARY KEY,
AuthFN VARCHAR(20),
AuthMN VARCHAR(20),
AuthLN VARCHAR(20)
)
CREATE TABLE AuthorBook(
AuthID SMALLINT NOT NULL,
BookID SMALLINT NOT NULL,
PRIMARY KEY (AuthID, BookID),
FOREIGN KEY (AuthID) REFERENCES Authors (AuthID),
FOREIGN KEY (BookID) REFERENCES Books (BookID)
)
这里的路口 table 是作者书 为什么使用主键 (authorid,bookid)
为什么不使用单独的 table ID 并将其设为主键?
why not have a separate table id and make it primary key?
因为您随后需要在 AuthID
上创建唯一索引,BookID
以确保不会将 (AuthID, BookID)
的重复对插入此 table。
拥有许多索引通常会减慢插入和更新速度并增加磁盘上数据的大小。通过使用复合主键,可以最大限度地减少该问题。
话虽如此,某些 ORM 尤其是 Django, does not support multi colum primary keys. Therefor Django's ManyToManyField 确实在 (AuthID, BookID)
上确实有一个顺序主键和一个唯一键 - 正是您询问的替代方法。