数据库常见冗余设计

冗余本应计算出来的数值

统计数值可以通过select count(*)临时计算出来,但这种计算可能比较耗时,所以可以直接在表中增加这样一个字段并在相应事件发生时更新。 比如一个贴子的赞数、评论数都可以直接作为帖子表的字段,新增赞、评论时再累进这些字段。在查询一批贴子时,可以不用任何附加SQL就可以拿到这批帖子的赞数和评论数。

还有个例子:“前十个赞本贴的人”,也可以拼成单条字符串放在帖子表中。

字段冗余
A表除了外键关联B表的主键,还冗余了B表的其他一些字段。

1. 这种策略一般用于避免表连接: 在很多场景下,只需要查询A表即可。

2. 约束:业务上规定被冗余的字段不会发生改变,否则,修改B表后还要把A表也改一下,代码中很容易遗漏这一点,这样做还会带来性能损失。

3. 不冗余,不代表一定要表连接。要冗余还是不冗余,可以参考这里

整条记录冗余
A表和B表没有外键关系,而是“复制”关系。它们字段基本上一样,或者说一个是另一个的子集。

分库分表环境下常常需要这种策略,以便对单张表按多个维度进行拆分。 SNS中有个典型的例子: 关注关系。  我们既要查看一个人的偶像列表,又要查看一个人的粉丝列表。所以,当数据量大时,你既要按粉丝ID分库,又要按偶像ID分库。一个关系有两个分库维度,那就只好做两张表了。

最好用一些专门的数据复制中间件完成这种事情。这类复制逻辑非常简单,中间件一般能轻松支持; 使用中间件,也可以使这种冗余关系对上层透明,业务逻辑编写者不需要自己实现数据复制。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.