第二列,在数据库中包含序列号

时间:2016-12-08 02:10:36

标签: php mysql symfony database-design

我正在设计一个系统,我有多个商店,每个商店应该有自己的发票序列号。显然,我的主ID列对于系统中的所有发票都是连续的,所以显然我需要另一列来存储这个“特定于车间”的发票号。存储和获取此商店特定号码的下一个ID的最佳方式是什么?例如,从发票表中简单地执行以下操作就可以安全地执行以下操作:SELECT MAX(INV_NUM) FROM INVOICES WHERE SHOP_ID = #并添加一个,然后创建新的发票记录?或者如果我的脚本的两个实例同时运行,那么是否会出现时间问题?例如,第一个脚本获取下一个ID,但在它有机会创建新发票记录之前,第二个实例请求下一个ID并获得与第一个脚本相同的ID ...我当时正在考虑只存储最后一个ID在一个单独的表中使用了数字,一旦我请求下一个发票号,立即写下新的下一个订单号并保留它,以便在获取下一个订单号和创建下一个请求所依赖的记录之间的时间保持为绝对最小...字面上3行代码:

$nextId = $shop->getLastId() + 1;
$shop->setLastId($nextId);
$em->persist();

发票

------------------------------
| ID  |  INV_NUM  |  SHOP_ID |
------------------------------
| 1   |     99    |     1    |
| 2   |     100   |     2    |
| 3   |     100   |     1    |

商店

-------------------
| ID  |  LAST_ID  |
-------------------
|  1  |     100   |
|  2  |     100   |

1 个答案:

答案 0 :(得分:1)

如果你正在使用Doctrine,我认为你是因为你正在使用Symfony,那么你可以lifecycle events来监听你实体的变化。保存之前,您可以将第二列更新为增量值。

关于竞争条件,为确保您的数据库中没有错误的数据,您可以在商店ID和发票号码上加unique constraint