我有一个问题可以在理论上或经验上回答,这取决于之前是否完全完成。
我正在构建一个可以容纳多个客户端的Web应用程序,所有客户端都有自己独立的数据集。该软件的一个特殊功能是开票。
这样,您创建的每个发票都会增加1,所以通常我们会将一个AUTO_INCREMENT字段应用于id。然而,当我们开始引入多客户端功能时,问题就出现了。
请允许我通过示例演示该问题:
客户A进行首次销售,并为此创建一张自动拥有ID的发票。到销售处理时,他已进行了第二次销售。当他创建第二张发票时,他注意到发票编号出现了问题。他的第二张发票现在的ID为3。
之所以这样,是因为最近签署了该系统的客户B已经创建了他的第一笔销售,其ID为2.现在两个客户的发票编号都不正确,这很快就变成了一个不可行的解决方案
我必须添加一个名为 invoice_client_increments 的表,它基本上是发票和客户之间的一个支点,它存储新的增量。虽然这有效,但使用起来感觉非常麻烦。
创建发票时,我必须提取该客户的最后一个 invoice_client_increments 记录并向其添加一个,插入另一个并将其与发票关联。如果删除发票,该增量将丢失,并且不会像通常那样增加,它会在创建发票时覆盖已删除的发票。
有没有更好的方法来设计一个数据库来容纳这个,以及一种更简单的方法将其实现到Laravel中,或者我是否已经这样做了它应该如何完成?这可能更多是一个最佳实践问题,而不是"我该怎么做?" ...感谢您的时间:)
答案 0 :(得分:1)
这样,您创建的每张发票都会增加1,所以通常我们会将一个AUTO_INCREMENT字段应用于该ID。
DBA 不通常会这样做。
财务应用通常需要考虑每个发票号码。在所有平台上自动递增ID号保证在某些情况下存在间隙(通常,使用并发插入语句回滚)。你不能通过简单地说,“哦,一定有回滚来解释差距。”
有两种方法可以解决您的问题。
答案 1 :(得分:0)
我的友情看你可以创建一个像这样的系统colum将自动增量,你不必创建另一个cleint_increment表,如果你不想。如果你想要你可以做一些像这样的想法
就像你的自动增量很好,但是当你的提示是销售时,他的销售应该增加1,你的发票号码可能看起来像这样。 incrementNo / CleintReference / CleintsaleNo。
什么是明天的销售没有。每次提交销售时都会加1,但是当他开始销售时就不会开始,这样你就会知道哪个销售是哪个销售,你的凭证会知道他或她今天做了多少销售。
答案 2 :(得分:0)
如果您还没有找到解决方案,并且不会迟到,那就是我为一个应用做了什么。
我收到了来自该特定客户的所有订单,计算它们然后将该数字增加一个,就像这样,您始终为每个客户从0开始计数,然后将其增加1。
e.g。
$totalOrders = DB::table('orders')->where('client_id', $id)->count();'
DB::table('invoices')->insert(array('client_id' => $id, 'invoice_no' => ($totalOrders + 1)));
我希望这会对你有所帮助:)。