数据库设计规范——实战案例

  金牌会员 | 2024-12-2 08:40:38 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 992|帖子 992|积分 2976

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次
1.题目描述
2.迭代1次:考虑1NF
3.迭代2次:考虑2NF
4.迭代3次:考虑3NF
5.反范式化:业务优先的原则


1.题目描述

商超进货体系中的进货单表进行剖析:
进货单表:

这个表中的字段很多,表里的数据量也很惊人。大量重复导致表变得巨大,效率极低。如何改造?
在实际工作场景中,这种由于数据表结构设计不公道,而导致的数据重复的现象并不少见。每每是体系虽然可以大概运行,承载能力却很差,轻微有点流量,就会出现内存不足、CUP利用率飙升的环境,甚至会导致整个项目失败

2.迭代1次:考虑1NF

第一范式要求:所有的字段都是基本数据字段,不可进一步拆分。这里需要确认,所有的列中,每个字段只包罗—种数据。
这张表里把“property"这一字段,拆分成"specification (规格)“和"unit(单位)”,这2个字段如下:


3.迭代2次:考虑2NF

第二范式要求,在满足第一范式的基础上,还要满足数据表里的每一条数据记载,都是可唯一标识的。而且所有字段,都必须完全依赖主键,不能只依赖主键的一部分
第1步,就是要确定这个表的主键。通过观察发现,字段““listnumber(单号)”+"barcode(条码)"可以唯一标识每一条记载,可以作为主键。
第2步,确定好了主键以后,判断哪些字段完全依赖主键,哪些字段只依赖于主键的一部分。把只依赖于主键一部分的字段拆分出去,形成新的数据表。
首先,进货单明细表里面的“goodsname(名称)" "specification(规格)“unit(单位)“这些信息是商品的属性,只依赖于“barcode(条码)”,不完全依赖主键,可以拆分出去。把这3个字段加上它们所依赖的字段”“barcode(条码)”,拆分形成一个新的数据表“商品信息表”。
这样一来,原来的数据表就被拆分成了两个表
商品信息表:

进货单表:

别的,字段“supplierid(供应商编号)”“suppliername(供应商名称)”"stock(仓库)“只依赖于"listnumber(单号)”,不完全依赖于主键,以是,可以把"supplierid”“suppliername"stock"这3个字段拆出去,再加上它们依赖的字段"listnumber(单号)””,就形成了一个新的表“进货单头表”。剩下的字段,会构成新的表,我们叫它”进货单明细表”。
原来的数据表就拆分成了3个表
进货单头表:

进货单明细表:

商品信息表:

现在来分析一下拆分后的3个表,包管这3个表都满足第二范式的要求
第3步,在"商品信息表"中,字段"barcode"是有大概存在重复的,比如,用户门店大概有散装称重商品和自产商品,会存在条码共用的环境。以是,所有的字段都不能唯一标识表里的记载。这个时候必须给这个表加上一个主键,比如说是自增字段"itemnumber”。
现在就可以把进货单明细表里面的字段"barcode"都替换成字段"itemnumber",这就得到了新的如下表
进货单明细表:

商品信息表:

拆分后的3个数据表就全部满足了第二范式的要求

4.迭代3次:考虑3NF

进货单头表另有数据冗余的大概。因为“supplername "依赖"supplierid"那么,这个时候,就可以按照第三范式的原则进行拆分了。进一步拆分一下进货单头表,把它拆解成供货商表和进货单头表。
供货商表:

进货单头表:

这2个表都满足第三范式的要求了

5.反范式化:业务优先的原则

        在进货单明细表中,quantity * importprice = importvalue、“importprice"、“quantity"和"importvalue可以通过恣意两个盘算出第三个来,这就存在冗余字段。如果严格按照第三范式的要求,应该进行进一步优化。优化的办法是删除此中一个字段,只保存别的2个,这样就没有冗余数据了。
        但是,真的可以这样做吗?要回答这个题目就要先相识下实际工作中的业务优先原则。
        所谓的业务优先原则,就是指一切以业务需求为主,技术服务于业务。**完全按照理论的设计不肯定就是最优,还要根据实际环境来决定。**这里就来分析一下差别选择的利与弊。
        对于quantity * importprice =importvalue,看起来"importvalue"似乎是冗余字段,但并不会导致数据不划一,但是,如果把这个字段取消,是会影响业务的。
因为有的时候,供货商会经常进行一些促销活动,按金额促销,那他们拿来的进货单只有金额,没有价格。而”“importprice"反而是通过“importvalue”="quantity"盘算出来的,颠末四舍五入,会产生较大的偏差。这样日积月累,最终会导致查询效果出现较大偏差,影响体系的可靠性。
举例:进货金额(importvalue)是25.5元,数目(quantity)是 34,那么进货价格(importprice)就等于25.5/34=0.74元,但是如果用这个盘算出来的进货价格(importprice)来盘算进货金额,那么,进货金额(importvalue)就等于0.74x34=25.16元,此中相差了25.5-25.16=0.34元
以是,本着业务优先的原则,在不影响体系可靠性的条件下,可适当增加数据冗余,保存“importvalue"importprice”和“quantity"。
因此,末了我们可以把进货单表拆分成下面的4个表:
进货单明细表:

商品信息表:

供货商表:

进货单头表:

这样一来,我们就避免了冗余,而且还可以大概满足业务的需求,这样的数据表设计,才是合格的设计。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表