2011-01-31 67 views
2

我无法理解部分键/弱实体与外键之间的差异。我觉得自己不能理解这些东西。外键与部分键及其E-R表示

据我了解:

Weak Entity: An entity that is dependent on another entity. 
Partial Key: Specifies a key that that is only partially unique. Used for weak entities. 

vs 

Foreign Key: A key that is used to establish and enforce a relation between data in different tables. 

这些似乎并不像他们一样的东西,但我无法区分它们的用途。

取[很]简单的例子:

We have employees specified by an empid. We also have children specified by name. A 
child is uniquely specified by name when the parent (employee) is known. 

会子实体在弱的身份,其中部分关键是名字(部分是唯一的)?或者我应该使用外键,因为我试图建立并强制员工和孩子之间的关系?我觉得我可以证明两者,但我也觉得我在这里错过了一些东西。任何见解都会受到赞赏,我对这些愚蠢的问题表示歉意。

回答

7

弱实体类型是其主键包含一些引用另一个实体的属性的实体类型。换句话说,外键是主键的一个子集。因此,如果没有父母,实体就不能存在。

部分密钥仅仅意味着密钥的一部分 - 密钥属性的一些适当子集。

在您的示例中,如果Child的主键是Empid,ChildName,并且Empid是引用Employee的外键,那么Child是弱实体。如果Empid不是主键的一部分,那么Child将是一个强大的实体。

值得记住的是,弱/强的区别纯粹是ER建模的概念。在关系数据库方面,它没有太大的区别。特别是关系模型没有在主键和其他候选键之间做任何区分,所以出于所有实际的目的,当他们引用其他表时,将主键属性视为“特殊”情况并没有什么区别。

9

问题不在于你,而在于古代的教科书或者你正在使用的是纯粹的排泄物,“定义”并不清楚,并且已经有关于30多年的关系数据库的标准定义,更清晰。你发布的“定义”事实上是相反的,非直观的,人们会感到困惑并不奇怪。

  1. 子行中的外键是引用其父父键(在父表中)的值。

  2. 使用IDEF1X术语。识别关系是FK(孩子中的父母Pk)也用于形成孩子PK的关系。它在父项中是唯一的,但在子项中不是唯一的,您需要添加一些列以使其具有唯一性。因此,愚蠢的术语“部分关键”。要么是钥匙(唯一的),要么不是钥匙; “部分关键”的概念太愚蠢了。

  3. 在一个正常的标准化和符合标准的数据库中,将会有很少的独立实体。其余的将依赖于某个独立实体。这些实体不是“弱”的,除非它们不存在没有它们所依赖的实体的存在。

    识别关系(而不是非识别)的使用实际上很强大;它给予从属(“弱”)实体他们的标识符。像“弱”和“强”这样愚蠢的术语不应该用在需要精确度的科学中。

    使用标准条款。

  4. 但是,为了回答您明确的问题:

    • 假设员工是“stwong”,并有一个主键(雇员)
    • 那么“弱” EmployeeChild表都需要一个FK(雇员)至识别员工
    • 这将是EmployeeChild台完美的第一部分,可爱的“关键部分”
    • 你也许会添加ChildNo,为了使一个普通的关系主键
    • 但它并非真正的“部分”,因为它是父母的完整主键。

读者谁是不熟悉标准建模关系型数据库可能会发现▶IDEF1X Notation◀有用。

+1

upvote给出了一个很棒的答案,但是应该使用什么来代替这些30年前的DBMS书? – piechuckerr 2016-11-26 05:19:06