【发布时间】: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