1. 背景
在设计数据库表的时候,我们需要设计至少满足第一范式的表。在SQL数据库的限制下,我们依然有可能创建出不符合第一范式的表。
2. 官方定义
在《数据库系统概论》第五版中是这么写的:
作为一个二维表,关系要符合一个最基本的条件:每一个分量必须是不可分的数据项。满足了这个条件的关系模式就属于第一范式(1NF)。
其中包含一些专业术语:关系,分量
要想彻底理解,只能看书研究严格数学定义。
在这个定义中,值得琢磨的几个字是“不可分”。到底什么样的数据叫做“不可分”?很明显,一个数字,一个名字,这样子的数据是不可分的。
3. 反面示例:
姓名 | 年龄 | 早餐 | 数量 |
张三 | 12 | 鸡蛋 | 1 |
张三 | 12 | 鸡蛋 | 1 |
王五 | 41 | 豆浆 | 1 |
表1不符合第一范式,因为前两个数据重复。有两个重复数据这都不属于关系了。一般来说可以设置PRIMARY KEY或者UNIQUE属性避免重复数据。
姓名 | 年龄 | 早餐 | 数量 |
张三 | 12 | 鸡蛋,包子 | 1,1 |
李四 | 32 | NULL | NULL |
王五 | 41 | 豆浆,鸡蛋,油条 | 1,2,1 |
表2不符合第一范式,因为一个cell中包含了多个数据。一般来说解决办法就分成多条数据,如表3
姓名 | 年龄 | 早餐 | 数量 |
张三 | 12 | 鸡蛋 | 1 |
张三 | 12 | 包子 | 1 |
李四 | 32 | NULL | NULL |
王五 | 41 | 豆浆 | 1 |
王五 | 41 | 鸡蛋 | 2 |
王五 | 41 | 油条 | 1 |
表3符合第一范式。
但是对于表2,有人会想到另一种解决办法,如表4
姓名 | 年龄 | 早餐1 | 数量1 | 早餐2 | 数量2 | 早餐3 | 数量3 |
张三 | 12 | 鸡蛋 | 1 | 包子 | 1 | NULL | NULL |
李四 | 32 | NULL | NULL | NULL | NULL | NULL | NULL |
王五 | 41 | 豆浆 | 1 | 鸡蛋 | 2 | 油条 | 1 |
表4虽然符合第一范式,但是不符合实际需求,假如一个人的早餐多了,还需要加入早餐4,毕竟表的结构一般是不能随意变动的。
如果说早餐的顺序比较重要的话,表5在考虑了早餐的顺序后,符合第一范式。
姓名 | 年龄 | 早餐 | 数量 | 早餐顺序 |
张三 | 12 | 鸡蛋 | 1 | first |
张三 | 12 | 包子 | 1 | second |
李四 | 32 | NULL | NULL | first |
王五 | 41 | 豆浆 | 1 | first |
王五 | 41 | 鸡蛋 | 2 | second |
王五 | 41 | 油条 | 1 | third |
参考文章:
https://en.wikipedia.org/wiki/First_normal_form
https://www.guru99.com/database-normalization.html