`
arganzheng
  • 浏览: 101693 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于数据库冗余字段

阅读更多

关于数据库冗余字段

2011-10-13 星期四 阴雨

原则:
1. 不要随便作冗余!
2. 冗余的字段千万不要随便暴露出去!
3. 要冗余也要冗余有业务关系的字段!
最后一点——还是不要随便作冗余!

冗余就像缓存,对于只读字段,那么冗余是没有问题的。但是如果这个字段是会被更新的,那么冗余就有可能带来更新的性能下降,和不一致的情况。特别是如果冗余在一个大表中,这带来的压力是非常大的。一个具体例子就是我们产品表和BuyOffer表中的create_type和is_validate字段的冗余。这两个字段其实是冗余自vaccount表的stage和status。目的是为了避免关联vaccount表来获取这两个字段的信息。但是它绝对是一个失败的冗余。首先:
1. 冗余不完全:vaccount表最重要的三个字段:service_type,stage和status。这里只冗余了stage和status,而忽略了service_type,这导致其实在95%场景下都是需要根据product表中的company_id多查询一下vaccount表。
2. 冗余在大表:vaccount是一个小表,根据主键关联或者查询并不会带来多大的性能消耗,而product是一张大表,这导致在CRM拉上拉下一个会员的时候,更新vaccount的同时,也需要更新product和buy_offer表的这两个冗余字段。这就带来了很大的数据库压力。再加上我们现在前后台分库之后,给数据库同步也带来了很大的压力(国际站还有特有的中美同步),还有复杂的补偿逻辑。而在业务逻辑上,本来拉上拉下一个会员,从业务上应该与这个会员的产品和buyOffer一点关系都没有。现在,由于这两个字段的冗余,导致了这个会员拥有的产品、Offer、Column等都需要牵扯进来。
3. 冗余字段与product没有直接的业务关系:将一个业务模型的关键字段冗余到另一个业务模型上,并且在上层DO中暴露出来,这明显是混淆了业务模型。因为将冗余字段放在productDO中,明显就是认为isValidate和createType是product的一个属性,而不会认为它是一个vaccount的冗余字段。所以如果要合理的话,应该将这两个冗余字段放在productDO的一个Vaccount属性中,而不是散落在productDO中。这就是业务模型和数据库模型的区别。

另一个例子是company表的is_pass_av字段,这个字段比product的isValidate和createType字段冗余有意义的多,因为是否通过AV认证确实就是公司的一个属性,将这个属性放在业务模型中是绝对没有问题的。但是为什么还是说他是一个冗余字段呢?因为在数据库层面上,这个字段的值是由诚信团队回填到company表的,也就是说它是来自于AV相关的表。由于是回填,所以也会出现不一致的现象,不过由于company和AV认证表是一对一的关系,所以没有前面提高的更新压力情况。也就是说isPassAV属性放在company业务模型是正确的,但是是否要对应在数据库模型中,也就是company表,是有待商榷的。

补记:2011-6-13

这两个冗余字段,除了带来很高的数据库和同步压力,以及巨大的维护成本之外,还容易导致问题。

周末小强打电话给王小雪,说数据库load很高,锁表严重。小雪和我一起查看了log日志,发现同一家公司的所有产品在同一个时间相续被更新了多次(大概相隔3秒做一次),就周末两天大概就有10多家公司被拉下,其中有家公司有3万多条产品。原因应该是分久必合项目将本地接口改成dubbo远程服务,而默认超时时间太短,导致超时抛出异常,dubbo或者后面的业务代码(具体是哪个麻烦李鼎和王兴勇帮忙查找一下)进行了重试导致。

 

再补记2011-7-15:

后来,本人实在看不下去了,将这两个冗余字段下线了(前后花了一年多的时间,背了一个B类和C类故障。。),整个世界清静很多。

 

 

分享到:
评论

相关推荐

    如何合理使用数据库冗余字段的方法

    另外冗余字段,我们有一个表是记录图片的,另一个表是记录商品的。 我们可以在图片你放商品图片里的url 同时商品里放图片id和图片URL 这两个字段是重复的,这就是数据冗余,我们设计数据库是不要出现冗余信息,为啥...

    数据库设计与优化.pdf

    从性能角度来说,冗余数据库可以分散数据库压 力,冗余表可以分散数据量大的表的并发压力,也可以加快特殊查询的速度,冗余字段可以有效减少数据库表的连接, 提高效率。 1.3.3 主键的设计 主键是必要的,SQL SERVER...

    数据库技术规范.docx

    =或操作符子句使用 8 不要对索引字段进行运算 8 不要对索引字段进行格式转换 8 不要对索引字段使用函数 9 不要对索引字段进行多字段连接 9 Like的使用 9 10 设计 10 数据库逻辑设计的规范化 10 合理的冗余 10 主键的...

    数据库设计培训.pptx

    数据库中的每个表都代表一个主题,由一些相关的字段组成,数据的冗余度尽可能小,并且在整个数据库中通过一个具有唯一值的字段表示。 数据的完整性强加在字段、表和关系级。这些完整性帮助确保数据结构和它们的值...

    实体类属性名和数据库字段名不同时的解决方案

    缺点:当这样的语句出现的次数过多的时候,到时冗余代码增多,这些别名不能重用。 select _id id, name, age from user @Select("select _id id, name, age from user") List selectAll(); 方案三: 使

    高级MySQL笔记时,需要深入了解数据库的内部机制和优化技巧,以提高数据库性能和效率

    表结构优化:合理设计数据库表的结构,避免冗余字段、过度规范化等问题。可以根据业务需求和数据特点,进行适当的表结构优化,提高数据库的性能和可维护性。事务管理:MySQL支持事务操作,可以确保数据库操作的一致...

    最新列车时刻表数据库下载

    字段(所有字段均为字符串类型): ID 列车车次 Type 列车类型 Station 车站 S_No 站序 Day 天数 A_Time 到达时间 D_Time 离开时间 Distance 里程 P1 硬座票价 P2 软座票价 P3 硬卧票价 P4 软卧...

    数据库物理设计.docx

    "金额"这个字段的存在,表明该表的设计不满足第三范式,因为"金额"可以由"单价"乘以"数量"得到,说明"金额"是冗余字段。但是,增加"金额"这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。 数据库...

    数据库设计思路.doc

    三即对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段 没有冗余。但是如果设计的数据库完全满足这三个范式的话,又未必是最 好的数据库,为了提高数据库的运行效率,我们必须降低范式要求,允许 ...

    数据库文件管理助手

    我们经常会遇到这样的问题,在数据库中的文件存放的是web格式或者是绝对路径,以及使用的是百度上传或者其他上传组件,造成了很多异步上传的冗余文件,如果客户需要我们导出企业官网中的产品图片,我们该如何处理?...

    数据库设计思想.docx

    第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。 (范式只能作为参考的标准,未必是合身的.) 多对多关系怎么办法: 自然是将他们的联系独立出来,用单独的表来存储,但这样...

    数据库设计原则.docx

    "金额"这个字段的存在,表明该表的设计不满足第三范式,因为"金额"可以由"单价"乘以"数量"得到,说明"金额"是冗余字段。但是,增加"金额"这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。 数据库...

    数据库设计的黄金经验.txt

    第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。 没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式...

    数据库设计原则(1).pdf

    "⾦额"这个字段的存在,表明该表的设计不满⾜第三范式, 因为"⾦额"可以由"单价"乘以"数量"得到,说明"⾦额"是冗余字段。但是,增加"⾦额"这个冗余字段, 可以提⾼查询统计的速度,这就是以空间换时间的作法。 在...

    mysql数据库高级,mysql优化.rar

    通过规范化数据库结构,可以提高数据一致性、减少冗余数据,并优化数据存储和查询效率。以下是一些规范化的基本原则: 此外,还可以使用索引和外键来加强数据库结构的完整性和性能。索引可以加速数据检索,而外键...

    数据库设计技巧.doc

    但是,增加"金额"这个冗余字段,可以提高查询统计的速度,这就是以空间换 时间的作法。 在Rose 2002中,规定列有两种类型:数据列和计算列。"金额"这样的列被称为"计算列",而"单 价"和"数量"这样的列被称为"数据列...

    [详细完整版]8数据库.doc

    A、 数据和数据之间没有联系 B、数据有丢失 C、 数据量太大 D、存在重复的数据 14、关系数据库中的关键字段是指( ) A、能唯一决定关系的字段 B、不可改动的专用保留字 C、关键的很重要的字段 D、能唯一标识元组的...

    数据库简答题.docx

    功能:1建立数据库中的表格 2改变数据库系统环境设置 3修改数据库表格结构(新建、删除或是修改表格字段) 4对数据库进行数据的查询 5对数据库进行数据的新建 6对数据库进行数据的修改 7对数据库进行数据的删除 ...

    数据库审计系统需求说明.docx

    8 规则分析 支持账号、IP地址、MAC地址、操作类型、返回行数、执行时 、表、字段、主 数据库审计系统需求说明全文共2页,当前为第1页。 数据库审计系统需求说明全文共2页,当前为第1页。 机名、操作系统名、关联表...

Global site tag (gtag.js) - Google Analytics