我需要一些指导,为多租户应用程序中的发票设计架构。
我有一个名为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
)进行更新交易表?
提前致谢。
答案 0 :(得分:0)
首先要确保这种关系要么是一对多,要么是多对多。如果您正在考虑一名员工将拥有多张发票,那么它的一对多关系就可以创建您的表格,如下所示:
EmployeePay Table: EmployeeID (PK) (Identity), Hours, Rate
Invoice Table: InvoiceID (PK) (Identity), EmployeeID (FK), InvoiceNumber, InvoiceDate, VATRate, TenantID
我不知道您正在使用哪个数据库,但是对于增量序列检查:
答案 1 :(得分:0)
我建议你创建另一个表可以调用InvoiceNumber,这将包含 InvoiceNumberId(Int), TenantId(Fk), CurrentSequenceNumber(Int) )强>
CurrentSequenceNumber的意义在于它将是一个简单的整数,可用于生成下一个Invoicenumber。 InvoiceNumberId 将是主键用途的标识列(您可能拥有也可能没有)。
表的结构如下所示。
现在您只需创建一个存储过程,该过程将输入参数作为TenantId,并且有责任通过从上表中读取CurrentSequenceNumber来生成下一个发票编号。
例如,如果我们需要为id为15的租户生成新的Invoice Id,那么SP将拥有您的业务逻辑我假设只是创建一个字符串,其中“Inv-”作为前缀,增加了CurrentSequenceNumber的值,因此Procedure的输出将是
<强> INV-0009 强>
然后,在生成此数字后,SP会将InvoiceNumberId 3的值增加到9。
所以一切都将由Single table和Single过程管理。