论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
数据库
›
SQL-Server
›
数据库设计规范——实战案例
数据库设计规范——实战案例
丝
金牌会员
|
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 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
丝
金牌会员
这个人很懒什么都没写!
楼主热帖
ShardingSphere 异构迁移最佳实践:将3 ...
本科毕设CTF平台-MarsCTF
MySQL 5.7 安装教程(全步骤、保姆级教 ...
KubeEdge 1.12版本发布,稳定性、安全 ...
Grafana 系列文章(一):基于 Grafana ...
学生信息管理系统(JAVA+MYSQL) ...
15.Linux和Windows入侵排查
Sickos1_1
mysql数据迁移,通用windows->linux,li ...
Redis介绍与安装
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
程序人生
分布式数据库
DevOps与敏捷开发
Java
Mysql
快速回复
返回顶部
返回列表