繁体   English   中英

在多租户应用中需要一些有关发票数据库设计的建议

[英]Need some suggestions for database design for Invoices in a multi-tenant app

我需要有关在多租户应用程序中设计发票架构的一些指导。 我有一个名为EmployeePay的表,其中包含生成发票所需的所有信息。 发票表将包含发票编号,发票创建日期和VAT税率。 我正在考虑为每个Tenant创建一个Sequence对象以生成发票编号。

EmployeePay Table: EmployeeID, Hours, Rate, InvoiceID (FK)

Invoice Table: InvoiceID (PK) (Identity), InvoiceNumber, InvoiceDate, VATRate, TenantID

数据库中可以有数百个Sequence对象,因为我必须为每个租户创建一个对象吗? 我还必须创建相同数量的存储过程,该存储过程将返回下一个发票编号(我更喜欢为每个租户分配一个独立的存储过程,而不是在select case语句中使用一个具有数百种选择的大型存储过程)。

另一个需要考虑的问题是,从理论上讲,基于交易表( EmployeePay )插入到主表( Invoice ),然后使用其主键( InvoiceID )更新交易表是吗?

提前致谢。

首先要确保这种关系是一对多或多对多的。 如果您正在考虑一位拥有多张发票的员工,那么它就是一对多的关系,则可以如下创建表格:

EmployeePay Table: EmployeeID (PK) (Identity), Hours, Rate

Invoice Table: InvoiceID (PK) (Identity), EmployeeID (FK), InvoiceNumber, InvoiceDate, VATRate, TenantID

编辑:

我不知道您正在使用哪个数据库,但是要进行增量序列检查:

  1. 对于MySQL,请检查此LINK
  2. 如果您使用的是Oracle,请检查此链接

我建议您创建另一个可以称为InvoiceNumber的表,其中将包含InvoiceNumberId(Int)TenantId(Fk)CurrentSequenceNumber(Int)

CurrentSequenceNumber的意义在于它将是简单的整数,可用于生成下一个Invoicenumber。 InvoiceNumberId将是用于主键用途的Identity列(您可能有也可能没有)。

表的结构如下所示。

在此处输入图片说明

现在,您只需要创建一个存储过程,该存储过程将输入参数作为TenantId,并且有责任通过从上表中读取CurrentSequenceNumber来生成下一个发票编号。

例如,如果我们需要为ID为15的租户生成新的发票ID,则SP将具有您的业务逻辑,我假设仅创建一个以“ Inv-”为前缀的字符串,其前缀为CurrentSequenceNumber的增量值,因此Procedure的输出为。

INV-0009

然后,在生成此数字后,SP会将InvoiceNumberId 3的值增加到9。

因此,所有内容将仅由Single表和Single过程管理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM