创意电子

标题: MySQL进阶系列:数据库设计中的范式究竟该如何使用 [打印本页]

作者: 纪先生笔记    时间: 2021-10-28 00:11
标题: MySQL进阶系列:数据库设计中的范式究竟该如何使用
这篇文章主要为了说明规矩要遵守,但是也别这么枯燥,要知道因场景不同而变化。了解各自的优缺点,在不同业务中根据需求选择使用。


                               
登录/注册后可看大图




我们在项目上进行数据库计划的时候要求遵守三范式,为什么会约束三范式呢:为了淘汰数据冗余。
回想下是哪三范式:


范式

长处:
缺点:
阿里开发手册中规定表join关联不能超过3个,主要原因就是数据量大的时候join查询非常慢,但是也不一定不能关联多个,详细问题详细分析,数据量少的时候多张表关联也没影响的。


反范式

长处:
如果不必要关联,则对大部分查询最差的情况---纵然表没有使用索引,是全表扫描。当数据比内存大时,可能比关联要快得多,因为如许避免了随机I/O(全表扫描基本上是顺序I/O,但不是100%的和引擎有关).
2.单表可以更有效的使用索引计谋。
缺点:


混用范式和反范式

实际上完全范式或者完全反范式都是理论上的。在实际的项目开发中,基本都是混用的,没有严酷的规定。


案例分析:
例A: 假设有一个网站,允许用户发送消息,而且其中一些用户是VIP,如今想查看VIP用户的近10条信息。
SELECT  message.message_text FROM  message  INNER JOIN USER ON message.user_id = USER.user_id WHERE  USER.user_type = 'VIP' ORDER BY  message.published DESC   LIMIT 10;上面sql必要表关联,mysql必要扫描message 表的日期published的索引,对于每一行找到的数据都要到user表检索是不是VIP用户,如果VIP只是很小的一部分,这个效率就很低下了。另一种执行计划是先从user表开始,找所有VIP用户获取并排序,这种可能更糟糕。


2. 完全的反范式,必要在message表中存储user数据,就会存在message数据操纵影响user数据的问题。



3. 混用范式和反范式:修改message表布局增加用户范例字段user_type, 如:message(message_id,user_id,message_text,published,user_type),这种计划可以避免完全范式化带来的表关联查询,也避免了完全反范式的插入删除问题(纵然没有消息用户的信息也不会丢失)。





例B: 如果部分需求是查询的效果必要排序,从父表中冗余一些数据到子表更方便计划索引,提高查询效率。



例C: 对于缓存衍生值也是有效的,如果必要表现每个用户发了多少消息(论坛发帖),每次必要执行一个统计的自查询计算,其实可以在user表中增加消息数量的字段,当用户发送消息的时候更新这个值(必要均衡更新和查询哪个更好)。


以上只是为了说明范式和反范式以及混用范式而举的例子,但是实际开发中还是要根据业务来选择怎么使用。

在表计划中,使用范式也好,反范式也好,不应该有严酷的限制,该用哪种就使用哪种或者两者结合使用。



<hr>mysql进阶系列历史文章


MySQL高级相关更多内容,如锁,MVCC,读写分离,分库分表等还在持续更新中,如果有想了解的内容也可以给我留言,接待关注催更。
我是阿纪,用输出倒逼输入而持续学习,持续分享技术系列文章,以及全网值得收藏的好文,接待关注,接待关注公众号:纪老师条记,一起做一个持续成长的技术人。




欢迎光临 创意电子 (https://www.wxcydz.cc/) Powered by Discuz! X3.4