世界上最遥远的距离不是我不能说我爱你,而是想你痛彻心扉却只能深埋心底。——《我在未来等你》

1、引言

第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。

根据数据库设计的第三方式,在数据库设计过程中,应该尽量消除冗余。即设计数据库时,某一个字段属于一张表,但它同时出现在另一个或多个表,且完全等同于它在其本来所属表的意义表示,那么这个字段就是一个冗余字段。

随着企业数据量与并发量不断的增加,冗余字段的存在到底是好还是坏呢?

根据第三范式而言,冗余字段是垃圾的数据库设计。

2、举例说明与研究

所有问题出现必然因为场景问题,针对冗余字段问题,分为两个场景:

(1)快照场景(副本场景):交易场景大部分是数据快照,而不是冗余,用户下单时候的用户名、地址、商品名称、商品描述等,若采用关联,商品在下单后发生了更新的话再去关联查询就会导致和用户操作时的数据不一致,从而产生纠纷。

(2)冗余场景:一般数据改动的可能性少,而查询多的场景会使用冗余,例如淘宝的店铺名称,淘宝商家中心会有这个字段,可能里面的商家论坛也有,再假设聚划算这种独立的大业务自己也存一份,再来个垂直频道电器城的后台管理也独立存一份,这种场景是由于对查询性能要求高产生的,所以必须要冗余,在业务的取舍上,肯定是对让用户更快看到信息,那么不可避免的是带来维护成本的增加,对于数据一致性问题,只要做到最终一致就可以了,分布式的CAP原则的实际应用基本都是通过牺牲数据一致性(C)来保证高可用(A)和高可靠(P), 因为这种场景大部分都是可以接受短暂的数据不一致的,对业务的影响及其微小。

又比如,”用户昵称”字段”nickname”本来属于表”user”,那么,表示”用户昵称”的字段就唯一的只应该属于”user”表的”nickname”字段,这样,当用户要修改昵称的时候,程序就只需要修改 user.nickname这个字段就行了。不过问题也随之而来,我在其他数据表(如订单orders表)里只存储了用户的ID,我要通过这个ID值得到用户昵称该怎么办呢?一个普遍的解决方法是通过联接(join),在查询时,通过id这个唯一条件联接两个表,从而取到用户的昵称。

这样确实是没问题,我也一直觉得这样是最好的方案,扩展方便,当要更新用户信息时,程序中要修改的地方很少,但是随着数据库里数据不断增加,百万,千万,同时,用户表的数据肯定也在不断的增加的,它可能是十万,百万。这个时候,你会发现两个表通过联接来取数据就显得相当费力了,可能你只需要取一个nickname这个用户昵称属性,你就不得不去联一下那个已经几十万的用户表进行检索,其速度可想而知了。

这个时候,你可以尝试把nickname这个字段加到orders这个订单表中,这样做的好事是,当你要通过订单表呈现一个订单列表时,涉及用户的部分可能就不需要再进行联接查询了。当然,有利就有弊,这样做的弊端就是,当你尝试更新用户信息时,你必须记得用户信息表里当前被更新的字段中,有哪些是冗余字段,分别属于哪些表,找到他们,然后加入到你的更新程序段中来。这个是程序中的开销,开销在开发人员的时间上了。至于这样做是否值得,就得看具体情况而定了。

所以,目前要创建一个关系型数据库设计,我们有两种选择:

1,尽量遵循范式理论的规约,尽可能少的冗余字段,让数据库设计看起来精致、优雅、让人心醉。

2,合理的加入冗余字段这个润滑剂,减少join,让数据库执行性能更高更快。

选择哪一种呢?如果你是一个美学狂人,并且财大气粗,非要使用第一种方案,也没关系,这种方案的短板并非不可救药的。比如,你可以增加服务器,从数据库集群入手,进行读写分离,读的时候可以将压力分散到不同的数据库服务器上,这样也可以获得很好的性能,只是多付出了硬件成本和维护成本。或者,你可以在数据库前端架设Memcached之类的缓存服务,减少读写数据库的次数,也可以达到同样的效果。问题在于你确定你需要缓存之类的东西。

如果做不到上面的只能选择第二种了,当涉及到修改的时候就需要将所有相关的数据进行修改了。

