创意电子

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

作者: 想拥有一头秀发    时间: 2021-8-12 13:27
标题: MySQL进阶系列:数据库设计中的范式究竟该怎样使用
这篇文章主要为了阐明规矩要遵守,但是也别这么死板,要知道因场景不同而变化。了解各自的优缺点,在不同业务中根据需求选择使用。

                               
登录/注册后可看大图

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

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

优点:
缺点:
混用范式和反范式

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

例A: 假设有一个网站,答应用户发送消息,而且其中一些用户是VIP,现在想查看VIP用户的近10条信息。
查询sql:
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用户获取并排序,这种可能更糟糕。
例B: 如果部分需求是查询的结果需要排序,从父表中冗余一些数据到子表更方便设计索引,提高查询服从。
例C: 对于缓存衍生值也是有效的,如果需要显示每个用户发了多少消息(论坛发帖),每次需要执行一个统计的自查询计算,其实可以在user表中增长消息数目的字段,当用户发送消息的时间更新这个值(需要均衡更新和查询哪个更好)。
以上只是为了阐明范式和反范式以及混用范式而举的例子,但是实际开发中照旧要根据业务来选择怎么使用。
在表设计中,使用范式也好,反范式也好,不应该有严格的限制,该用哪种就使用哪种或者两者联合使用。
作者: 土味儿    时间: 2021-8-12 15:05
转发了
作者: 货吃里的哲学人生    时间: 2021-8-12 15:31
转发了




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