复杂的数据库设计

Complicated database design

我们公司有一个数据库设计的情况。我们正试图找出设计数据库以存储事务数据的最佳方法。我需要专家的建议来实现最佳关系设计。问题:我们的系统中有不同类型的"实体",例如客户、服务、经销商等。这些实体在彼此之间进行资金转移。我们需要将传输的历史记录存储在数据库中。

解决:

  • 一张转账表和另一张保存"账户"信息的表。有三个表:"客户"、"服务"、"经销商"。还有另一个表"账户"。账户可以与上述任何"实体"相关;这意味着(这也是要求),在逻辑上,与实体和账户之间应该有一对一的关系。但是,我们只能将帐户ID存储在实体表中,而不能将实体的外键存储在帐户表中。在这里,问题发生在数据库设计方面。因为如果有客户的账户,就不受数据库设计的限制,不存储在服务表等,现在我们只能将所有转账保存在一个表中,因为所有实体之间的账户是统一的。
  • 将余额信息保存在表Primary Entities表中,并为所有传输保留单独的表。在这里,对于实体之间的所有类型的转移,我们都保留单独的表。例如,客户和服务提供商之间的转移将存储在一个名为"支出"的表中。另一个表将有用于服务和经销商之间转移的转移数据,称为"佣金"等。在这种情况下,我们不会将所有资金转移存储在一个表中,但由于"支出"和"佣金"表仅在两个特定实体之间,所以外方密钥被正确定义。
  • 根据最佳实践,上述哪一个解决方案是正确的,为什么?


    如果您只是在寻找声称可以处理像您这样的情况的模式,那么有一个拥有数百个已发布模式的网站。其中一些与存储有关客户和供应商的交易数据有关。你可以采取其中一个并加以调整。

    http://www.databaseanswers.org/datau模型/

    如果您的问题是如何将账户与业务联系人联系起来,请继续阅读。

    客户、服务和经销商都是一些我要联系的超级类的子类。有两种众所周知的设计模式用于在数据库表中建模子类。还有一种称为共享主键的技术,可以与其中一种技术一起使用以获得良好的优势。

    看一下这三个标签下面的信息和问题:

    单表继承类表继承共享主键

    如果使用类表继承和共享主键,则最终将得到与联系人相关的四个表:联系人、客户、经销商和服务。contacts中的每个条目将在三个子类表中的一个子类表中具有相应的条目。

    在accounts表中有一个fk,我们称之为accounts.contactid,它不仅引用contacts中的一行,还引用与当前案例相关的客户、经销商和服务中的一行。

    这可能对你很有效。或者,在一些简单的情况下,单表表继承可以很好地工作。这取决于您的数据及其预期用途的详细信息。


    您可以使用fk为客户、经销商和服务创建三个字段的表帐户,这将解决问题。但是您也可以为每种类型的具有会计数据的实体创建三个表。您可以在系统设计中处理多系统案例。每个系统解决任务。但对于设计而言,您需要对算法复杂性、性能和其他系统需求进行优缺点分析。例如,一个表的代码编写更简单,但三个表的SQL数据库性能更好。