Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 需要一些关于多租户应用中发票数据库设计的建议吗_Sql Server_Database_Database Design - Fatal编程技术网

Sql server 需要一些关于多租户应用中发票数据库设计的建议吗

Sql server 需要一些关于多租户应用中发票数据库设计的建议吗,sql-server,database,database-design,Sql Server,Database,Database Design,我需要一些关于在多租户应用程序中设计发票模式的指导。 我有一个名为EmployeePay的表,其中包含生成发票所需的所有信息。发票表将包含发票编号、发票创建日期和增值税税率。我正在考虑为每个租户创建一个序列对象,以生成发票号 EmployeePay Table: EmployeeID, Hours, Rate, InvoiceID (FK) Invoice Table: InvoiceID (PK) (Identity), InvoiceNumber, InvoiceDate, VATRate

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

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

Invoice Table: InvoiceID (PK) (Identity), InvoiceNumber, InvoiceDate, VATRate, TenantID
一个数据库中有数百个Sequence对象可以吗?因为我必须为每个租户创建一个Sequence对象?我还必须创建相同数量的存储过程来返回下一个发票号(我更喜欢为每个租户创建一个单独的存储过程,而不是在select case语句中创建一个包含数百个选项的大型存储过程)

另一个问题是,根据事务表(
EmployeePay
)在主表(
Invoice
)中插入数据,然后使用其主键(
InvoiceID
)更新事务表是否符合理论


提前感谢。

首先确保这是一对多或多对多的关系。如果您考虑一名员工将拥有多张发票,那么这是一对多关系,您可以按照以下方式创建表:

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

Invoice Table: InvoiceID (PK) (Identity), EmployeeID (FK), InvoiceNumber, InvoiceDate, VATRate, TenantID
编辑: 我不知道您正在使用哪个数据库,但用于增量序列检查:

  • 对于MySQL,请检查此项
  • 如果您使用的是Oracle,请检查此项

  • 首先,确保关系不是一对多就是多对多。如果您考虑一名员工将拥有多张发票,那么这是一对多关系,您可以按照以下方式创建表:

    EmployeePay Table: EmployeeID (PK) (Identity), Hours, Rate
    
    Invoice Table: InvoiceID (PK) (Identity), EmployeeID (FK), InvoiceNumber, InvoiceDate, VATRate, TenantID
    
    编辑: 我不知道您正在使用哪个数据库,但用于增量序列检查:

  • 对于MySQL,请检查此项
  • 如果您使用的是Oracle,请检查此项

  • 我建议您创建另一个名为InvoiceNumber的表,它将包含InvoiceNumberId(Int)TenantId(Fk)CurrentSequenceNumber(Int)

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

    表的结构如下所示

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

    例如,如果我们需要为Id为15的租户生成新的发票Id,那么SP将使用您的业务逻辑,我假设只是创建一个前缀为“Inv-”的字符串,前缀为CurrentSequenceNumber的递增值,因此过程的输出将为

    Inv-0009

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


    因此,所有内容都将仅通过单个表和单个过程进行管理。

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

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

    表的结构如下所示

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

    例如,如果我们需要为Id为15的租户生成新的发票Id,那么SP将使用您的业务逻辑,我假设只是创建一个前缀为“Inv-”的字符串,前缀为CurrentSequenceNumber的递增值,因此过程的输出将为

    Inv-0009

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


    因此,所有内容都将仅通过单个表和单个过程进行管理。

    因此,基本上您需要租户级别的InvoiceNumber系列。这意味着,如果我们为同一租户生成第二张发票,那么它应该增加1??这是正确的,每个租户都应该有自己的发票编号系列。我建议不要这样做。数据库对象的数量不应取决于数据库用户的数量。有很多方法可以计算下一个发票号,而不必为每个租户创建一个sequence对象。@ZoharPeled我同意你的观点,但除了使用序列或列并递增之外,我真的想不出更好的解决方案。如果你能分享更多的方法,那就太好了。所以基本上你想要一个租户级别的InvoiceNumber系列。这意味着如果我们为同一个租户生成第二个发票,那么它应该增加1??这是正确的,每个租户都应该有自己的发票编号系列。我建议不要这样。数据库对象的数量不应取决于数据库用户的数量。有很多方法可以计算下一个发票号,而不必为每个租户创建一个sequence对象。@ZoharPeled我同意你的观点,但除了使用序列或列并递增之外,我真的想不出更好的解决方案。如果您可以共享更多的方法,那就太好了。在您的序列表中,为什么要将[InvoiceNumberId]作为PK?每个租户只有一个序列,所以使用该序列。序列不是一个“Id”,它只是一个数字。@Tony.你是对的SequenceId不是一个正确的coulmn名称,它只是一个数字,我会更新它。。。还有w