表设计中冗余字段的思考相关推荐

  1. mysql status关键字 数据表设计中慎重使用

    mysql status关键字  数据表设计中慎重使用 转载于:https://www.cnblogs.com/toSeeMyDream/p/5574894.html

  2. 数据库设计之冗余字段

    以下内容参考:http://blog.csdn.net/elemman/article/details/50966164#inf 第一范式(1NF) 概念 数据表的每个字段(属性)必须是唯一的.不可分 ...

  3. PowerDesigner表设计中的P F M分别代表什么意思?

    版本 如下图中的P.F.M代表什么意思呢? P即primary,主键的意思 F即foreign key,外键的意思 M即mandatory,强制不可为空的意思 转载于:https://www.cnbl ...

  4. PowerDesigner的表设计中的P F M分别代表什么?

    很多人不知道PFM分别代表什么,可以把鼠标放到上面就可以显示意思了,不过是英文哈 P:Primary Key 主键 F:Foreign Key 外键 M:Mandatory:强制不可为空

  5. 聊聊数据仓库中维度表设计的二三事

    前言 大家好,我是云祁!今天和大家聊聊数据仓库中维度表设计的那些事. 维度表是维度建模的灵魂所在,在维度表设计中碰到的问题(比如维度变化.维度层次.维度一致性.维度整合和拆分等)都会直接关系到维度建模 ...

  6. 关于数据库冗余字段设计的利与弊

    前言:该文章仅为作者个人的感悟,仅供参考,欢迎大家做技术讨论,谢谢. 因为近期完全是我负责某项目开发,所以关于数据库冗余字段的设计,有了一些新的见解. 其实在数据库设计方面,对于冗余字段的设计,网上也 ...

  7. sqlite库——c语言实现匹配已知字符串中某个字段(该字段在其他表中),在其他表中获取值并显示

    问题描述: 1.部分sql语句:select id,name,grouname, poliname; 2.表名:user_resource:用户组表名:usergroup_name: 3.用户所在的用 ...

  8. mysql 数据类型怎么用,myMySQL数据库怎么更改表中某字段的数据类型? MySQL数据库使用教程...

    在mysql中,可以使用"ALTER TABLE"语句配合"MODIFY"关键字来更改表中某字段的数据类型:语法格式"ALTER TABLE MODI ...

  9. 修改MYSQL 表中的字段属性

    1.登录数据库 >mysql -u root -p 数据库名称 2.查询所有数据表 >show tables; 3.查询表的字段信息 >desc 表名称; 4.1.修改某个表的字段类 ...

最新文章

  1. 服务器架构之性能扩展-第七章(8)
  2. yii required 字段去除*号
  3. Linux下DIR,dirent,stat等结构体详解(转)
  4. jQuery给css增加!important
  5. 【STM32】利用 C 语言 strchar() 函数查找字符串中指定字符的位置
  6. java 四种实现延迟加载的方法
  7. vue + element-ui 聊天_推荐6款Vue管理后台框架,收藏好,留备用
  8. 【Linux网络编程】端口绑定问题
  9. EnumWindows 使用
  10. JAVA入门级教学之(内存引用的例子)
  11. MATLAB符号运算(3)
  12. 【网络安全工程师面试合集】—DNS 域名系统 到底是怎么回事?
  13. centos 安装 Pip 的方法总结
  14. 前端的ajax缓存,解析jquery中的ajax缓存问题
  15. Unity子线程编程无法报错
  16. docker深入2-API示例
  17. 查询工资最低的3名员工的职工工号、姓名和收入_2018年31省最低工资排名!武汉工资低于这个数就违法!...
  18. 采访:蔡学镛谈复杂事务处理(CEP)
  19. 象棋巫师魔法学校/象棋路边摊 前1050关
  20. Apache commons-exec的使用

热门文章

  1. 马斯洛理论与个人发展
  2. Win10激活Office2013的技巧
  3. flex与布局(基本网格布局、百分比布局、一侧固定一侧自适应、圣杯布局)
  4. 电子信息工程专业生产实习报告
  5. ftp 上传 工具,三款特别好用的ftp 上传 工具
  6. doris 分片与副本
  7. 回老家发展VS在北京发展—一个北漂族的心声
  8. 7月6号奥特曼服务器维护中,《奥特曼英雄归来》7月12日更新公告
  9. 设半径为R的球面S的球心在定球面x^2+y^2+z^2=a^2(a>0)上,问R取何值时,球面s在定球面内的面积最大?
  10. 网盘进化史就这样(上)——原理简析