【问题标题】:Third Normal Form of a Users table with user ID and username columns具有用户 ID 和用户名列的用户表的第三范式
【发布时间】:2018-08-09 22:57:50
【问题描述】:

我一直在学习数据库规范化,我有一个关于我的网络应用程序的用户表的问题。

表架构如下:

users (user_id, username, password, first_name, last_name, ver_code, verified)

我想知道这是否在 3NF 中。它在 1NF 中(显然),因为行列的交集包含单个值。它自动在 2NF 中,因为主键不是复合的。是3NF吗?

据我了解,传递依赖是指非主属性依赖于其他非主属性,而不是依赖于主属性或主键。因此,user_id 是主键,而用户名不是主键而是主要属性。所以表在3NF中。

这是对的吗?还是我错过了什么?上面传递依赖的定义是否正确?

编辑:

我认为规范化是客观的,这就是为什么我没有费心说明我的参考。我想按照 Connolly 和 Begg 的 Database Systems: A Practical Approach to Design, Implementation, and Management 一书将我的表放在 3NF 中。

这里是函数依赖。 user_id username 都是唯一字段,因此它们都是候选键。

fd1:user_id -> username, password, first_name, last_name, ver_code, verified

fd2:username -> user_id, password, first_name, last_name, ver_code, verified

【问题讨论】:

  • 嗨。您的 2NF “自动”是错误的,因为 1. 您没有显示所有 CK 都是简单的 & 2. 所有 CK 都简单并不意味着 2NF,除非没有 FD 将 {} 作为行列式。不,您对传递 FD 的定义不正确,您将其与 2NF 的定义混淆了。 “据我了解”表示您认为自己了解它。请阅读点击谷歌搜索“stackexchange 作业”。说出您正在遵循的参考资料和/或引用您正在遵循的定义和流程并显示您遇到的问题。如果您的参考资料谈论的是 PK 而不是 CK,那么它就是垃圾。 PS 没有 FD 就无法正常化。
  • PS“1NF”has no single meaning。再说一遍,你的参考资料是什么?
  • "我认为规范化是客观的......" 规范化这个词有多重含义。这可能意味着分解关系以获得更高的范式。它可能意味着支配你如何分解关系的形式理论。它在其他上下文中具有其他含义,例如在统计中。在数据的关系理论中,对关系进行规范化的过程是确定性的:每个从相同的函数依赖集开始的人都应该得到相同的结果。 结果,因为在一般情况下,一组 FD 可能让您以两种或多种有效方式分解关系。

标签: database database-schema database-normalization 3nf


【解决方案1】:

通过 BCNF 的范式由函数依赖 (FD) 决定,而不是由属性名称决定。您没有向我们展示任何 FD。

因为主键不是复合的,所以它自动在 2NF 中。

没有。 Every 范式考虑了每个 候选键。还有其他候选键吗?不知道FD就无法知道。 (除非您告诉我们 FD 是什么,否则我们无法知道。)

我可以想象 {username, ver_code} 或 {username, password} 的组合可能是唯一的。

据我了解,传递依赖是指非主属性依赖于其他非主属性,而不是依赖于主属性或主键。

如果一个或多个非主属性确定一个或多个非主属性,则具有传递依赖。 (在关系理论中,您会看到写成 A->B 的函数依赖关系。但 AB 指的是 sets 属性。)主要属性是那些属于 any 的属性 候选键,而不仅仅是主键。

所以,user_id 是主键,而 username 不是主键而是主要属性。

只有当它是候选键的一部分时,属性“用户名”才能成为主要属性。任何候选键。您不支持(不言而喻的)“用户名”是候选键的一部分。

【讨论】:

  • 谢谢迈克,非常有帮助。我在网上阅读的每一个互联网资源都说不同的东西(或者用不同的术语可能是相同的东西?)。我可能引用了 NF 的错误定义。我已按要求使用 FD 更新了问题。
  • @CesarF 忘记网站吧,实际上有几十种已出版的学术数据库教科书 pdf 是在线免费的。虽然你提到的那个很穷。另一方面,第 4 版在一个小蓝框中定义了“传递依赖”,这不是您在问题中写的 - 它与主要属性无关,正如我在评论中所说的问题您正在将其定义与 3NF 之一混淆。得到正确的定义。例如,“是唯一字段,因此它们都是候选键”是错误的推理。唯一且不包含更小的唯一(此处为 {})表示 CK。
猜你喜欢
  • 2011-09-05
  • 2013-11-17
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多