多用户平台中的收据序列号

时间:2015-08-04 15:10:31

标签: php mysql design-patterns database-design transactions

在多卖家平台类型的应用程序中,有一个数据库存储多个卖家的所有交易,每个卖家必须为每个销售发出连续收据编号,以保持记录,而收据编号顺序没有间隙。可以考虑采用哪种模式和方法来满足此要求?

我最初的想法是创建一个包含预先填充的顺序序列号的表(以及卖家指定的可选前缀)和一个状态列,其中的值包括“可用”,“待定”,“填充”以及'sale_id'将引用'sales'表:

table: serial_numbers

id  | seller_id  |  sale_id  |  prefix  |  serial_number |  status
1     1             NULL        NULL       1                available
2     2             1           A          1000             filled
3     1             NULL        NULL       2                available
4     2             NULL        A          1001             pending
5     2             NULL        A          1002             available

当一个序列号块变低(比如低于10个可用记录)时,我会在数据库中插入100个新的序列号记录并将状态设置为可用。购买时,我会开始新的数据库交易(如果流程被取消或终止,可以回滚),这会将卖方帐户的下一个可用序列号设置为待处理,如果销售完成,请设置填写状态并将'sale_id'与serial_number记录关联起来。

这是一种有效的设计吗?由于数据库上的多卖家约束,因此无法使用简单的自动增量。是否有其他类似的设计模式适用于多卖家数据库应用程序?

1 个答案:

答案 0 :(得分:0)

最后,我选择遵循Marc B的评论,并创建了一个采用last_value + 1方法的表格,并加入了“悲观锁定”,以确保数字序列继续无间隙。有很多方法可以解决这个问题,但这似乎符合我的要求。