所以,我已经在stackoverflow上阅读了很多答案,但我仍然对其整个概念感到困惑。具体来说,我已经浏览了这篇文章(包括它所引用的所有文章),但似乎无法找到对这个概念的坚实把握(或者也许是我在基数(n:m等)之间的混淆。)和身份):
Still Confused About Identifying vs. Non-Identifying Relationships
我的问题是:我知道识别关系意味着子实体的主键必须包含其外键,而非识别关系则相反(这是正确的吗?)。现在,这看起来有点太多了#34;前瞻思维"对我来说?在其中一个链接的评论中也有同样的说法。我怎样才能退后一步呢?实际上看哪个关系是哪个身份?
例如,我有两个困境:
job_title
(父母,1)到employee
(孩子,1 .. *)。我是否正确地认为,因为job_title是一个查找表,它必须是一个非识别关系?或者更准确地说,#34;员工在没有工作标题的情况下不能存在,因此必须确定"?或者是定义该场景的关系?employee
到employee_equipment
(m:n基数之间的桥接实体)到equipment
。现在,我读到这必须是employee_equipment双方的识别关系。但是,如果员工不需要设备怎么办?可以有一个可选的识别关系吗? 我想我真正想找到一种方法来识别哪些身份表应该属于哪个,而不考虑主键/外键,或任何真正技术的问题。
非常感谢任何帮助!
答案 0 :(得分:5)
你过分思考选择性和身份之间的联系。直到整个事情对你来说更自然,最好将它们视为完全不相关。
关于可选性,重要的是要记住可选性是方向性的。使用employee_equipment
的例子:当然,员工不需要设备。 employee
到employee_equipment
之间的一对多关系是可选的。同时,从相反的角度来看,这种关系是强制性的。您无法在employee_equipment
中创建记录,除非有employee
与之关联。
身份与选择性无关,除了巧合从孩子到父母的身份必须具有识别关系。无论是父母还是孩子的强制性,在身份方面都不存在,也不存在。
识别关系的原因是你必须知道你在说什么父母(以及其他一些事情)才能知道你在说什么孩子。也就是说,子项的主键必须包含父项的外键。
纯交集表(例如employee_equipment
)就是很好的例子。纯交集的主键是两个父表的外键组合。请注意,有些人还可能会为这些类型的表添加代理键。如果存在多个候选键,则从身份角度来看并不重要。确定身份的重要因素是外键是否是候选键的一部分,该候选键是否恰好是主键。
另一个很好的例子就是数据库的元数据目录,其中列由它所属的表标识,就像表由它所在的模式标识一样,依此类推。知道列被称为NAME
并不会告诉您它是哪一列。知道它是NAME
表中的CUSTOMER
列有帮助。 (您还必须知道哪个架构CUSTOMER
,等等。)
答案 1 :(得分:3)