ChatGPT解决这个技术问题 Extra ChatGPT

仍然对识别与非识别关系感到困惑

因此,我一直在阅读有关在我的数据库设计中识别与非识别关系的内容,并且一些关于 SO 的答案似乎与我相矛盾。这是我正在研究的两个问题:

识别关系和非识别关系有什么区别 难以确定识别或非识别关系

查看每个问题的最佳答案,我似乎对什么是识别关系有两种不同的想法。

第一个问题的回答说标识关系“描述了子表中的行的存在取决于父表中的行的情况”。给出的一个例子是,“一个作者可以写很多书(一对n的关系),但是没有作者就不能存在一本书。”这对我来说很有意义。

然而,当我阅读对问题二的回答时,我感到困惑,因为它说:“如果孩子识别出它的父母,那就是一种识别关系。”然后答案继续给出诸如 Social Security Number (识别一个人)之类的例子,但地址不是(因为许多人可以住在一个地址)。对我来说,这听起来更像是主键和非主键之间的决定。

我自己的直觉(以及对其他网站的额外研究)指出了第一个问题,并且它的回答是正确的。但是,我想在继续前进之前进行验证,因为我不想在我正在努力理解数据库设计时学习错误。提前致谢。


B
Bill Karwin

标识关系的技术定义是子项的外键是其主键的一部分。

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 数据建模工具中出现。


因此,如果我们使用代理键而不是复合主键,那么使用标识或非标识关系之间没有显着区别吗?
所以每个弱实体都有识别关系?
很好的答案,但是您能否回答这个问题,为什么它在 ERD 设计中甚至很重要? stackoverflow.com/questions/34846418/…
@Ochado,我不再回答有关 Stack Overflow 的问题。
:) 我认为我今天通过使用逻辑模型来让自己收拾一下,而通常我不会这样做。如此多的地方,查找表会放在中间,这对我来说是一把扳手。周三快乐。感谢您分享知识。
E
Erwin Smout

“因为我不想学错东西”。

好吧,如果你真的是这个意思,那么你可以停止担心 ER 术语和术语。它是不精确的、混乱的、令人困惑的,根本不是普遍同意的,而且在大多数情况下是不相关的。

ER 是在一张纸上绘制的一堆矩形和直线。 ER 有意成为非正式建模的一种手段。因此,这是数据库设计中有价值的第一步,但也仅仅是:第一步。

ER 图永远不会接近用 D 正式写出的数据库设计的精确性、准确性和完整性。


所以,如果我没看错你的回答,ER 建模只是一个帮助概念化数据库的工具(类似于 UML 建模是一个用于概念化软件系统的工具)。虽然每个工具都有帮助,但也有一些警告,它们有自己的语法和问题,可能会增加更多的混乱。我没有想到这个方面。谢谢。
如果 ER 表示“实体-关系”,那么 D 是什么意思?
是所有遵守“数据库、类型和关系模型”和/或“第三宣言”中规定的规则的语言家族。
第三宣言,简称 TTM,由 Chris Date 和 Hugh Darwen 撰写,是他们关于 21 世纪数据库处理语言应该是什么样子的蓝图。它定义了所说的 21 世纪语言必须遵守的规则和要求。其中一个要求是能够以形式上精确的方式表达/声明任何数据库约束。不要将“数据库约束”误解为“仅 20 世纪 SQL 引擎可以支持的约束类型”。不,“数据库约束”实际上意味着“任何管理数据库的约束。
从语法上讲,表达“任何数据库约束”的正式精确方式将非常接近“数据库专业人员应用数学”中使用的数据库设计规范语言/语法。它将(不可避免地)看起来与更传统的方法(例如 ERD 甚至 Halpin ORM(其对约束规范的支持比 ERD 更完整)的约束规范技术)完全不同。
n
nvogel

识别/非识别关系是 ER 建模中的概念 - 如果关系由作为引用表主键一部分的外键表示,则该关系是识别关系。这在关系建模术语中通常并不重要,因为关系模型和 SQL 数据库中的主键不像 ER 模型中那样具有任何特殊意义或功能。

例如,假设您的表强制执行两个候选键 A 和 B。假设 A 也是该表中的外键。如果 A 被指定为“主”键,则这样表示的关系被认为是“识别”的,但如果 B 是主键,则它是非识别的。然而,表格的形式、功能和含义在每种情况下都是相同的!这就是为什么在我看来,我认为识别/非识别概念真的很重要。


+1 - 感谢您清除此问题!我(和另一位同样不熟悉数据库设计的同事)正在为此苦苦挣扎,因为我们不明白为什么其中一个或另一个很重要,因为它达到了相同的效果。这真的很有帮助。
为了跟进您的回答,您能否回答或评论这个问题,为什么它在 ERD 设计中甚至很重要? stackoverflow.com/questions/34846418/…
P
Pankaj Jha

我相信识别和非识别关系之间的唯一区别在于外键的可空性。如果 FK 不能为 NULL,则它所代表的关系是可识别的(没有父代就不能存在子代),否则它是不可识别的。


但在@bill-karwin here 的回答中,他说非识别关系可以是可选的或强制性的
g
gnackenson

这里的部分问题是术语的混淆。识别关系对于避免长连接路径很有用。

我见过的最好的定义是“识别关系包括子 PK 中作为父级的 PK。换句话说,子级的 PK 包括对父级的 FK 以及子级的“实际”PK。


+1 表示“识别关系对于避免长连接路径很有用”。如果您对此进行更多详细说明,那就太好了。
m
marianboda

是的,选择第一个,但我不认为第二个与第一个矛盾。只是表述有点混乱。。

更新:

刚刚检查过 - 第二个问题的答案在某些假设中是错误的,.. book-author 不一定是 1:n 关系,因为它可能是 m:n。在为这个 m:n 关系创建交集表的关系数据库中,您可以识别交集表和其他 2 个表之间的关系。


k
kumar

当我们必须定义父子关系时,识别关系给出了一对多的可选关系。此外,它给出了从子流到父流的一对多关系。因为父实体主键将是子实体主键的一部分,子实体实例将标识父实体实例。在er图中用实线表示。

其中非标识关系将是多对多关系。对于子实体实例的存在应该有父实体实例,但是子实体中的每个实体实例可能与父实体的许多实体实例相关。这就是为什么主键的原因父实体可以是子实体的外键,但子实体不会以父实体的主键作为其主键。它会有自己的主键。现实世界的 er 图中不存在多对多关系。所以需要解决


R
Russell Searle

识别关系确实是一个 ERD 概念,因为这是概念建模的领域,建模我们对“话语宇宙”的理解。这是一种父子关系,我们对每个子对象的身份(至少部分)由父对象的身份建立/确定的事实进行建模。因此,它是强制性的,并且是不可变的。

一个现实世界的例子是识别人的长期挑战。一个人的独特身份可以(部分)由他们与生母和生父的关系来定义。当已知时,这些都是不可改变的事实。因此,亲生父母和孩子之间的关系是一种识别关系,因为它(不变地)有助于定义孩子的身份。

正是这些品质和关系 dbms 构造的使用导致子的 PK 成为复合键,通过 FK 包括父的 PK。作为 PK,孩子的身份是强制性的和不可变的(它不能改变) PK 中的“改变”实际上是在实例化一个新对象。因此PK一定不能改变。 PK 的不变性也应该受到限制。 DB 约束可用于实现 PK 的质量。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