`
accpchf
  • 浏览: 25835 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

三范式数据库设计和反范式的思考(转)

 
阅读更多

   一个人要成长到项目经理的位置,要懂的数据库的设计原则,虽然好多东西都是理论性比较强的东西;当我们拿到一个新的需求,我们把需求从头到尾搞清楚 后,就开始画流程图—>用例图—->设计数据库—->进入开发阶段—->编码—->测试—–>项目上线,至此一个项 目就算完成。

在这里我们只对设计数据库的这一块的范例进行讨论。提到范例,大家都知道第一范式,第二范式,第三范式。可是我们明白这些范式的深层含意吗?这些范式什么时候用,用它们有什么好处呢?下面我们就一起带着这些问题边想边读下面的文章。

范式 :英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程 中所要遵循的规则和指导方法。数据库的设计范式是数据库设计所需要满足的规范。只有理解数据库的设计范式,才能设计出高效率、优雅的数据库,否则可能会设 计出错误的数据库.目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。满足最低要求的叫第一范 式,简称1NF。在第一范式基础上进一步满足一些要求的为第二范式,简称2NF。其余依此类推。通常所用到的只是前三个范式,即:第一范式(1NF),第 二范式(2NF),第三范式(3NF)。下面就简单介绍下这三个范式。

第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列。
考虑这样一个表:【联系人】(姓名,性别,电话)
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。

第二范式(2NF): 首先要满足它是1NF,另外还需要包含两部分内容:一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。
因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。
可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和 【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多 次重复的情况。

第三范式(3NF): 首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。
其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。

问:第二范式和第三范式如何区别?
第二范式:非主键列是否依赖主键(包括一列通过某一列间接依赖主键),要是有依赖关系的就是第二范式;
第三范式:非主键列是否是直接依赖主键,不能是那种通过传递关系的依赖的。要是符合这种就是第三范式;
问:范式的存在有什么好处?
范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦。

范式再给我们带来的上面的好处时,同时也伴随着一些不好的地方:按照范式的规范设计出来的表,等级越高的范式设计出来的表越多。如第一范式可能设计 出来的表可能只有一张表而已,再按照第二范式去设计这张表时就可能出来两张或更多张表,如果再按第三范式或更高的范式去设计这张表会出现更多比第二范式多 的表。表的数量越多,当我们去查询一些数据,必然要去多表中去查询数据,这样查询的时间要比在一张表中查询中所用的时间要高很多。

也就是说我们所用的范式越高,对数据操作的性能越低。所以我们在利用范式设计表的时候,要根据具体的需求再去权衡是否使用更高范式去设计表。在一般的项目中,我们用的最多也就是第三范式,第三范式也就可以满足我们的项目需求,性能好而且方便管理数据;

当我们的业务所涉及的表非常多,经常会有多表发生关系,并且我们对表的操作要时间上要尽量的快,这时可以考虑我们使用“反范式”。反范式,故名思义,跟范式所要求的正好相反,在反范式的设计模式,我们可以允许适当的数据的冗余,用这个冗余去取操作数据时间的缩短。也就是用空间来换取时间,把数据冗余在多个表中,当查询时可以减少或者是避免表之间的关联;

如我们现在要对一个 学校的课程表进行操作,现在有两张表,一张是学生信息student(a_id,a_name,a_adress,b_id)表,一张是课程表 subject(b_id,b_subject),现在我们需要一个这样的信息,把选择每个课程的的课程名称和学生姓名输出来:

SQL语句为:select  B.b_id,B.b_subject,A_a_name from student A ,subject B;

当上面的数据量不多时,我们这样去查询没有问题;当我们的两张表的数据都是在百万级的时候,我们去查上面的信息, 问题出现了,这个查询动不动就是几百毫秒,甚至更慢,这样的查询效率根本不能满足我们对于网页速度的要求(一般不能超过100毫秒),怎么办?当然要反范式,在课程表里面添加冗余字段——学生姓名,这样我们就可以通过下面的查询达到同样的目的:

SQL语句为:select  b_id,b_subject,a_name from subject B;

将两个查询放在一起查看执行计划,就会发现,第一个查询开销占了92%,而第二个才8%,也就是说,第二个查询比起第一个查询,效率上优化了10倍以上,成果显著啊。

总结:

当我们开始着手一个项目后,范式的应用是这样的变化的:

第三范式数据库的设计—–>当数据量越来越大,达到百万级时,经常要对一些多表数据进行大范围高频率进行操作——->范式数据库的设计———->网站的数据量再持续增长———->范式和反范式的数据库设计

当我们的数据量非常大,目前除了对数据库的设计改动外,还可以通过对数据层进行缓存处理。如现在使用效果显著的Memcached ,一个分布式的缓存系统,我们将数据库信息以实体类的方式和图片文件等保存在Memcached里面,只要是可序列化的数据,经过装箱和拆箱,都可以保存 到Memcached中并随时可以快速的访问到这些对象,Memcached可以解决大量数据的缓存并保持多台Web Server得到的缓存数据是一致的。

如果大家对上面的数据库的范式及反范式有好的见解,欢迎留言一起讨论。

分享到:
评论
1 楼 永恒班得瑞 2016-12-10  

相关推荐

    数据库范式设计实验报告.doc

    中国海洋大学实验报告 年 月 日 姓名 ... ----------------------- 数据库范式设计实验报告全文共3页,当前为第1页。 数据库范式设计实验报告全文共3页,当前为第2页。 数据库范式设计实验报告全文共3页,当前为第3页。

    如何设计数据库.doc

    为什么需要设计数据库 这里我们思考两个问题: 修建茅屋需要设计吗?修建大厦需要设计吗? 结论是:当数据库比较复杂(如数据量大,表较多,业务关系复杂)时,我们需要先 设计数据库; 因为,良好的数据库设计能够...

    基于面向对象(OO)的数据库设计模式探讨

    内容面向对象的数据库设计对象关系模型实体对象关系模型应用总结下载参考资料简介: 面向对象(OO)和三范式(3NF)都是成熟的设计方法,本文基于面向对象设计思想和三范式数据库设计方法,提出一种实体对象分层...

    数据库资料

    应用范式规范化设计应用第二范式规范化应用第三范式规范化规范化和性能的关系 总结 2-1 在需求分析阶段,设计数据库的一般步骤为:收集信息标识对象标识每个对象的属性标识对象之间的关系在概要设计阶段和详细设计...

    租车系统模块与数据库设计.docx

    订单的主从表设计在ERP系统中非常常见,在OrderHeader中存放客户信息,在OrderDetail中存放此客户本次订购的多种产品(每种产品若干数量),这种设计也更符合范式。我当初在进行设计时,首先想到的也是主从表设计,...

    jsp仓库管理系统

    关系模式的设计至少要满足第三范式。数据库的设计要考虑安全性和完整性的要求。学生应从能力培养的角度出发,充分重视,认真做好课前的各项准备工作,在任课教师的指导下,充分发挥主观能动性,独立思考,努力钻研,...

    ArchSummit 2022全球架构师峰会北京站(公开)PPT汇总(52份).zip

    第四范式面向机器学习的高可用高并发数据库 直播亿级并发下的高可用技术实践 高性能 Kubernetes 元数据存储 KubeBrain 的设计思路和落地效果 基于 DDD 思想的酒店整体架构战略调整 基于 DDD 思想的应用架构 COLA 在...

    java 编程入门思考

    1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段1:要制作什么? 1.12.4 阶段2:开始构建? 1.12.5 阶段3:正式创建 1.12.6 阶段4:校订 1.12.7 计划的回报 1.13 Java还是C++? 第2章 ...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    3.4 数据库正规化和其他设计主题 3.4.1 解决函数依赖的范式 3.4.2 更高级的范式 3.4.3 反规范化(Denormalization) 3.4.4 一般化和特殊化 3.5 总结 第4章 查询优化 4.1 本章用到的样本数据 4.2 优化方法论 ...

    asp.net知识库

    DbHelperV2 - Teddy的通用数据库访问组件设计和思考 也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典...

    2021阿里云开发者大会演讲PPT汇总.zip

    基于实时深度学习的推荐系统 架构设计和技术演进 基于MaxCompute快速打通数仓和数据湖: 湖仓一体实践 面向云原生可观测性的平台架构实践 云原生技术与最佳实践论坛: 云原生应用新边界 基于OpenYurt和EdgeXFoudry...

    oracle教案(doc)+SQL Reference 10g(chm).rar

    4. 数据库范式设计 114 4.1 第一范式(1NF) 114 4.2 第二范式(2NF) 114 4.3 第三范式(3NF) 114 5. 数据库设计工具(重点) 114 6. 数据库设计分析(重点) 114 6.1 需求: 114 6.2 实现 114 7. PL/SQL编程 114 7.1 ...

    GOTC 2021 全球开源技术峰会 - 深圳站PPT合集(44份).zip

    第四范式开源商业化的思考 分布式文件系统在云原生时代的挑战与趋势 构建可信的大前端工程体系 基于 EdgeX Foundry 的电力行业的边缘计算实践 基于 Flutter 的 Web 渲染引擎「北海+Kraken」 基于 Kuiper 和 KubeEdge...

    构建高性能Web站点_PDF_45.5M

    11.8 反范式化设计 11.9 放弃关系型数据库 第12章 Web负载均衡 12.1 一些思考 12.2 HTTP重定向 12.3 DNS负载均衡 12.4 反向代理负载均衡 12.5 IP负载均衡 12.6 直接路由 12.7 IP隧道 12.8 考虑可用性 第...

    构建高性能Web站点(PDF)

    11.8 反范式化设计 11.9 放弃关系型数据库 第12章 Web负载均衡 12.1 一些思考 12.2 HTTP重定向 12.3 DNS负载均衡 12.4 反向代理负载均衡 12.5 IP负载均衡 12.6 直接路由 12.7 IP隧道 12.8 考虑可用性 第...

    构建高性能Web站点(PDF)-第2部分

    11.8 反范式化设计 11.9 放弃关系型数据库 第12章 Web负载均衡 12.1 一些思考 12.2 HTTP重定向 12.3 DNS负载均衡 12.4 反向代理负载均衡 12.5 IP负载均衡 12.6 直接路由 12.7 IP隧道 12.8 考虑可用性 第...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    3.4 数据库正规化和其他设计主题86 3.4.1 解决函数依赖的范式87 3.4.2 更高级的范式92 3.4.3 反规范化(Denormalization)95 3.4.4 一般化和特殊化96 3.5 总结98 第4章 查询优化99 4.1 本章用到的样本数据99 4.2 ...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    3.4 数据库正规化和其他设计主题86 3.4.1 解决函数依赖的范式87 3.4.2 更高级的范式92 3.4.3 反规范化(Denormalization)95 3.4.4 一般化和特殊化96 3.5 总结98 第4章 查询优化99 4.1 本章用到的样本数据99 ...

Global site tag (gtag.js) - Google Analytics