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

第三范式会造成哪些异常

发布网友 发布时间:2022-05-03 09:21

我来回答

2个回答

懂视网 时间:2022-05-03 13:42

简单翻译过来,就是说:

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

  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-05-03 10:50

第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:

  关键字段 → 非关键字段x → 非关键字段y

  假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:

  (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)

  这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:

  (学号) → (所在学院) → (学院地点, 学院电话)

  即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。

----------------

把学生关系表分为如下两个表:

  学生:(学号, 姓名, 年龄, 所在学院);

  学院:(学院, 地点, 电话)。

  这样的数据库表是符合第三范式的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
长春小飞没有车没有房 碳钢的多久生锈 碳钢多久会生锈 碳钢多长时间会开始生锈 碳钢和铝哪个容易生锈 梦见天宫图是什么意思 光遇2023好友树解锁图鉴 光遇二级节点多少个 ...火柴小女孩》《词语手册》里有很多词语的意思的,求告知 暖融融解释 领淘通淘客助手这个软件怎么样? 离职的说说或心情怎样发表 离职后的格言发表说说 离职的句子说说或心情 公司离职的句子说说或心情 初学对电子电工的认识 电子专业怎样学好电工? 学电子电工技术要考什么证书 电子电工主要学的是什么?以后可以从事什么工作? 职高电子电工每天学什么? 电子电工类的自考那个专业好,都要考什么? 电子电工技术是什么电子电工技术都学什么 想学习一下电子电工方面的知识 谁给一个学习电子电工的网站。谢谢 电工大师傅们,我想自学电子电工!有谁可以推荐几本书,全一点的,从最基础的学起!讲的越细越好!特别是 电子电工技术看谁的网课 有没有电工自学网 你好,支付宝付款后怎么没有发红包 支付宝现在怎么没有红包了 为什么红包收到了但是一段时间后支付宝里没有了 qq个性签名那里怎么总是显示发布了微视 锁的计量单位是什么 防盗门的单位是什么 门的单位是什么? 锁的尺寸 门锁属于什么报销项目 王力防盗门是国家标准制定单位没?它门框钢印号的数字编号是什么意思? 什么牌子的室内房门锁好 救护啊!Iphone如何退出dfu模式!?谢谢啊 iPhone 6s怎样进入或退出DFU模式? iphone6plus怎么退出dfu模式 红米note11pro能用智能手机套吗 如何知道支付宝或者新浪邮箱账号 为什么红米note11pro手机壳这么少 红米note11pro手机与什么手机同壳- 问一问 红米note11pro翻盖手机壳如何设置- 问一问 红米note11壳和那款通用 王一博定制版note11是否建议购买 红米note11pro潮流限定可以不要王一博的签名吗 小米note11手机壳怎么没有啊 第七代100ml小棕瓶瓶盖没有logo