数据库设计& Laravel中的实现 - 绑定到各个行的自动增量,而不仅仅是一个表

时间:2014-08-17 15:40:37

标签: mysql database database-design laravel multi-tenant

我有一个问题可以在理论上或经验上回答,这取决于之前是否完全完成。

我正在构建一个可以容纳多个客户端的Web应用程序,所有客户端都有自己独立的数据集。该软件的一个特殊功能是开票

这样,您创建的每个发票都会增加1,所以通常我们会将一个AUTO_INCREMENT字段应用于id。然而,当我们开始引入多客户端功能时,问题就出现了。

请允许我通过示例演示该问题:

  

客户A进行首次销售,并为此创建一张自动拥有ID的发票。到销售处理时,他已进行了第二次销售。当他创建第二张发票时,他注意到发票编号出现了问题。他的第二张发票现在的ID为3。

     

之所以这样,是因为最近签署了该系统的客户B已经创建了他的第一笔销售,其ID为2.现在两个客户的发票编号都不正确,这很快就变成了一个不可行的解决方案

我必须添加一个名为 invoice_client_increments 的表,它基本上是发票和客户之间的一个支点,它存储新的增量。虽然这有效,但使用起来感觉非常麻烦。

创建发票时,我必须提取该客户的最后一个 invoice_client_increments 记录并向其添加一个,插入另一个并将其与发票关联。如果删除发票,该增量将丢失,并且不会像通常那样增加,它会在创建发票时覆盖已删除的发票。

有没有更好的方法来设计一个数据库来容纳这个,以及一种更简单的方法将其实现到Laravel中,或者我是否已经这样做了它应该如何完成?这可能更多是一个最佳实践问题,而不是"我该怎么做?" ...感谢您的时间:)

3 个答案:

答案 0 :(得分:1)

  

这样,您创建的每张发票都会增加1,所以通常我们会将一个AUTO_INCREMENT字段应用于该ID。

DBA 通常会这样做。

财务应用通常需要考虑每个发票号码。在所有平台上自动递增ID号保证在某些情况下存在间隙(通常,使用并发插入语句回滚)。你不能通过简单地说,“哦,一定有回滚来解释差距。”

有两种方法可以解决您的问题。

  • 使用Laravel方法或存储过程返回给定客户端的下一个发票号。密切关注事务隔离级别和锁定。
  • Change the architecture。共享表是一种多租户架构。它不是唯一的,它通常不是最好的选择。当您阅读此链接文章时,请记住,MySQL数据库的行为更像SQL Server架构,而不是SQL Server数据库。

答案 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)));

我希望这会对你有所帮助:)。