【问题标题】:What are the keys for a supporting / intersection entity?支持/交叉实体的关键是什么?
【发布时间】:2012-05-07 21:11:49
【问题描述】:

如果我们有

 ____________           /      \             ____________
|   Person   |-------- /        \    ------>|   Location |
|____________|        /  BornIn  \          |_____________
                      \          /
                       \        /
                        \      /

Person(SSN, first name, last name)
BornIn(..)
Location(City, Country, zip-code)

其中 SSNPerson 的键,Location is 由所有三个属性确定。

对于弱实体,键由弱实体的所有属性+所有者实体的主键(或外键)组成。

  1. BornIn 的密钥是什么?
  2. 什么是弱支持实体的关键?

我只是在网上找不到答案。这不是家庭作业。我正在学习数据库设计....

我的错。这是多对一的关系。

【问题讨论】:

    标签: database-design entity-relationship


    【解决方案1】:

    “弱实体”仅表示它涉及识别关系(作为子端点)。而识别关系仅仅意味着子实体的键包含父键(因此无法独立识别)。

    BornIn 是一种关系,而不是实体,因此它不能是“弱”的,也不能在逻辑模型中有键。

    然而,在 physical 模型中,BornIn 可以映射到表中并有一个键,具体取决于关系基数:

    • 既然你说它是多对一的,它没有映射到一个表,所以没有键(因为它不是一对一的,所以Person 表中的 FK 上也没有键)。
    • 但如果它多对多的,那么BornIn 将被映射到一个表,其键是两个父键的复合{SSN, City, Country, zip-code}

    【讨论】:

    • 谢谢。为什么BornIn 不是 M-1 关系?一个人不应该最多映射到一个出生地(有些可能仍然未知)吗?谢谢。
    • @User007 我只是提出一个关于如何将多对多关系映射到物理模型的假设点。我认为您的问题只是众多(或许多即将到来的,因为您正在学习)的一个例子,我并不是想建议这个特定的例子是多对多的。
    【解决方案2】:

    Person Table 的 PK 是 ssn 位置表必须有一个主键 - location_id(可能是自动递增值)

    中间表 -bornIn 将 ssn 和 location_id 作为其列

    因此,您可以通过此中间表将 Person 表与 Location 表连接起来。

     SELECT p.first_name,l.city from Person p inner join bornin b on b.ssn = p.ssn 
                                     inner join Location l on l.location_id=b.location_id
    

    【讨论】:

    • 谢谢你,萨纳斯。您是说对于中间表,属性是其他两个关系的键吗?而且它们也是支撑实体的关键?如果它是一个弱支持实体,这会改变吗?
    • 在弱支持实体中,您认为使用所有 3 个字段作为键(复合键)。如果数据集变得非常大,多字段复合键可能会很昂贵。而不是使用多字段复合键,它是引入“代理键”的更好选择。这使我们可以很容易地使用中间表连接 2 个表,并且在性能方面表现良好。
    猜你喜欢
    • 1970-01-01
    • 2017-06-18
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 2017-12-26
    • 2015-06-26
    • 2013-03-20
    相关资源
    最近更新 更多