4
回答
想问一下各位大虾, 数据库在设计的时候,在什么情况下,可以允许部分数据冗余(就是不要关联到另外一张表,直接把相应的值,拷贝存储到当前表的字段里面)。
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
    想问一下各位大虾, 数据库在设计的时候,在什么情况下,可以允许部分数据冗余(就是不要关联到另外一张表,直接把相应的值,拷贝存储到当前表的字段里面)。
<无标签>
举报
sucab
发帖于4年前 4回/692阅
共有4个答案 最后回答: 4年前

关键看你的业务,如果一个字段在两个业务中都用到,而且两个业务关联不大(基本独立)或者说,当两个表数据量比较大,导致做联合查询很慢,这时候,我认为可以考虑把字段拷贝。具体还是要看业务和数据量,自己衡量。

主要的疑惑是这样的,拿网上购物举例,如果在t1时刻购物,使用收货地址a,形成一张订单d。如果后期我对a的内容修改了,那么d中的地址a就变了,而实际上不应该变的,应该还是当时的地址。 我在想是否系统上的一些数据可以写在配置文件里或其他方式,不要单独存在数据库表里面。

根据我的经验,我认为如果同时满足下面两个条件可以考虑数据冗余:

  • 联表查询性能特别差或者要关联的字段在不同的数据库
  • 允许数据不一致或只要保证数据最终一致性就行(即不要求某处的修改立刻反映到所有地方)
有一个典型的数据冗余场景是流水记录表,比如流水记录的操作人姓名、还有比如上面你说的收货地址,这种字段不要求数据一致性,即刚开始有一条流水记录的操作人是张三,收货地址是南京。之后对应操作人修改了、收获地址改了都不需要改流水记录的, 因为流水记录实际上就是快照,快照是只能增加不能修改的,改了反而违背了业务逻辑,所以符合第二条。类似的淘宝上你购买的商品会有一个交易快照,明显也是不要求数据一致性的。 另外流水记录的数据量一般比较大,联表查询性能一般比较差(当然如果驱动表数据量比较小的话可能快一些),符合第一条。


--- 共有 2 条评论 ---
优雅先生回复 @Sucab : 对,应该是数据一致性要求和查询性能要求。刚才我还想到另外一个情况,就是如果字段比较稳定(比如用户Email字段),且查询性能要求比较高时,也会采用数据冗余的方法。 4年前 回复
sucab嗯嗯,有点明白了,关键就是什么使用场景 对数据一致性的要求 4年前 回复
顶部