外键与部分键及其E-R表示

时间:2011-01-31 00:51:54

标签: relational-database entity-relationship

我无法理解部分键/弱实体和外键之间的区别。我觉得自己不能理解这些东西是个白痴。

据我所知:

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.

子实体是否是弱身份,其中部分密钥是名称(部分唯一)?或者我应该使用外键,因为我正在努力建立和加强员工与孩子之间的关系?我觉得我可以为两者辩护,但我也觉得我在这里缺少一些东西。任何见解都值得赞赏,我为这些愚蠢的问题道歉。

3 个答案:

答案 0 :(得分:11)

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

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

  2. 使用IDEF1X术语。识别关系是指FK(孩子中的父Pk)也用于形成子PK的关系。它在父级中是唯一的,但在子级中不是唯一的,您需要添加一些列以使其唯一。因此,愚蠢的术语“部分密钥”。它是一个密钥(唯一)或它不是一个密钥; “部分钥匙”的概念太愚蠢而无法考虑。

  3. 在正确规范化且符合标准的数据库中,将会有很少的独立实体。所有其余的将取决于某个独立实体。这些实体并非“弱”,除非它们在没有它们所依赖的实体的情况下不能存在。

    识别关系(与非识别相对)的使用实际上很强烈;它为依赖(“弱”)实体提供其标识符。所以像“弱”和“强”这样的愚蠢术语不应该用于要求精确的科学。

    使用标准术语。

  4. 但要回答你明确的问题:

    • 假设Employee是“强大的”并且具有主键(EmployeeId)
    • 那么“弱”的EmployeeChild表需要一个FK(EmployeeId)来识别Employee
    • 这将是EmployeeChild表的完美第一个组件,可爱的“部分密钥”
    • 您可以添加ChildNo,以便创建普通的Relational Primary Key
    • 但它并不是“部分”,因为它是父级的完整主键。
  5. 不熟悉关系数据库建模标准的读者可能会发现▶IDEF1X Notation◀有用。

答案 1 :(得分:10)

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

部分密钥仅表示密钥的一部分 - 密钥属性的一些适当子集。

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

值得注意的是,弱/强的区别纯粹是ER建模概念。在关系数据库术语中,它没有太大区别。特别是关系模型没有对主键和其他候选键进行任何区分,因此出于所有实际目的,将主键属性单独列为引用其他表时的“特殊”情况并没有任何区别。 / p>

答案 2 :(得分:0)

假设两个实体的雇员和受抚养人之间存在关系。员工是强实体,而受抚养者是弱实体。从属具有名称,年龄,关系和雇员属性,具有属性E_Id(主键)和E_Name。            然后,为了满足关系,我们在Dependents表中使用外键E_Id,该表引用了Employees表的E_Id。         但是通过仅使用foregin键,我们无法在Dependents表中唯一地标识元组,因此我们还需要Name(partial key)属性来唯一地标识元组。 示例:假设Dependents表在Name中的值为Rahul,Akshat,Rahul,那么它将不是唯一的,并且当它与E_Id组合时,我们就可以唯一地标识它。

具有名称的

E_Id充当Dependents表中的主键。