代理键违反什么范式?

Mar*_*rco 8 normalization surrogate-key relational-theory

我有以下问题:

“代理键违反了什么标准形式?”

我的想法是第三范式,但我不太确定这只是我所做的假设。有人可以向我解释一下吗?

gbn*_*gbn 12

可以说,它没有。

添加代理键是在实现时做出的实现决策(尊重 RDBMS 的工作方式)。在建模和规范化期间,您应该最终得到BCNF(更严格和更正确的 3NF)而没有代理键

也就是说,在设计过程开始时引入代理键是错误的。尽管我们都这样做...


nvo*_*gel 11

它没有。任何类型的密钥本身都不会违反任何正常形式。您希望该表表示的一组依赖关系定义了是否满足任何 NF。

添加代理键确实意味着对该键的额外依赖集。根据定义,这些额外的依赖项是由超键隐含的连接依赖项,这意味着例如 5NF 和 DKNF 不会被违反。唯一可能的例外是,如果代理的属性(部分键)的某个适当子集本身就是决定因素。鉴于“代理”通常意味着其值是任意的单个属性键,这样的部分键依赖是不可能的。

添加代理键属性可能会违反 6NF,但如果是这样,那只是因为添加了一个属性 - 这不是代理键的问题。


小智 8

接受的答案不正确;@sqlvogel 和 @gbn 给出的答案是正确的。

代理键是替代自然键(具有从域派生的功能依赖关系的键)的非域驱动键。

例如,我们可能有一个独立的,非重叠键的表(一个命名表Peopleidssnemail钥匙)。这两个ssnemail是天然键(我们决定只给定一个社会安全号码或只是一个电子邮件,我们可以唯一地标识一个人)。id是一个代理键——我们为了唯一标识一个人而添加的一个键。人们往往没有ids,但关系通常有一个名为 的代理键id。因此,id密钥不是从 Personhood 域派生的。

也就是说,id, email, 和ssn每个函数都决定了Person表上的所有其他属性。它们都是候选键(因此是超级键)。

当非键属性在功能上确定其他属性或仅候选键的一部分确定其他属性时,就会发生 BCNF 违规。由于每个属性本身都是一个候选键,因此不存在 BCNF 违规。

钥匙不是必须是最小的吗?

如果代理键代表复合自然键怎么办?例如,一个Films表,其中titleoriginal_release_date组合形成一个自然键,一个id字段充当代理键。{ title, original_release_date} 键是否违反了键最小的要求?

这是对极简定义的误解。仅仅因为代理键包含比自然键少的属性并不意味着它是奇异的最小键。如果不存在也是候选键的键的适当子集,则候选键是最小的。title不唯一标识 a Film,也不唯一标识original_release_date。因此,即使在代理键代表复合自然键的情况下,也不会违反范式。


Con*_*lls 7

可以说代理键不是表的自然键,因此可以说它违反了3NF的“只有键”原则。在实践中,代理键只是自然键的占位符,所以这个论点充其量只是学术上的。

一些晦涩的范式需要复合键才能相关。在这种情况下会想到 5NF,因为它需要 M:M 关系上的多个重叠复合键才能违反 5NF。

  • 5NF是“默默无闻”?!更重要的是,“只有关键”的陈词滥调并不是对 3NF 的非常精确的描述。3NF 同样关注*所有*关系的候选键,而不仅仅是一个。代理键不会违反 3NF,除非它引起某些部分键依赖。大多数人将“代理”理解为仅由任意值组成的简单(非复合)键,因此涉及代理的部分键依赖是极不可能的。 (5认同)
  • @TulainsCórdova不,代理键不违反[Edgar Codd的3NF定义](https://en.wikipedia.org/wiki/Third_normal_form#Definition_of_third_normal_form),因为正如philipxy所说,它们不会对候选键创建传递依赖,因为候选键取决于代理键。您可以使用 [Carlo Zaniolo 的 3NF 等效定义](https://en.wikipedia.org/wiki/Third_normal_form#Definition_of_third_normal_form) 更轻松地看到这一点,因为代理键是超级键,所以这并没有违反。 (3认同)