需要为多租户应用中的发票数据库设计提供一些建议

时间:2015-11-17 08:51:36

标签: sql-server database database-design

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

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

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

在数据库中有数百个Sequence对象是否可以,因为我必须为每个租户创建一个?我还必须创建相同数量的存储过程,它们返回下一个发票号(我更喜欢每个租户的单独存储过程,而不是在select case语句中有一个包含数百个选项的大型存储过程)。

另一个问题是,理论上是根据事务表(Invoice)插入主表(EmployeePay),然后使用其主键(InvoiceID)进行更新交易表?

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

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

修改

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

  1. for MySQL检查此LINK
  2. 如果您使用的是Oracle,请查看此LINK

答案 1 :(得分:0)

我建议你创建另一个表可以调用InvoiceNumber,这将包含 InvoiceNumberId(Int) TenantId(Fk) CurrentSequenceNumber(Int) )

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

表的结构如下所示。

enter image description here

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

例如,如果我们需要为id为15的租户生成新的Invoice Id,那么SP将拥有您的业务逻辑我假设只是创建一个字符串,其中“Inv-”作为前缀,增加了CurrentSequenceNumber的值,因此Procedure的输出将是

<强> INV-0009

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

所以一切都将由Single table和Single过程管理。