识别与非识别关系(再次!!!)

时间:2013-03-16 00:18:05

标签: mysql database database-design entity-relationship cardinality

所以,我已经在stackoverflow上阅读了很多答案,但我仍然对其整个概念感到困惑。具体来说,我已经浏览了这篇文章(包括它所引用的所有文章),但似乎无法找到对这个概念的坚实把握(或者也许是我在基数(n:m等)之间的混淆。)和身份):

Still Confused About Identifying vs. Non-Identifying Relationships

我的问题是:我知道识别关系意​​味着子实体的主键必须包含其外键,而非识别关系则相反(这是正确的吗?)。现在,这看起来有点太多了#34;前瞻思维"对我来说?在其中一个链接的评论中也有同样的说法。我怎样才能退后一步呢?实际上看哪个关系是哪个身份?

例如,我有两个困境:

  1. job_title(父母,1)到employee(孩子,1 .. *)。我是否正确地认为,因为job_title是一个查找表,它必须是一个非识别关系?或者更准确地说,#34;员工在没有工作标题的情况下不能存在,因此必须确定"?或者是定义该场景的关系?
  2. employeeemployee_equipment(m:n基数之间的桥接实体)到equipment。现在,我读到这必须是employee_equipment双方的识别关系。但是,如果员工不需要设备怎么办?可以有一个可选的识别关系吗?
  3. 我想我真正想找到一种方法来识别哪些身份表应该属于哪个,而不考虑主键/外键,或任何真正技术的问题。

    非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

你过分思考选择性和身份之间的联系。直到整个事情对你来说更自然,最好将它们视为完全不相关

关于可选性,重要的是要记住可选性是方向性的。使用employee_equipment的例子:当然,员工不需要设备。 employeeemployee_equipment之间的一对多关系是可选的。同时,从相反的角度来看,这种关系是强制性的。您无法在employee_equipment中创建记录,除非有employee与之关联。

身份与选择性无关,除了巧合从孩子到父母的身份必须具有识别关系。无论是父母还是孩子的强制性,在身份方面都不存在,也不存在。

识别关系的原因是你必须知道你在说什么父母(以及其他一些事情)才能知道你在说什么孩子。也就是说,子项的主键必须包含父项的外键。

纯交集表(例如employee_equipment)就是很好的例子。纯交集的主键是两个父表的外键组合。请注意,有些人还可能会为这些类型的表添加代理键。如果存在多个候选键,则从身份角度来看并不重要。确定身份的重要因素是外键是否是候选键的一部分,该候选键是否恰好是主键。

另一个很好的例子就是数据库的元数据目录,其中列由它所属的表标识,就像表由它所在的模式标识一样,依此类推。知道列被称为NAME并不会告诉您它是哪一列。知道它是NAME表中的CUSTOMER列有帮助。 (您还必须知道哪个架构CUSTOMER,等等。)

答案 1 :(得分:3)

Joel提供了一个很好的answer(+1给他),让我提供一个小的心理快捷方式,你可以在考虑识别关系时使用......只要问问自己:

  

我可以使用子实体的属性实现唯一性 吗?

如果不是,并且您需要将从父迁移的属性包含到子密钥中以使其唯一,那么您将具有标识关系 1 。这是关于识别依赖,而不是存在依赖 2

您可能会对this post感兴趣,以便更多地了解该主题。


1 并且子实体是“弱”或“依赖”。

2 虽然识别依赖通常意味着存在依赖。