复杂的数据库设计

Complicated database design

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

解决方案:

  1. 一个 table 转账和另一个 table 保留“帐户”信息。有三个 tables “Customers”、“Services”、“Dealers”。还有另一个 table “帐户”。一个帐户可以与上述任何“实体”相关;这意味着(这就是要求)逻辑上应该存在一对一的关系 to/from 实体和帐户。但是,我们只能将Account_ID存储在Entitiestable中,而不能将Entities的外键存储在Accountstable中。这里的问题发生在数据库设计方面。因为如果有一个客户的账户,它不受数据库设计的限制,不存储在服务table等中。现在我们可以将所有转账保存在一个table中,因为账户是统一的。实体。
  2. 将余额信息保存在 table 主要实体 table 中,并为所有转账单独 table。对于实体之间的各种传输,我们保持单独的 tables。例如,客户和服务提供商之间的转账将存储在名为“支出”的 table 中。另一个 table 将有用于服务和经销商之间转移的转移数据,称为“佣金”等。在这种情况下,我们不会将所有资金转移存储在一个 table 中,但外键是正确定义,因为 table 的“支出”和“佣金”仅在两个特定实体之间。

根据最佳实践,以上给出的解决方案中哪一个是正确的,为什么?

您可以创建 table 带有 FK 的三个字段的帐户给客户、经销商和服务,这将解决问题。但您也可以为每种类型的具有会计数据的实体制作三个 table。您在系统设计中处理过多系统案例。每个系统解决任务。但是为了做出决定,您需要对算法复杂性、性能和其他系统要求进行优缺点分析。例如,一个 table 将更易于编码,但三个 table 可提供更高的 sql 数据库性能。

如果您只是在寻找声称可以处理像您这样的案例的模式,那么可以找到一个包含数百个已发布模式的网站。其中一些与存储有关客户和供应商的交易数据有关。您可以采用其中一种并进行调整。

http://www.databaseanswers.org/data_models/

如果您的问题是关于如何将客户与业务联系人相关联,请继续阅读。

客户、服务和经销商都是某些超级 class 的子 class,我称之为联系人。在数据库 table 中对子 class 进行建模有两种众所周知的设计模式。并且有一种称为共享主键的技术可以与其中之一一起使用以发挥很好的优势。

查看在这三个标签下分组的信息和问题:

如果您使用 class table 继承和共享主键,您最终会得到四个与联系人相关的 table:联系人、客户、经销商和服务。 Contacts 中的每个条目都将在三个子 class table 之一中有一个对应的条目。

账户 table 中的 FK,我们称它为 Accounts.ContactID 不仅会引用联系人中的一行,还会引用客户、经销商、服务中与案例有关的一行手。

这可能对你很有效。或者,在一些更简单的情况下,单个 table table 继承效果很好。这取决于您的数据的详细信息和您的预期用途。