问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据库第三范式的问题

发布网友 发布时间:2022-04-11 08:23

我来回答

2个回答

懂视网 时间:2022-04-11 12:44

简单翻译过来,就是说:

一张遵守第三范式的数据库表,应该符合以下两个条件:

  1. 这张表遵守第二范式。
  2. 这张表中,所有非主属性都(仅)依赖于主属性。

也就是“在第二范式的基础上,消除了非主属性对主属性的传递依赖”。

ps,虽然我们在建表时使用的主键大多是业务无关的字段(例如自增主键),但是在讨论数据库范式时,“主属性”、“非主属性”一般都是指的业务字段。否则,恐怕没有一张表是符合第二范式的,更遑论第三范式了。

<hr/>

网上对第三范式的举例说明可谓比比皆是,这里就不赘述了。

我这里要举的例子有点特别。它不仅仅在表中引入了传递依赖,甚至还隐去了传递依赖的中间环节。

简略一点来说,这张表是这样的:

CREATE TABLE TB_CONTACTER(
 ID  INT  NOT NULL AUTO_INCREMENT,
 USER_ID INT  NOT NULL,
 CHANNEL_ID VARCHAR(10),
 CONTACTER VARCHAR(100),
 PRIMARY KEY (ID),
 KEY(USER_ID,CHANNEL_ID)
);

这张表的最大问题在于:CONTACTER并不是直接依赖于USER_ID+CHANNEL_ID的。它们之间存在着这样的一种传递依赖:
USER_ID+CHANNEL_ID --> USER_ID+PRODUCT_ID --> APPLY_ID --> CONTACTER。

翻译一下就是这样的,用户从某个渠道进入系统,选择一个产品,提交一笔申请,并给这个申请单指定一个收货的联系人。

这个依赖确实有点复杂。于是,这张表的设计者对它做了一个简化处理。

按照当时的业务约束,一个用户在一个渠道上,都只能选择一个产品;针对每个产品都提交一笔有效申请;而这笔申请单上,只能指定一个联系人。用图形来表示就是这样的:

技术图片

既然这个依赖链是如此地一根筋,那我们就一竿子捅到底好了。于是,就有了前面的TB_CONTACTER表的设计。

<hr/>

可是,业务数据之间的依赖关系是由产品需求定义的。而只要数一数产品经理有多少次拍胸脯保证“这次的需求不会再改了”,我们就知道产品需求有多善变。

在如此善变的产品需求面前,让业务数据之间的依赖关系永远保持不变,真是一种奢望。

而这种不切实际的奢望,很快就让我们尝到了苦头。

不知道该说不出所料还是该说大出所料,赖以简化依赖关系的业务约束被后来的产品需求打破了,最终——应该说是目前——变成了这样:

一个用户不仅可以在多个渠道上申请同一个产品;而且在每一个渠道上,都可以选择多个产品、提交多笔有效申请;不过每一笔申请单上,仍然只能指定一个联系人。

同样用图来表示,就是这样的(注意最左边的数据关系,从原先的1:1变成了N:M):

技术图片

于是乎,我们的这张TB_CONTACTER表就出现了一个问题:无论是根据USER_ID+CHANNEL_ID,还是根据APPLY_ID,我们都无法准确地查到申请单上关联的联系人了。

如果不做改造,这张表等于是废了。而真的改造起来,里面有几百上千万的存量数据,怎么处理都让人头大。

<hr/>

总结一下来说,虽然数据库范式算得上很“古老”的技术思想,但是俗话说得好,姜是老的辣,酒是陈的香。能够经历大浪淘沙、沉淀至今的技术,仍然值得我们认真钻研和严谨使用。

<hr/>

技术图片

违反数据库第三范式引发的一个问题

标签:ges   条件   第二范式   问题   product   src   例子   大浪淘沙   出现   

热心网友 时间:2022-04-11 09:52

配件:配件编号、配件名称
型号:型号编码、配件编号、型号规格
供应商:供应商编号、供应商名称
供应商地址:供应商编号、供应商地址、联系电话、...
供应登记:登记编号、供应商编号、型号编码、日期、价格、...
库存:库存编号、型号编码、供应商编号、单价、库存量、入库日期、验库人、...

说明:一个供应商可能有多个地址,一个配件有不同型号
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
上海什么酒店最高大上 业精于勤荒于嬉。行成于思毁于随 ""业精于勤,荒于嬉,行成于思,毁于随"是什么意思?解释的好点 文才神摆在阳台东南面朝窗户好吗 高锰酸钾鱼缸要泡多久合适 高锰酸钾泡鱼缸的时间介绍 高锰酸钾浸盆要多久 高锰酸钾浸泡需要的时间是多久? 高锰酸钾要泡多久合适 高锰酸钾要泡多长时间合适 天气炎热,长途车下面放行李的地方放活的黄鳝会死吗 15款明锐1.4 t烧机油吗 ...年斯柯达明锐换了四个点火线圈四个火花塞油耗增大两升左右为什么... 毛衣怎么洗不会坏和变形? 正章羊毛衫洗涤液 羊毛衫怎么保养?最合理的洗涤方法是什么?怎么能防止不起球? vivonex2双面屏前屏带边框吗? 正章羊毛衫洗涤剂可以洗普通衣物吗? 满可以换个什么偏旁并组词 饱满的音序和部首是什么 满的部首是什么偏旁 满字应查什么部首再査几画 “满”字总是搞错部首是三点水还是草字头,以后怎么记住区分这类的... 满的部首是什么? 满是什么部首 “满”的部首是什么? 液晶电脑怎么连wifi? 没有主机的显示器如何可以连上wifi sg显示器怎么连wifi 45度弯头弯曲半径计算公式 如何区分45度弯头135度弯头? 弯头知识角度怎么区分?90度与45度弯头角度怎么看? 不锈钢45度弯头一个多少钱 正章羊毛衫洗涤剂是中性的吗? 白色羊毛衫有些发黑,请问要怎么才能洗干净,上次我用正章的羊毛衫洗涤液没有洗平净,可不可以用点漂白济啊 添加搜索框到桌面被删除了无法再添加 如何将百度搜索放置到桌面 如何将电脑中搜索的内容移到桌面上 OPPOA5手机如何把全民搜索移到桌面上 苹果手机怎么改 一个字再加一笔画有那些字 数数算算,不止几千,再添一笔,他就不圆。是什么字? 再加一笔才像样打一字谜底是什么 江添一笔是什么字再添一笔又是什么字 苹果手机怎么改? 口,加上一笔等于什么?再加上一笔等于什么? 苹果手机改不了? 汪峰定律瓜神战绩再添一笔,如何看待汪老师的汪峰定律? 读书的滋味怎么写这一篇作文 天去一笔是什么字再加一笔 ipad微信怎么改 一字加一笔组成一个字,再加一笔,加的越多越好 读书的滋味作文400字五年级写的