-1

我正在尝试掌握 1NF,我想知道下表是否为 1NF。我将假设没有,因为在列中 first_name、last_name 和 full_name 可以重复,因此需要转移到一个新表,其中有列 user_id 和 first_name、last_name 和 full_name。下图是参考数据库的截图。

http://imgur.com/kerlB

4

2 回答 2

4

1NF 是关于原子性,而不是冗余(这就是更高范式的意义)。本质上,如果所有属性都是原子的,那么您的表就是 1NF。

显然,表是否在 1NF 中取决于您定义为“原子”的内容。“原子性”实际上意味着什么是一个有争议的问题,但我会在这里采取务实的逐案处理方法,并简单地问:

在我试图解决的问题的上下文中,访问1值的任何部分是否有意义,或者我总是访问整个值?

如果我总是访问整体,它在那个特定的上下文中是原子的。

在您的示例中,您可能希望单独访问first_namelast_name,因此full_name将是非原子的,这将是违反 1NF 的原因。但是,如果您知道永远不需要分别访问名字和姓氏,那么您可以使用full_name并且仍然不违反 1NF。


1 “访问”值在这里应该得到相当广泛的理解。它可能显然意味着从数据库中读取它,但也可能意味着在约束中使用它,或者索引它等等......

于 2012-09-20T00:20:10.150 回答
1

当然可以。

您对当前设计所说的话,如果它是第一个正常的,那么单个“实体”(让我们称之为一个人)与一个且只有一个用户记录相关联。

如果您将姓名字段移到单独的表中,您基本上是在说一个“人”可能与一个或多个用户记录相关联,并且该人在更新其姓名时应该对所有用户进行相同的更改他们的“用户”

如果您需要这样的结构,表格看起来更像:

user_id|username|password|email|person_id

每个“人”都有一个单独的表格

person_id|first_name|last_name|full_name

第一正常不是关于复制数据。只看名字,你很可能有很多人叫“鲍勃”或“爱丽丝”,只是因为数据被一遍又一遍地重复,并不等于说表有重复数据。关键是每条记录都应该是原子的。

于 2012-09-20T00:01:56.147 回答