第一范式以及名字和姓氏

时间:2012-09-19 23:52:56

标签: mysql database database-design normalization

我正在努力抓住1NF,我想知道这个下表是不是1NF。我将假设不,因为在colums中,first_name,last_name和full_name可以重复,因此需要转移到新表,其中有user_id和first_name,last_name和full_name列。下图是参考数据库的屏幕截图。

http://imgur.com/kerlB

2 个答案:

答案 0 :(得分:3)

1NF是关于原子性的,而不是冗余的(这是更高的正常形式)。基本上,如果所有属性都是原子属性,那么您的表格为1NF。

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

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

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

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


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

答案 1 :(得分:1)

当然可以。

您对当前设计所说的内容,如果是第一次正常,则单个“实体”(仅称为“人”)与一个且仅一个用户记录相关联。

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

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

user_id|username|password|email|person_id

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

person_id|first_name|last_name|full_name

第1次正常与重复数据无关。只看第一个名字,你很可能会有很多名字叫“Bob”或“Alice”的人只是因为这些数据一遍又一遍地复制,与说该表有重复数据不同。关键是每条记录都应该是原子的。