- 参考 数据库设计三大范式(简单易懂)
- 为了减少冗余,建立结构合理的表格,设计数据库时要遵循一定的规则,然后这些规则就是所谓的范式
- 范式的话,有一下几个,但一般用到的是123
-
第一范式,保证每一列的原子性
- 也就是说,数据库表里的字段要细拆分到最小,不要将两个以上含义的内容放到一列里,比如说
广东广州,应该分为广东广州两列 - 燃鹅,在我实际的游戏开发中,很多时候遇到的都是不遵循这个规则的,比如在一个字段里塞入一个数组,或者是将整个数据放入一个类型为
blob的字段。这样做在开发时的确很爽,因为不需要去做太多的数据库操作,但是不好的地方不少,比如- 写入时整段写入,就算你只改变了一个变量的值
- 查询时需要做解析,而且无法用数据库的逻辑来筛选数据
- 合服时,需要专门写代码来处理这些字段
- 所以说,设计时还是尽量去满足第一范式
- 也就是说,数据库表里的字段要细拆分到最小,不要将两个以上含义的内容放到一列里,比如说
-
第二范式,保证其他列与主键列有关
- 首先要满足第一范式
- 确保每一列和主键相关,而不是只和主键的一部分相关。主键不一定就只有一列,可以是多列组成的一个主键。比如说一个订单表,如下
订单id 书本id 书本名称 价格 数量 购买人 电话 201909181 1 书本1 100 1 甲 12345678 201909181 2 书本2 200 2 甲 12345678 201909182 1 书本1 100 2 乙 12345679 -
可以看到,记录里的购买人的信息只与订单相关,书本信息至于书本id相关,如果杂糅在一起,就会导致数据冗余,所以可以将其拆分下面的表
订单id 书本id 数量 购买人 电话 201909181 1 1 甲 12345678 201909181 2 2 甲 12345678 201909182 1 2 乙 12345679 书本id 书本名称 价格 1 书本1 100 2 书本2 200 -
第三范式,保证其他列与主键列直接相关
- 首先要满足第二范式
- 然后保证每一列和主键是直接关系,不能存在间接关系。比如说上面的表格,购买的人的电话只跟玩家相关,然后玩家和订单id相关,这样的话是不符合第三范式的,所以需要改为
订单id 书本id 数量 购买人id 201909181 1 1 1 201909181 2 2 1 201909182 1 2 2 书本id 书本名称 价格 1 书本1 100 2 书本2 200 购买人id 购买人名称 电话 1 甲 12345678 2 乙 12345679
-