SQL 发票自动增量的前瞻性计划
Forward Planning for SQL Invoice Auto-increment
我正在为我的雇主开发一个数据库系统,其中一部分涉及创建发票。我一直在考虑 table 上的自动递增 ID,以及我需要在多大程度上为业务增长留出空间。我正在使用 InnoDB,因为该系统将非常全面,并且许多记录将得到更新。
简化了,这是我目前拥有的:
Office (An office/store of the business. Currently 2.)
office_id (PK) INT, AI, UN
Invoice
invoice_no (PK) INT, AI, UN
office_id (FK) (Where the invoice originated from.)
Products
product_id (PK) INT, AI, UN
InvoiceLine (Ties products to an invoice to make the lines.)
invoice_line_id (PK) INT, AI, UN
invoice_no (FK)
product_id (FK)
quantity
首先,虽然我可能永远不会 运行 出发票号码,但我想知道是否有更好的方法来解决这个问题,以防万一业务确实有意想不到的办公室扩张和增加销售量。一家拥有 50 多家商店的大公司将如何解决这个问题?每个商店可能都有自己的一组从 1 开始的发票编号吗?
这是我考虑过的...
选项 1 - 我是否应该使 invoice_no 大于标准的 10 精度?不管难度如何,如果我们看到当前限制不足,这是否可以在部署后更改,或者这 impossible/highly 有问题吗?
选项 2 - 请原谅我的无知,但是 possible/wise 是由 table 和不同引擎类型组成的数据库吗?据我了解,使用 MyISAM,发票 table 可以具有 office_id 和 invoice_no 的复合键,其中自动递增的数字将针对每个办公室单独增加。这是真实可行的吗?
选项 3 - 我可以在插入新办公室时创建新的 tables 吗?创建 table InvoiceX 和 InvoiceXLine,其中 X 是 office_id?
有没有更好、更简单的方法我只是没有想到?
其次,如果业务扩展并且我们平均每张发票有 30 多行,可以想象 invoice_line_ids 从长远来看会 运行。所以我可能需要一个类似的解决方案,除了上面的选项 3(为每个 invoice_no 创建一个 InvoiceLineX table)在这种情况下是完全不切实际的。
我能否简单地将 InvoiceLine table 的主键设为 invoice_no 和 product_id 的组合?
这是一个商业问题。在您知道他们打算如何发送发票之前,您为什么要猜测?也就是说,如果我必须关注未来,我会保留几个单独的 ID。
- 一个大师级的神奇数字,它就是您需要的唯一序列号(可能是 INT,也可能更大,具体取决于您的业务规模),
- "invoice originator" 列是生成它的商店(或其他),
- "invoice processing entity ID" 的另一列是 store/accounts 办公室,issued/needs 在其整个生命周期内处理它。
如果您拥有更大的灵活性,比如处理该州所有发票的州中较大的一家商店。当然这是猜测!
所有这一切的关键在于,您已经收集了大量数据,这些数据本身可能很有用,然后您的实际发票号将是这些数据的某种组合。
发挥您的想象力(或业务分析师)您可能想要保留和使用的其他内容。
无法帮助您处理数据库类型。
不要每location/invoice行有一个table。那会很糟糕。
旁注 - 你的 ID 总是会有空白。它们是不可避免的,所以尽量不要为此分心并坚持无间隙。您无法通过任何级别的性能获得它,您甚至可能不需要它。
如果您认为您可能需要无间隙或按位置细分,请放入一个批处理作业,在每天结束时分配一个 office/store/whatever 特定数量。这样你就可以使用底层 ID 的基本序列分配一些你认为合适的好数字。
我认为简短的回答是或多或少地使用你拥有的东西,除非它被证明是错误的。您所有的建议都是针对您不知道答案或不会发生的问题。
我正在为我的雇主开发一个数据库系统,其中一部分涉及创建发票。我一直在考虑 table 上的自动递增 ID,以及我需要在多大程度上为业务增长留出空间。我正在使用 InnoDB,因为该系统将非常全面,并且许多记录将得到更新。
简化了,这是我目前拥有的:
Office (An office/store of the business. Currently 2.)
office_id (PK) INT, AI, UNInvoice
invoice_no (PK) INT, AI, UN
office_id (FK) (Where the invoice originated from.)Products
product_id (PK) INT, AI, UNInvoiceLine (Ties products to an invoice to make the lines.)
invoice_line_id (PK) INT, AI, UN
invoice_no (FK)
product_id (FK)
quantity
首先,虽然我可能永远不会 运行 出发票号码,但我想知道是否有更好的方法来解决这个问题,以防万一业务确实有意想不到的办公室扩张和增加销售量。一家拥有 50 多家商店的大公司将如何解决这个问题?每个商店可能都有自己的一组从 1 开始的发票编号吗?
这是我考虑过的...
选项 1 - 我是否应该使 invoice_no 大于标准的 10 精度?不管难度如何,如果我们看到当前限制不足,这是否可以在部署后更改,或者这 impossible/highly 有问题吗?
选项 2 - 请原谅我的无知,但是 possible/wise 是由 table 和不同引擎类型组成的数据库吗?据我了解,使用 MyISAM,发票 table 可以具有 office_id 和 invoice_no 的复合键,其中自动递增的数字将针对每个办公室单独增加。这是真实可行的吗?
选项 3 - 我可以在插入新办公室时创建新的 tables 吗?创建 table InvoiceX 和 InvoiceXLine,其中 X 是 office_id?
有没有更好、更简单的方法我只是没有想到?
其次,如果业务扩展并且我们平均每张发票有 30 多行,可以想象 invoice_line_ids 从长远来看会 运行。所以我可能需要一个类似的解决方案,除了上面的选项 3(为每个 invoice_no 创建一个 InvoiceLineX table)在这种情况下是完全不切实际的。
我能否简单地将 InvoiceLine table 的主键设为 invoice_no 和 product_id 的组合?
这是一个商业问题。在您知道他们打算如何发送发票之前,您为什么要猜测?也就是说,如果我必须关注未来,我会保留几个单独的 ID。
- 一个大师级的神奇数字,它就是您需要的唯一序列号(可能是 INT,也可能更大,具体取决于您的业务规模),
- "invoice originator" 列是生成它的商店(或其他),
- "invoice processing entity ID" 的另一列是 store/accounts 办公室,issued/needs 在其整个生命周期内处理它。
如果您拥有更大的灵活性,比如处理该州所有发票的州中较大的一家商店。当然这是猜测!
所有这一切的关键在于,您已经收集了大量数据,这些数据本身可能很有用,然后您的实际发票号将是这些数据的某种组合。
发挥您的想象力(或业务分析师)您可能想要保留和使用的其他内容。
无法帮助您处理数据库类型。
不要每location/invoice行有一个table。那会很糟糕。
旁注 - 你的 ID 总是会有空白。它们是不可避免的,所以尽量不要为此分心并坚持无间隙。您无法通过任何级别的性能获得它,您甚至可能不需要它。
如果您认为您可能需要无间隙或按位置细分,请放入一个批处理作业,在每天结束时分配一个 office/store/whatever 特定数量。这样你就可以使用底层 ID 的基本序列分配一些你认为合适的好数字。
我认为简短的回答是或多或少地使用你拥有的东西,除非它被证明是错误的。您所有的建议都是针对您不知道答案或不会发生的问题。