识别关系的技术定义是,孩子的外键是其主键的一部分。
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必须为非NULL。对我而言,逻辑方面确实是确定关系的关键。
但是,识别关系也有一个物理方面。这就是外键列是主键的一部分的事实(主键不一定是复合键,它可以是单个列,既是注释的主键又是视频表的外键,但这意味着每个视频只能存储一个评论。
识别关系似乎仅对于实体关系图来说很重要,而这在GUI数据建模工具中会出现。