Mar*_*rco 8 normalization surrogate-key relational-theory
我有以下问题:
“代理键违反了什么标准形式?”
我的想法是第三范式,但我不太确定这只是我所做的假设。有人可以向我解释一下吗?
nvo*_*gel 11
它没有。任何类型的密钥本身都不会违反任何正常形式。您希望该表表示的一组依赖关系定义了是否满足任何 NF。
添加代理键确实意味着对该键的额外依赖集。根据定义,这些额外的依赖项是由超键隐含的连接依赖项,这意味着例如 5NF 和 DKNF 不会被违反。唯一可能的例外是,如果代理的属性(部分键)的某个适当子集本身就是决定因素。鉴于“代理”通常意味着其值是任意的单个属性键,这样的部分键依赖是不可能的。
添加代理键属性可能会违反 6NF,但如果是这样,那只是因为添加了一个属性 - 这不是代理键的问题。
小智 8
接受的答案不正确;@sqlvogel 和 @gbn 给出的答案是正确的。
代理键是替代自然键(具有从域派生的功能依赖关系的键)的非域驱动键。
例如,我们可能有一个独立的,非重叠键的表(一个命名表People
与id
,ssn
和email
钥匙)。这两个ssn
和email
是天然键(我们决定只给定一个社会安全号码或只是一个电子邮件,我们可以唯一地标识一个人)。id
是一个代理键——我们为了唯一标识一个人而添加的一个键。人们往往没有ids
,但关系通常有一个名为 的代理键id
。因此,id
密钥不是从 Personhood 域派生的。
也就是说,id
, email
, 和ssn
每个函数都决定了Person
表上的所有其他属性。它们都是候选键(因此是超级键)。
当非键属性在功能上确定其他属性或仅候选键的一部分确定其他属性时,就会发生 BCNF 违规。由于每个属性本身都是一个候选键,因此不存在 BCNF 违规。
如果代理键代表复合自然键怎么办?例如,一个Films
表,其中title
和original_release_date
组合形成一个自然键,一个id
字段充当代理键。{ title
, original_release_date
} 键是否违反了键最小的要求?
这是对极简定义的误解。仅仅因为代理键包含比自然键少的属性并不意味着它是奇异的最小键。如果不存在也是候选键的键的适当子集,则候选键是最小的。title
不唯一标识 a Film
,也不唯一标识original_release_date
。因此,即使在代理键代表复合自然键的情况下,也不会违反范式。
可以说代理键不是表的自然键,因此可以说它违反了3NF的“只有键”原则。在实践中,代理键只是自然键的占位符,所以这个论点充其量只是学术上的。
一些晦涩的范式需要复合键才能相关。在这种情况下会想到 5NF,因为它需要 M:M 关系上的多个重叠复合键才能违反 5NF。