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

Php 多用户平台中的收据序列号,php,mysql,design-patterns,database-design,transactions,Php,Mysql,Design Patterns,Database Design,Transactions,在多卖家平台类型的应用程序中,如果有一个数据库存储多个卖家的所有交易,则每个卖家必须为每次销售发布顺序收据编号,以便于记录,且收据编号顺序中没有空白。什么样的模式和方法可以考虑这个要求? 我最初的想法是创建一个带有预填充顺序序列号(以及卖方指定的可选前缀)的表,以及一个带有“可用”、“待定”、“已填充”等值的状态列,以及一个引用“销售”表的“销售id”: table: serial_numbers id | seller_id | sale_id | prefix | seria

在多卖家平台类型的应用程序中,如果有一个数据库存储多个卖家的所有交易,则每个卖家必须为每次销售发布顺序收据编号,以便于记录,且收据编号顺序中没有空白。什么样的模式和方法可以考虑这个要求?

我最初的想法是创建一个带有预填充顺序序列号(以及卖方指定的可选前缀)的表,以及一个带有“可用”、“待定”、“已填充”等值的状态列,以及一个引用“销售”表的“销售id”:

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条新的序列号记录,并将状态设置为可用。当进行购买时,我将开始一个新的数据库事务(如果流程取消或终止,可以回滚),该事务将卖家帐户的下一个可用序列号设置为待定,如果销售完成,则将状态设置为已填充,并将“销售id”与序列号记录关联


这是一个有效的设计吗?由于数据库上的多卖方约束,不可能使用简单的自动增量。多卖家数据库应用程序还有其他类似的设计模式吗?

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

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

不,不是。只需使用一个自动递增ID,将它们填充到一个“在宇宙生命中无法使用的方式”字符串中,然后以某种方式对字符串进行加密/编码,以显示它们是数字。例如,
aes\u encrypt('0000000000000000 1',$key)
->
随机值
。您将从中获得完整的“垃圾”,但它是完全可逆的,因此您可以获得原始序列号。卖方的要求是,它们的收据号是序列号(没有间隙),而不是一些随机字符串。它们将在数据库中是序列号。或者你的意思是你想对多个用户重复使用相同的数字,因此它们只对每个用户唯一,而不是全局唯一?mysql不直接支持这种事情,预先填充一个表是痛苦的。通过适当的锁定/事务,您可以保留一个包含
用户收据\u id
的表格,例如
用户id、最后一个\u值
,并执行
最后一个\u值=最后一个\u值+1
类型操作。为什么?每个客户都有一个柜台。就像我说的,对于事务/锁,没有办法发生冲突。不,不是。只需使用一个自动递增ID,将它们填充到一个“在宇宙生命中无法使用的方式”字符串中,然后以某种方式对字符串进行加密/编码,以显示它们是数字。例如,
aes\u encrypt('0000000000000000 1',$key)
->
随机值
。您将从中获得完整的“垃圾”,但它是完全可逆的,因此您可以获得原始序列号。卖方的要求是,它们的收据号是序列号(没有间隙),而不是一些随机字符串。它们将在数据库中是序列号。或者你的意思是你想对多个用户重复使用相同的数字,因此它们只对每个用户唯一,而不是全局唯一?mysql不直接支持这种事情,预先填充一个表是痛苦的。通过适当的锁定/事务,您可以保留一个包含
用户收据\u id
的表格,例如
用户id、最后一个\u值
,并执行
最后一个\u值=最后一个\u值+1
类型操作。为什么?每个客户都有一个柜台。正如我所说,对于事务/锁,没有办法发生冲突。