外键与部分键及其ER表示

pre*_*lic 4 entity-relationship relational-database

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

据我了解:

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.
Run Code Online (Sandbox Code Playgroud)

这些似乎不是一样的东西,但是我无法区分它们的用途.

以[非常]简单的例子为例:

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.
Run Code Online (Sandbox Code Playgroud)

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

nvo*_*gel 11

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

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

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

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


Per*_*DBA 11

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

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

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

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

    识别关系(与非识别相对)的使用实际上很强烈; 它为依赖("弱")实体提供其标识符.如此愚蠢的术语,如"弱"和"强",不应该用于要求精确的科学.

    使用标准术语.

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

    • 假设Employee是"强大的"并且有一个主键(EmployeeId)
    • 那么"弱"的EmployeeChild表需要一个FK(EmployeeId)来识别Employee
    • 这将是EmployeeChild表的完美第一个组件,可爱的"部分键"
    • 你可以添加ChildNo,以便创建一个普通的Relational主键
    • 但它并不是"部分",因为它是父级的完整主键.

不熟悉关系数据库建模标准的读者可能会发现▶IDEF1X Notation◀非常有用.

  • 赞成一个很棒的答案,但是应该使用什么来源而不是那些 30 年前的 DBMS 书籍? (2认同)