6

我试图了解 BCNF 是什么,我有这样的关系:

学生(id、ssn、电子邮件、姓名、姓氏)

在哪里

  • id 是具有非 null 和自动增量属性的主代理键
  • ssn 是具有非空属性的唯一键,并且
  • email 也是具有非空属性的唯一键

是否有任何违反 BCNF 的内容,如果是,我该如何通过更好的设计来克服这种情况?

编辑

我正在尝试编写我的功能依赖项,但如果我错了,请纠正我。

有三个属性决定了其他属性,因此令人困惑的是 ssn 和 email 都存在于等式的左侧和右侧。似乎这种关系不在 bcnf 中,但一定有问题:)

id -> (ssn, email, name, surname)
ssn -> (id, email, name, surname)
email -> (id, ssn, name, surname)
4

3 回答 3

2

正确回答您的问题的方法是确定应该应用哪些功能依赖项。写下你认为的依赖关系。如果每个非平凡依赖项的左侧都是一个超键,则该关系满足 BCNF。

于 2013-05-12T07:15:24.737 回答
1

是的,您的表在 BCNF 中。这是因为您没有任何重叠的候选键 - 即没有出现在两个不同键中的属性。

如果您有其他一些属性 X,它构成了键的一部分 - 例如 (SSN, X) 和 (email, X) - 那么您的表将无法通过 BCNF,因为对于给定的 SSN 和电子邮件对,X 应该是相同的。对于给定的 SSN 和电子邮件,这些键定义将允许不同的 X 值。

有关 BCNF 的良好解释,请阅读此答案

于 2013-05-12T07:58:16.593 回答
-4

emailaddress 或 SSN 的唯一性或不可为空的约束太强了。你可以强制执行,但不应该强制执行。(想想:外国学生。)通常,对不在您管辖范围内的关键域施加任何限制是一个坏主意,即使它们接近于唯一(例如在 SSN 案例中)。

例如:错字。假设有人想以学生身份入伍,但她的 SSN 似乎已被另一个人使用,可能是由于拼写错误造成的。你应该拒绝新学生,还是删除旧学生?(或者您应该允许 SSN 字段是非唯一的还是可空的?)

update/Final note: This topic is tagged "datatbase-design" and "data-normalisation". I reacted on the design choices (which are debatable). Others have attempted to react on the BCNF aspects (which are trivial, given the the UNIQUE candidate keys and the NOT NULL assumption)

Normalising a bad data model will give you a normalised but still wrong model.

于 2013-05-12T09:10:14.630 回答