Database design 具有一个代理密钥和两个唯一密钥的BCNF

Database design 具有一个代理密钥和两个唯一密钥的BCNF,database-design,database-normalization,Database Design,Database Normalization,我试图理解BCNF是什么,我有这样一种关系: 学生(id、ssn、电子邮件、姓名、姓氏) 在哪里 id是具有非空和自动递增属性的主代理键 ssn是一个具有非空属性的唯一密钥,并且 电子邮件也是一个具有非空属性的唯一密钥 是否存在任何违反BCNF的情况?如果是,如何通过更好的设计克服这种情况 编辑 我试图编写我的函数依赖项,但如果我错了,请纠正我 有三个属性决定其他属性,所以ssn和电子邮件都存在于等式的左侧和右侧,这令人困惑。这种关系似乎不在bcnf中,但一定是出了什么问题:) 正确回答问题

我试图理解BCNF是什么,我有这样一种关系:

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

在哪里

  • id是具有非空和自动递增属性的主代理键
  • ssn是一个具有非空属性的唯一密钥,并且
  • 电子邮件也是一个具有非空属性的唯一密钥
是否存在任何违反BCNF的情况?如果是,如何通过更好的设计克服这种情况

编辑

我试图编写我的函数依赖项,但如果我错了,请纠正我

有三个属性决定其他属性,所以ssn和电子邮件都存在于等式的左侧和右侧,这令人困惑。这种关系似乎不在bcnf中,但一定是出了什么问题:)


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

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

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


有关BCNF的详细解释,请阅读。

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

例如:打字错误。假设有人想成为一名学生,但她的SSN似乎已经被另一个人使用了,可能是因为打字错误。你应该拒绝新学生,还是删除旧学生?(或者应该允许SSN字段为非唯一或可空?)

更新/最终说明:本主题被标记为“数据数据库设计”和“数据规范化”。我对设计选择做出了反应(这是有争议的)。其他人试图对BCNF方面做出反应(考虑到唯一候选密钥和非空假设,这些方面微不足道)


对一个坏的数据模型进行标准化将得到一个标准化但仍然错误的模型。

如果sedran的一组依赖项已完成,则是。但作为一般规则,缺少重叠键并不自动意味着关系在BCNF中。如果碰巧存在非键依赖项或部分键依赖项,那么它将不会满足BCNF。@sqlvogel-我无法想象如果没有重叠键,您怎么会不在BCNF中。请给我举个例子好吗?例如,依赖关系A->B,其中A和B是非优先的,无论候选密钥是什么,都将违反BCNF(和3NF)。@sqlvogel-我现在明白你的意思了。我想我已经见过3NF了。如果一个设计满足3NF,那么必须有重叠的键来防止它满足BCNF,这样说对吗?选择某些特定键的智慧与否与规范化问题无关,因为这些键已经给出了。要求学生拥有唯一的电子邮件地址和某种类型的唯一税务Id肯定不是一个坏主意。许多真实世界的系统确实需要唯一的电子邮件地址作为标识符,因为它们易于记忆、验证且相对稳定。如果出现了一个重复的SSN,那么不允许它,并要求某人检查其中哪些重复的SSN可能是错误的或无效的是完全明智的。OP是一个玩具示例,它是一个糟糕的玩具示例,因为它对“外来”域做出了隐含的假设。对于真正的玩具示例,老师应该使用真正的玩具问题(如数独、拼字游戏或填字游戏)嗯,告诉亚马逊或微软,他们需要系统的唯一电子邮件地址这一事实使他们成为“玩具”!我认为你是对一个问题做出假设的人,这在规范化理论中是一个非常现实的例子。亚马逊和微软都是商业企业,它们可以对客户施加限制(或拒绝)。政府、学校或大学不能强加任何东西,他们应该模拟和描述现实。作为一个奇怪的例子:一夫多妻制;如果一个一夫多妻制者加入了一些西方国籍,他的婚姻应该如何登记?或者他应该被降级N-1次才能进入系统?设计缺陷与否,这与规范化无关,这是问题所在。如果问题是关于葡萄和葡萄酒产区数据库的标准化,你会说法国葡萄酒比意大利葡萄酒好还是不好?当然,如果一个系统强制执行不存在的事物的唯一性,或者强制执行不存在的事物的存在,这就是一个“设计缺陷”。这不是我要问的问题。
id -> (ssn, email, name, surname)
ssn -> (id, email, name, surname)
email -> (id, ssn, name, surname)