Java学习-MySQL-数据库的设计
为什么需要数据规范化
- 信息重复
- 更新异常
- 插入异常
- 无法正常显示信息
- 删除异常
- 丢失有效信息
三大范式
第一范式(原子性)
要求数据库表的每一列都是不可分割的原子数据项。
举例:
学号 | 姓名 | 性别 | 家庭信息 | 学校信息 |
---|---|---|---|---|
1001 | 李白 | 男 | 3口人,北京 | 硕士,研二 |
002 | 韩信 | 男 | 2口人,天津 | 本科,大四 |
002 | 赵云 | 男 | 4口人,上海 | 本科,大三 |
004 | 刘备 | 男 | 2口人,重庆 | 硕士,研一 |
“家庭信息”和“学校信息”均不满足原子性要求,不满足第一范式,调整如下:
学号 | 姓名 | 性别 | 家庭信息 | 地址 | 学历 | 年级 |
---|---|---|---|---|---|---|
001 | 李白 | 男 | 3口人 | 北京 | 硕士 | 研二 |
002 | 韩信 | 男 | 2口人 | 天津 | 本科 | 大四 |
003 | 赵云 | 男 | 4口人 | 上海 | 本科 | 大三 |
004 | 刘备 | 男 | 2口人 | 重庆 | 硕士 | 研二 |
第二范式(每张表只描述一件事)
满足第一范式,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)。第二范式需要确保数据库中的每一列都和主键相关,而不能只与主键的某一部分相关。
举例说明:
订单号 | 产品号 | 产品数量 | 产品价格 | 订单金额 | 订单时间 |
---|---|---|---|---|---|
2008003 | 205 | 100 | 8.9 | 2870 | 20080103 |
2008003 | 206 | 200 | 9.9 | 2870 | 20080103 |
2008005 | 207 | 200 | 10 | 2000 | 20080203 |
2008006 | 207 | 400 | 12 | 4800 | 20080206 |
2008007 | 207 | 1000 | 14 | 14000 | 20080209 |
2008008 | 210 | 240 | 8 | 12255 | 20080423 |
2008008 | 211 | 300 | 8 | 12255 | 20080423 |
2008008 | 212 | 350 | 15.9 | 12255 | 20080423 |
“产品数量”、“产品价格”与“订单号”和“产品号”都相关,但是“订单金额”和“订单时间”仅与“订单号”相关,与“产品号”无关,不满足第二范式,调整如下:
订单号 | 产品号 | 产品数量 | 产品价格 |
---|---|---|---|
2008003 | 205 | 100 | 8.9 |
2008003 | 206 | 200 | 9.9 |
2008005 | 207 | 200 | 10 |
2008006 | 207 | 400 | 12 |
2008007 | 207 | 1000 | 14 |
2008008 | 210 | 240 | 8 |
2008008 | 211 | 300 | 8 |
2008008 | 212 | 350 | 15.9 |
订单号 | 订单金额 | 订单时间 |
---|---|---|
2008003 | 2870 | 20080103 |
2008003 | 2870 | 20080103 |
2008005 | 2000 | 20080203 |
2008006 | 4800 | 20080206 |
2008007 | 14000 | 20080209 |
2008008 | 12255 | 20080423 |
2008008 | 12255 | 20080423 |
2008008 | 12255 | 20080423 |
第三范式
满足第一范式和第二范式,任何非主属性不依赖于其他非主属性(在2NF基础上消除传递依赖)。第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
距离说明:
学号 | 姓名 | 性别 | 家庭人口 | 班主任 | 班主任性别 | 班主任年龄 |
---|---|---|---|---|---|---|
20150001 | 李白 | 男 | 3 | 陈洁 | 女 | 35 |
20150002 | 杜甫 | 男 | 2 | 陈洁 | 女 | 35 |
20150003 | 王维 | 男 | 4 | 陈洁 | 女 | 32 |
20150004 | 白居易 | 男 | 3 | 李莉 | 女 | 32 |
20150005 | 刘禹锡 | 男 | 4 | 李莉 | 女 | 32 |
20150006 | 李清照 | 女 | 5 | 王安 | 男 | 29 |
20150007 | 苏轼 | 男 | 2 | 王林 | 男 | 34 |
20150008 | 屈原 | 男 | 4 | 王林 | 男 | 34 |
20150009 | 陶渊明 | 男 | 1 | 王安 | 男 | 29 |
所有属性都完全依赖与“学号”,满足第二范式,但“班主任性别”和“班主任年龄”直接依赖的是“班主任姓名”而不是主键“学号”,调整如下:
学号 | 姓名 | 性别 | 家庭人口 | 班主任 |
---|---|---|---|---|
20150001 | 李白 | 男 | 3 | 陈洁 |
20150002 | 杜甫 | 男 | 2 | 陈洁 |
20150003 | 王维 | 男 | 4 | 陈洁 |
20150004 | 白居易 | 男 | 3 | 李莉 |
20150005 | 刘禹锡 | 男 | 4 | 李莉 |
20150006 | 李清照 | 女 | 5 | 王安 |
20150007 | 苏轼 | 男 | 2 | 王林 |
20150008 | 屈原 | 男 | 4 | 王林 |
20150009 | 陶渊明 | 男 | 1 | 王安 |
班主任姓名 | 班主任性别 | 班主任年龄 |
---|---|---|
陈洁 | 女 | 35 |
李莉 | 女 | 32 |
王林 | 男 | 34 |
王安 | 男 | 29 |
规范和性能问题
关联查询的表最好不要超过三张
- 考虑商业化的需求和目标(成本、用户体验)数据库的性能更加重要;
- 在规范性能的问题的时候,需要适当考虑规范性;
- 故意给某些表增加一些冗余字段,从多表查询变为单表查询;
- 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)。