Java学习-MySQL-数据库的设计(三大范式)

文章介绍了数据规范化的重要性,包括防止信息重复、更新异常等问题,并详细解释了第一范式(原子性)、第二范式(每张表只描述一件事)和第三范式(消除传递依赖)。通过实例展示了如何调整表格结构以满足这些范式,同时讨论了规范与性能之间的平衡,指出在实际应用中需考虑商业化需求和数据库性能。
摘要由CSDN通过智能技术生成

Java学习-MySQL-数据库的设计

为什么需要数据规范化

  • 信息重复
  • 更新异常
  • 插入异常
    • 无法正常显示信息
  • 删除异常
    • 丢失有效信息

三大范式

第一范式(原子性)

要求数据库表的每一列都是不可分割的原子数据项。
举例:

学号姓名性别家庭信息学校信息
1001李白3口人,北京硕士,研二
002韩信2口人,天津本科,大四
002赵云4口人,上海本科,大三
004刘备2口人,重庆硕士,研一

“家庭信息”和“学校信息”均不满足原子性要求,不满足第一范式,调整如下:

学号姓名性别家庭信息地址学历年级
001李白3口人北京硕士研二
002韩信2口人天津本科大四
003赵云4口人上海本科大三
004刘备2口人重庆硕士研二
第二范式(每张表只描述一件事)

满足第一范式,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)。第二范式需要确保数据库中的每一列都和主键相关,而不能只与主键的某一部分相关。
举例说明:

订单号产品号产品数量产品价格订单金额订单时间
20080032051008.9287020080103
20080032062009.9287020080103
200800520720010200020080203
200800620740012480020080206
20080072071000141400020080209
200800821024081225520080423
200800821130081225520080423
200800821235015.91225520080423

“产品数量”、“产品价格”与“订单号”和“产品号”都相关,但是“订单金额”和“订单时间”仅与“订单号”相关,与“产品号”无关,不满足第二范式,调整如下:

订单号产品号产品数量产品价格
20080032051008.9
20080032062009.9
200800520720010
200800620740012
2008007207100014
20080082102408
20080082113008
200800821235015.9
订单号订单金额订单时间
2008003287020080103
2008003287020080103
2008005200020080203
2008006480020080206
20080071400020080209
20080081225520080423
20080081225520080423
20080081225520080423
第三范式

满足第一范式和第二范式,任何非主属性不依赖于其他非主属性(在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
规范和性能问题

关联查询的表最好不要超过三张

  • 考虑商业化的需求和目标(成本、用户体验)数据库的性能更加重要;
  • 在规范性能的问题的时候,需要适当考虑规范性;
  • 故意给某些表增加一些冗余字段,从多表查询变为单表查询;
  • 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值