mysql 子表是否包含_关于mysql:子表在标识关系或非标识关系中是哪个?

在标识表和非标识表之间的关系的上下文中,MySQL的文档在很大程度上将表称为父表和子表。

如何确定哪个表是父表,哪个表是子表?

子表(又称弱实体)是一个表,其主键属性依赖于另一个表,因此子表由其依赖的表(父表)中的行标识或部分标识。子表中的行如果没有其父表中的相应行,则不能存在。

为了说明这一点,让我们举一个我们都熟悉的简单且完全相关的示例:家庭中的父母和孩子。我们可以使用如下表来建立这种关系的模型:

b4ee161937a681468388a7e18800d3dd.png

在上面的模型中,Parents表中的每一行都由SSN唯一标识。 SSN是每个父级的固有且唯一的属性,因此它是独立的或"强"的实体,因为它不依赖于另一个表来定义其标识。

但是,子级需要父级才能存在(Parent_SSN必须引用Parents表中现有的SSN)。

请注意Children表中的组合主键(Parent_SSN, Name)。这意味着通过Parent_SSN和Name的组合唯一标识子项。您不能仅基于Name字段来查询单个孩子,因为多个父母可能有同名孩子。同样,您不能仅根据Parent_SSN字段查询单个孩子,因为一个父母可能有很多孩子。考虑到这一点,孩子被父母部分地识别,从而确定了关系。

但是,SSN也不能唯一标识孩子吗?当然可以,为什么。让我们继续进行调整,以包括以下模型:

8d6c406590f603b52c9224c539e99c8c.png

在此版本的模型中,请注意,我们为Children引入了SSN字段。现在,孩子的唯一标识由他们自己的固有和唯一SSN定义。它们的身份不再取决于Parents表。尽管Parent_SSN字段仍引用Parents表的SSN,但是它不涉及孩子的唯一身份,因此,父母与孩子具有非身份关系,并且现在可以将两个表都视为"强"独立实体。

顺便说一句,此版本的模型比第一个模型具有一些优点:

现在,一个父级可能有两个或两个以上同名子级,而先前模型中的实体完整性约束则不允许这样做。

您可以允许Parent_SSN字段包含NULL来说明您拥有有关孩子的数据的事件,但不知道他/她的父母是谁。

在上述两个模型中,Parents表都被视为Children表的父表。但是,在像第二个模型那样的非标识关系中,Parents只是外键Parent_SSN上下文中的父表,因为Parent_SSN引用/依赖于Parents表中的SSN,但是在定义孩子的实际身份方面没有任何作用。

为了说明为什么在确定哪些表是父/子表时上下文很重要,请考虑以下涉及循环依赖的示例:

e696db1484e72fd28d0f7c9dca4f73ca.png

在此示例中,员工和部门由他们自己的属性唯一标识,并且不会从其他表中派生其身份的任何部分。

在这里,我们有两个非识别关系:一个雇员在一个部门工作(Employee表中的DeptNo),一个部门由雇员管理(在Department表中的ManagerSSN)。父表是哪一个? ...儿童桌?

这取决于上下文-您在谈论哪个外键关系?在Employee表的DeptNo上下文中,Department表将被视为父表,因为DeptNo引用/依赖于Department表。

但是,在Department表的ManagerSSN上下文中,Employee表将被视为父表,因为ManagerSSN引用/依赖于Employee表。

这里提出了一个很好的定义:

An identifying relationship is when the existence of a row in a child

table depends on a row in a parent table. (...) Formally, the"right"

way to do this is to make the foreign key [i.e. the parent's primary key] part of

the child's primary key.

没有严格的规则可以确定表在关系中的作用。实际上,这就是关系模型的优点和创新:没有层次结构。

通常,如果从某个表到另一个表存在硬依赖性,则子角色或父角色由表的语义示例:在order,order_details关系中,很明显order是父级而order_details是子级。

在其他情况下,不清楚关系在关系中扮演什么角色。示例:orders和customers关系。如果执行查询以获取属于某个customer的所有orders,则其父级可能是customers,而orders是子级。但是,您也可以查询以获取特定order的所有装运信息(存储在customers关系中),在这种情况下,您可能会争辩说order是父级,而customers是父级中的子级。此查询。

就像我之前说过的那样,当关系模型在70年代末发明时,它相对于一种统治范式(分层数据模型)的主要好处之一是能够查找相关数据而不受其依赖。

person country关系如何?我猜人是这里的父表。在这种关系中,将是一个人的名单和一个国家的名单。每个人都必须有一个国家(标识关系),但是在MySQL文档中它说An identifying relationship is one where the child table cannot be uniquely identified without its parent.,这意味着父表将是country,子表是person,这与我的预期完全相反...

@Jackobud:不一定。这取决于您要查找的内容(您的查询)。在这种情况下,one where the child table cannot be uniquely identified without its parent)既不是country表也不是person表是该关系的子级。在这种情况下,MySQL的文档指的是完全依赖项:即order_details在没有对应的orders的情况下不能存在。

嗯,我的例子是识别性关系还是非识别性关系?

另外,在您的答案中,您听起来像是确定仅在对表进行查询时才确定哪个表是父表/子表,但是在设计数据库模式时,需要在表之间创建这些关系,其中表必须是子表,而表必须是子表必须是父母吧?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值