数据库冗余字段思考

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

随着企业数据量与并发量不断的增加,冗余字段的存在到底是好还是坏呢?
根据第三范式而言,冗余字段是垃圾的数据库设计。

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之类的缓存服务,减少读写数据库的次数,也可以达到同样的效果。问题在于你确定你需要缓存之类的东西。

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

原文:https://blog.csdn.net/ztchun/article/details/80034764?utm_source=copy

原文地址:https://www.cnblogs.com/shiqi17/p/9801461.html

时间: 2024-10-03 15:48:37

数据库冗余字段思考的相关文章

关于数据库冗余字段及适当性

依个人理解,冗余字段就是本存在一张表的字段,也出现在另一张表中. 例如:有三张表,用户表.商品表.订单表,用户表中有字段name,而订单表中也存在字段name. 对于这个字段冗余有好有坏 好: 从用户表.商品表.订单表说起,当我需要查询"订单表"所有数据并且只需要"用户表"的name,一般都可以通过数据库连接(join)查询, 例如"商品表"存在字段-->用户的id,"订单表"存在字段-->商品的id,我可以查询所

关于数据库‘状态’字段设计的思考与实践

最近在做订单及支付相关的系统,在订单表的设计阶段,团队成员就‘订单状态’数据库字段设计有了一些分歧,网上也有不少关于这方面的思考和探讨,结合这些资料和项目的实际情况,拟对一些共性问题进行更深一层的思考,笔耕在此,和大家一起探讨. 问题综述 这里的分歧点即有团队内部的分歧点,也有网络上常见的一些分歧点,先将存在的分歧点抛出来: 1.订单表的‘订单状态’字段对应的字典值应当包含哪些状态值?对于‘已评论’.‘已退货’.’已退款’这类状态是放到‘订单状态’中?还是独立一个字段标识? 2.订单表的‘订单状

数据库中的历史数据和冗余字段

根据实际的业务需求,许多数据需要永久的保存,并且不随之后的一个数据的改变而影响其他数据,举一个例子,电商系统中的订单,订单中包括你买的商品A价格100,n天后A可能价格下降至90,那么你订单价格会是90吗?怎么解决?我的答案是:直接在订单表里加入价格字段,每次生成订单记录时都写入价格即可.我觉得如果类似"价格"这种字段如果太多的话,可以考虑新建一个存放历史记录表.需要注意,这里的"价格"并不是我们在进行数据库设计时的所谓冗余字段.冗余字段说的为了系统的查询效率而牺牲

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

在设计数据库时,某一字段属于一个表,但它又同时出现在另一个或多个表,且完全等同于它在其本来所属表的意义表示,那么这个字段就是一个冗余字段. --以上是我自己给出的定义 冗余字段的存在到底是好还是坏呢( 冗余是为了效率,减少join.单表查询比关联查询速度要快.某个访问频繁的字段可以冗余存放在两张表里,不用关联了. )?这是一个不好说的问题.可能在有人看来,这是一个很蹩脚的数据库设计.因为在数据库设计领域,有一个被大家奉为圭臬的数据库设计范式,这个范式理论上要求数据库设计逻辑清晰.关系明确,比如,

关于数据库“状态”字段设计的思考与实践

目录 1. 问题综述 2. 业务分析 3. 问题一.订单表的'订单状态'字段应当包含哪些状态值? 4. 问题二.订单表的'订单状态'字段的字典值的表示形式? 5. 问题三.数据库表的'状态'字段使用何种类型 6. 问题结论汇总 7. 参考资料 正文 最近在做订单及支付相关的系统,在订单表的设计阶段,团队成员就"订单状态"数据库字段设计有了一些分歧,网上也有不少关于这方面的思考和探讨,结合这些资料和项目的实际情况,拟对一些共性问题进行更深一层的思考,笔耕在此,和大家一起探讨. 1. 问题

2019-3-1 09:05:16数据库建立的三种范式及冗余字段

第一范式(1NF)无重复的列 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性.如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系.在第一范式(1NF)中表的每一行只包含一个实例的信息.简而言之,第一范式就是无重复的列. 1NF的定义为:符合1NF的关系中的每个属性都不可再分 下表所示情况,便不符合1NF的要求: 说明:在任何一个关系数据库中,第一范式

数据库范式的思考以及数据库的设计

数据库范式--通俗易懂[转] 数据库范式是数据库设计中必不可少的知识,没有对范式的理解,就无法设计出高效率.优雅的数据库.甚至设计出错误的数据库.而想要理解并掌握范式却并不是那 么容易.教科书中一般以关系代数的方法来解释数据库范式.这样做虽然能够十分准确的表达数据库范式,但比较抽象,不太直观,不便于理解,更难以记忆. 本文用较为直白的语言介绍范式,旨在便于理解和记忆,这样做可能会出现一些不精确的表述.但对于初学者应该是个不错的入门.我写下这些的目的主要是为了加强 记忆,其实我也比较菜,我希望当我

要不要冗余字段

这个问题我也遇到了,百度到这里却发现没有答案.这个问题我纠结了老长时间,至今仍未想明白.但是与其万马齐喑不如胡说八道.如果用户表添加计数字段,好处在于用空间换时间,查询速度肯定快多了:如果追求简洁无冗余,好处在于清晰易懂,写代码不蔓不枝,特别漂亮.如果用户表添加计数字段,坏处在于难以维护.当你添加一个粉丝关系的时候需要更新关注数和粉丝数,当你删除一个粉丝关系的时候也需要更新关注数和粉丝数.当你删除一个用户的时候,与他相关的所有粉丝关系.关注关系都要删除,相对应的粉丝数关注数也要删除,这个动作怎么

使用Python创建MySQL数据库实现字段动态增加以及动态的插入数据

应用场景: 我们需要设计一个数据库来保存多个文档中每个文档的关键字.假如我们每个文档字符都超过了1000,取其中出现频率最大的为我们的关键字. 假设每个文档的关键字都超过了300,每一个文件的0-299号存储的是我们的关键字.那我们要建这样一个数据库,手动输入这样的一个表是不现实的,我们只有通过程序来帮我实现这个重复枯燥的操作. 具体的示意图如下所示: 首先图1是我们的原始表格: 图1 这个时候我们需要程序来帮我们完成自动字段的创建和数据的插入. 图2 上图是我们整个表的概况.下面我们就用程序来