【问题标题】:Best practice for Invoice Prefix in MySQL?MySQL中发票前缀的最佳实践?
【发布时间】:2017-03-28 19:49:16
【问题描述】:

我正在设计一个开票模式,并试图确定执行以下要求的最佳做法。有多家公司有多个分支机构。每个分支机构都希望拥有独立于其他分支机构(和公司)的自动增量编号。除此之外,还有不同类别的发票。我已经建立了如下表结构

tbl_invoices

|company_id|branch_id|class_id|invoice_id|...其他发票数据列...|

tbl_branches

|branch_id|branch_prefix|

tbl_classes

|class_id|class_prefix|

由于 FK 和事务,我强烈支持 INNODB。但是,我有一个自动增量的问题(MyISAM 会很容易地自动增加多列主键)。我遇到的另一个问题是,当我提取发票数据时,我必须一直连接多个表,因为我需要连接不同前缀的完整 invoice_id。我还遇到了前缀字符串将来更改时会发生什么的问题。过去开具的发票也更改其前缀可能是没有根据的。我在想我应该为 tbl_invoices 添加一个额外的前缀列,它将在插入时存储完整的 concat 前缀。我不太确定这是否是正确的做法?我考虑将整个 invoice_id 以完整的 concat 形式存储在列中,但我无法从 INV-00001 强制 INV-0001 的唯一性。

这仍然意味着我在自动增量方面有困难。

【问题讨论】:

  • @tadman 你显然从来不需要在 OLAP 应用程序上工作 :)
  • 这些是具有任意限制的任意“数字”——我想说,根本不要将它们用作主要行标识符。让正常的自动增量 ID 完成这项工作;并使用自定义逻辑(在数据库外部或通过存储过程嵌入)来生成满足所有要求的正确发票编号,并将它们单独存储,以将它们与自动递增的主订单 ID 连接起来。
  • @tadman 在某些情况下您不需要事务、mvcc 和所有这些高级事务功能。
  • @tadman 那么为什么开始对myisam完全不相关的咆哮?

标签: mysql invoice


【解决方案1】:

如果您的插入量较低并且愿意容忍一点摩擦,您可以在发票编号上设置UNIQUE 索引。如果它们的格式正确,那就是它们将正确排序,因为它们的格式为 INV-00001 而不是 INV-1INV-2 等,那么您可以这样做:

SELECT MAX(ident) FROM invoices WHERE ident LIKE 'INV-%'

然后尝试插入,并将其加一。这是一种乐观的方法,也就是说,您预计它可能会起作用,如果没有,您将收到有关索引冲突的错误,您可以递增并重试,直到它成功。

您期望它失败的悲观方法涉及事务和增量表,您可以在其中跟踪每个前缀的增量。您需要在此处进行一些快速锁定以避免产生大量争用。这个系统要完美运行要复杂得多,如果操作不当会导致丑陋的锁定问题。

我会采用乐观的方法,直到你找到它行不通的具体原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多