标识关系的技术定义是子项的外键是其主键的一部分。
CREATE TABLE AuthoredBook (
author_id INT NOT NULL,
book_id INT NOT NULL,
PRIMARY KEY (author_id, book_id),
FOREIGN KEY (author_id) REFERENCES Authors(author_id),
FOREIGN KEY (book_id) REFERENCES Books(book_id)
);
看? book_id
是外键,但它也是主键中的列之一。所以这个表和被引用的表是有识别关系的Books
。同样,它与 具有识别关系Authors
。
对 YouTube 视频的评论与相应视频具有识别关系。video_id
应该是表的主键的一部分Comments
。
CREATE TABLE Comments (
video_id INT NOT NULL,
user_id INT NOT NULL,
comment_dt DATETIME NOT NULL,
PRIMARY KEY (video_id, user_id, comment_dt),
FOREIGN KEY (video_id) REFERENCES Videos(video_id),
FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
可能很难理解这一点,因为如今只使用串行代理键而不是复合主键是一种常见的做法:
CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
video_id INT NOT NULL,
user_id INT NOT NULL,
comment_dt DATETIME NOT NULL,
FOREIGN KEY (video_id) REFERENCES Videos(video_id),
FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
这可能会掩盖表具有识别关系的情况。
我不会认为 SSN 代表识别关系。有些人存在但没有 SSN。其他人可能会申请获得新的 SSN。所以 SSN 实际上只是一个属性,而不是个人主键的一部分。
来自@Niels 的重新评论:
因此,如果我们使用代理键而不是复合主键,那么使用标识或非标识关系之间没有显着区别吗?
我想是这样。我犹豫说是,因为我们没有使用代理键改变表之间的逻辑关系。也就是说,如果不引用现有视频,您仍然无法发表评论。但这只是意味着 video_id 必须不为空。对我来说,逻辑方面是识别关系的真正重点。
但是识别关系也有一个物理方面。这就是外键列是主键的一部分的事实(主键不一定是复合键,它可以是单个列,既是 Comments 的主键,也是 Videos 表的外键,但这意味着每个视频只能存储一条评论)。
识别关系似乎只是为了绘制实体关系图很重要,这在 GUI 数据建模工具中出现。