我正在尝试掌握 1NF,我想知道下表是否为 1NF。我将假设没有,因为在列中 first_name、last_name 和 full_name 可以重复,因此需要转移到一个新表,其中有列 user_id 和 first_name、last_name 和 full_name。下图是参考数据库的截图。
2 回答
1NF 是关于原子性,而不是冗余(这就是更高范式的意义)。本质上,如果所有属性都是原子的,那么您的表就是 1NF。
显然,表是否在 1NF 中取决于您定义为“原子”的内容。“原子性”实际上意味着什么是一个有争议的问题,但我会在这里采取务实的逐案处理方法,并简单地问:
在我试图解决的问题的上下文中,访问1值的任何部分是否有意义,或者我总是访问整个值?
如果我总是访问整体,它在那个特定的上下文中是原子的。
在您的示例中,您可能希望单独访问first_name
和last_name
,因此full_name
将是非原子的,这将是违反 1NF 的原因。但是,如果您知道永远不需要分别访问名字和姓氏,那么您可以只使用full_name
并且仍然不违反 1NF。
1 “访问”值在这里应该得到相当广泛的理解。它可能显然意味着从数据库中读取它,但也可能意味着在约束中使用它,或者索引它等等......
当然可以。
您对当前设计所说的话,如果它是第一个正常的,那么单个“实体”(让我们称之为一个人)与一个且只有一个用户记录相关联。
如果您将姓名字段移到单独的表中,您基本上是在说一个“人”可能与一个或多个用户记录相关联,并且该人在更新其姓名时应该对所有用户进行相同的更改他们的“用户”
如果您需要这样的结构,表格看起来更像:
user_id|username|password|email|person_id
每个“人”都有一个单独的表格
person_id|first_name|last_name|full_name
第一正常不是关于复制数据。只看名字,你很可能有很多人叫“鲍勃”或“爱丽丝”,只是因为数据被一遍又一遍地重复,并不等于说表有重复数据。关键是每条记录都应该是原子的。