`
arganzheng
  • 浏览: 103493 次
  • 性别: 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 这两个字段是重复的,这就是数据冗余,我们设计数据库是不要出现冗余信息,为啥...

    JTT 1058-2016 交通运输信息系统 数据库字段命名及属性定义1

    综上所述,JTT 1058-2016标准提供了一套统一的命名和属性定义规则,确保了交通运输信息系统数据库的一致性和互操作性,减少了数据共享和交换过程中的误解和冗余,提升了整个行业的数据管理效率和质量。

    为数据库表设计可扩展的字段

    本文将深入探讨如何为数据库表设计可扩展的字段,以便在未来的需求变化或业务扩展时能够轻松应对。 首先,我们应当遵循数据库设计的基本原则——范式理论。第一范式(1NF)要求每个字段都具有原子性,即字段值不可...

    数据库低层操作(对于大量字段,省了sql语句)

    7. **数据库设计优化**:良好的数据库设计,如合适的索引策略、分区策略,以及避免冗余字段,都可以提高处理大量字段的效率。 8. **异步操作**:在处理大数据时,使用C#的async/await语法可以实现非阻塞操作,提高...

    数据库字段评审标准模版.docx

    #### 2.5 冗余字段 - 避免在多个表中重复存储相同的数据,这会导致数据不一致的问题。 - 在必要时可以通过视图或存储过程来实现数据的复用。 #### 2.6 用户分配 - 根据不同角色和权限合理分配用户对数据库的操作...

    谈谈数据库的字段设计的几个心得

    以下是一些关于数据库字段设计的重要心得: 1. 数据类型选择:数据类型的选取应根据实际存储需求进行,例如,`TINYINT`类型在设置为`UNSIGNED`时,其最大值可达到255,更适合存储非负的小整数,避免存储空间的浪费...

    易语言数据库检查重复字段模块

    "易语言数据库检查重复字段模块"则是基于这一理念,为数据库开发者提供了一个便捷的工具,帮助他们在数据库录入前进行重复数据的检查,有效防止数据冗余。 该模块的核心功能主要包含以下几个方面: 1. **字段选择*...

    易语言数据库检查重复字段模块源码

    重复字段可能会导致数据冗余、数据不一致等问题,因此在数据录入前进行检查是非常必要的。 易语言的这个数据库检查重复字段模块,其核心功能可能是通过遍历待录入数据,对比每一个新数据项与已存在的数据库记录,找...

    ECSHOP数据库所有表结构中文注释,字段中文说明,html格式

    通过这份资料,开发者可以分析ECSHOP的数据库设计是否合理,是否存在冗余或性能瓶颈,从而提出改进方案,提高系统的运行效率。 总结,这份"ECSHOP数据库所有表结构中文注释"资料是学习和深入理解ECSHOP系统的重要...

    基于SQL数据库实现冗余数据的查询与删除.pdf

    冗余数据指的是在数据库中,存在两行或多行数据,这些数据在某些字段上具有相同的值或值集。尽管关系数据库通过规范化理论在设计时尽可能减少冗余数据的产生,但在实际操作过程中,由于多种原因,冗余数据仍然不可...

    数据库表字段命名规范

    然而,在实际的开发过程中,由于数据库表及其字段命名缺乏一致性和规范性,常常导致代码难以维护、数据查询效率低下等问题。因此,建立一套行之有效的数据库表字段命名规范显得尤为重要。 #### 数据库命名规范 - **...

    查询数据库有哪些表哪些字段

    本压缩包文件提供了关于如何查询数据库中的表和字段的一些方法,主要适用于Java开发者,特别是那些使用关系型数据库如MySQL、Oracle、SQL Server等的人群。 1. SQL查询基础 SQL(Structured Query Language)是...

    关于数据库设计的电子书

    这本书籍,名为"关于数据库设计的电子书",显然旨在深入探讨这一主题,为读者提供全面的学习资源。以下是对数据库设计的一些核心知识点的详细阐述: 1. **数据库概念**:数据库是一种有组织地存储和管理数据的系统...

    MySQL冗余数据的三种方案

    在大规模的互联网业务环境中,数据量的增长经常超出单个数据库的承载能力,此时需要采取一些策略来管理和优化数据存储。本文主要探讨了针对这一问题的三种数据冗余方案:服务同步双写、服务异步双写和线下异步双写。...

    JAVA高级关于数据库设计中的14个技巧

    以下是一些关于数据库设计的关键技巧: 1. **原始单据与实体的关系**:设计数据库时,要考虑到原始数据(如业务单据)与实体(基本表)之间的关联。这种关系可能是一对一、一对多或多对多。理解这种对应关系有助于...

    PostgreSQL MySQL Oracle数据库设计优化完美攻略

    我们可以通过添加冗余数据库、冗余表或者冗余字段来提高系统的性能。 3. 主键设计 主键是数据库表的唯一标识符,它对查询的影响非常大。在选择主键时,我们需要注意选择最小的键组合作为主键,并且选择合适的字段...

    数据库设计与优化.pdf

    - **合理冗余**:在适当情况下引入冗余数据库、冗余表或冗余字段,可以提高并发处理能力、加快特殊查询速度,但需控制以避免引发数据不一致。 - **主键设计**:主键是确保数据唯一性的关键,通常选用最小键组合,...

    Oracle|Sqlserver|MySql数据库表结构一键生成工具

    通过可视化的方式展示数据库结构,可以帮助开发者发现潜在的问题,如冗余字段、数据不一致或者设计上的不足。同时,这样的文档也是新入职员工快速了解项目数据库结构的重要参考。 总之,"Oracle|Sqlserver|MySql...

Global site tag (gtag.js) - Google Analytics