将不同帐户类型(数据库类型)与付款和发票相关联的正确方法是什么?

时间:2016-08-18 21:15:35

标签: sql-server database-design e-commerce erp accounting

在开发Web应用程序期间,我遇到了一些困难。为了简单起见,我在这个问题上简化了应用程序的复杂性。

此网络应用程序的目的是出售保险。保险可以通过代理商(代理商)或直接通过电话(客户)购买。保险单可以通过代理机构支付,也可以由客户直接支付保单。因此,从多个来源(代理商/客户)欠款(发票)和收款(付款)。

结算选项:

  • 代理商(代理商从应用程序之外的应用程序收集)
  • 客户

这里变得复杂。代理商存储在与客户不同的数据库表中(出于显而易见的原因)。但是,代理商和客户都需要能够进行付款并分配发票。我很难弄清楚如何创建正确的数据库模式,以便将这两种类型的数据库记录连接到他们的发票和付款。

我的初步计划是建立单独的关系(加入)表格,将代理商和客户链接到发票/付款。 dbschema 01

然而,既然我已经更多地考虑了这个问题,我认为将两个代理商和客户合并为一个单一的收款人"表格,然后与付款/发票相关联。收款人表只存储主键。它不会包含收款人的实际名称或信息 - 相反,我会通过与代理商或客户表格的JOIN来提取数据。

dbschema 02

无论我选择什么解决方案,我在创建新的付款记录时仍然面临问题,我需要扫描代理商和客户表中可能的收款人。我想知道从数据库架构的角度(或从会计/电子商务的角度来看)是否有正确的方法来解决这个问题。

处理此类情况的正确方法是什么?欢迎所有的想法和可能的解决方案!

更新01:

在提出一些有用的建议(见下文)后,我提出了一个可能的解决方案,可以在保持数据规范化的同时解决这个问题。

enter image description here

关于这种方法的一个问题是我错误的方法是,我必须选择多个表来获取所有可能进行付款和/或分配发票的人的列表。

在这种情况下,这可能是不可避免的,因为确实有不同的类型"可以与付款和发票相关联的人员。我遇到了一种情况,即我有两种不同类型的记录需要与同一事物相关联。在上述方法中,我使用FK将每个表(代理商/客户)链接到收款人记录(统一两个代理商/客户的表格),然后最终将它们链接到付款和发票。

这是正确的解决方案吗?或者是否有一些我忽略的事情?

2 个答案:

答案 0 :(得分:1)

我的建议是:而不是Payees表 - 有两个链接表:

PayeeInvoices {
    Id, --PK
    PayeeId, 
    PayeeType, 
    InvoiceId --FK to Invoices tabse
} 

PayeePayments {
    Id, --PK
    PayeeId, 
    PayeeType, 
    PaymentId --FK to Payments table.
}.

PayeeType是两个选项:客户或代理商。创建新的付款记录时,您可以PayeeInvoices查询InvoiceId以获取PayeeType和相应的PayeeId,然后在相应的表格中查找其余数据。

修改

现在有了第二个想法。您可以在PayeeInvoicesPayeePayments表中放置PayeeIdPayeeType列,而不是两个额外的表InvociesPayments发票或付款仅属于一个收款人(客户或代理商)。不过,我的解决方案都没有真正规范化。

答案 1 :(得分:1)

有几种选择:

  • 你可能会像使用OOP编程和继承那样做。

    • 有一个表Person,其中包含唯一ID和类型(代理商,客户,未来更多)。另外,您可以添加包含元数据的列,如插入/何时/为什么以及status / soft-delete / ???
    • 有两个表代理商和客户,两个都持有PersonID作为FK。
    • 您的Payee是人
  • 您可以使用带有VIEW的架构UNION ALL来返回一个结果中的modell的两个表。此视图的唯一索引应确保您拥有唯一键,至少是表源和ID的组合。

  • 您可以使用包含table-source和ID 的中间表作为唯一键,并在付款流程中使用此双列ID

  • 肯定还有其他几个......

我最好的朋友是第一个选择...