冗余字段,是设计数据的时候常用的一种手段。优点是,可以在很大程度上避免数据库的关联查询,不使用join提升查询速度。缺点是,数据一致性维护成本高,需要维护冗余字段的一致性。
数据库model设计,致力于不要建立冗余字段。因为维持数据一致性是一个big problem。
但是作为操作日志,记录,历史这些,是需要冗余的。其实,在这里已经不是冗余了,只是记录了当时的信息。
比如下面的operator_name,操作员的姓名。一般user_id是不会变的,但user_name可能会随时公司人事变动而调整。
approve = models.CharField(choices=APPROVED_STATUS, verbose_name='审核状态', max_length=20,
default=APPROVED_STATUS[0][0])
approve_value = models.CharField(choices=APPROVED_STATUS, verbose_name='审核状态', max_length=20,
default=APPROVED_STATUS[0][1])
comments = models.CharField(max_length=100, verbose_name='审核备注', null=True)
operator_id = models.CharField(max_length=30, verbose_name='操作员id', null=True)
operator_name = models.CharField(max_length=50, verbose_name='操作员名字(冗余)', default='')
交易快照场景:交易场景大部分是数据快照,而不是冗余,用户下单时候的用户名、地址、商品名称、商品描述等,若采用关联,商品在下单后发生了更新的话再去关联查询就会导致和用户操作时的数据不一致,从而产生纠纷。这其实也不是冗余,而是当时交易的历史记录。