在标识表和非标识表之间的关系的上下文中,MySQL的文档在很大程度上将表称为父表和子表。
如何确定哪个表是父表,哪个表是子表?
子表(又称弱实体)是一个表,其主键属性依赖于另一个表,因此子表由其依赖的表(父表)中的行标识或部分标识。子表中的行如果没有其父表中的相应行,则不能存在。
为了说明这一点,让我们举一个我们都熟悉的简单且完全相关的示例:家庭中的父母和孩子。我们可以使用如下表来建立这种关系的模型:
在上面的模型中,Parents表中的每一行都由SSN唯一标识。 SSN是每个父级的固有且唯一的属性,因此它是独立的或"强"的实体,因为它不依赖于另一个表来定义其标识。
但是,子级需要父级才能存在(Parent_SSN必须引用Parents表中现有的SSN)。
请注意Children表中的组合主键(Parent_SSN, Name)。这意味着通过Parent_SSN和Name的组合唯一标识子项。您不能仅基于Name字段来查询单个孩子,因为多个父母可能有同名孩子。同样,您不能仅根据Parent_SSN字段查询单个孩子,因为一个父母可能有很多孩子。考虑到这一点,孩子被父母部分地识别,从而确定了关系。
但是,SSN也不能唯一标识孩子吗?当然可以,为什么。让我们继续进行调整,以包括以下模型:
在此版本的模型中,请注意,我们为Children引入了SSN字段。现在,孩子的唯一标识由他们自己的固有和唯一SSN定义。它们的身份不再取决于Parents表。尽管Parent_SSN字段仍引用Parents表的SSN,但是它不涉及孩子的唯一身份,因此,父母与孩子具有非身份关系,并且现在可以将两个表都视为"强"独立实体。
顺便说一句,此版本的模型比第一个模型具有一些优点:
现在,一个父级可能有两个或两个以上同名子级,而先前模型中的实体完整性约束则不允许这样做。
您可以允许Parent_SSN字段包含NULL来说明您拥有有关孩子的数据的事件,但不知道他/她的父母是谁。
在上述两个模型中,Parents表都被视为Children表的父表。但是,在像第二个模型那样的非标识关系中,Parents只是外键Parent_SSN上下文中的父表,因为Parent_SSN引用/依赖于Parents表中的SSN,但是在定义孩子的实际身份方面没有任何作用。
为了说明为什么在确定哪些表是父/子表时上下文很重要,请考虑以下涉及循环依赖的示例:
在此示例中,员工和部门由他们自己的属性唯一标识,并且不会从其他表中派生其身份的任何部分。
在这里,我们有两个非识别关系:一个雇员在一个部门工作(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的情况下不能存在。
嗯,我的例子是识别性关系还是非识别性关系?
另外,在您的答案中,您听起来像是确定仅在对表进行查询时才确定哪个表是父表/子表,但是在设计数据库模式时,需要在表之间创建这些关系,其中表必须是子表,而表必须是子表必须是父母吧?