Complicated database design
我们公司有一个数据库设计的情况。我们正试图找出设计数据库以存储事务数据的最佳方法。我需要专家的建议来实现最佳关系设计。问题:我们的系统中有不同类型的"实体",例如客户、服务、经销商等。这些实体在彼此之间进行资金转移。我们需要将传输的历史记录存储在数据库中。
解决:
一张转账表和另一张保存"账户"信息的表。有三个表:"客户"、"服务"、"经销商"。还有另一个表"账户"。账户可以与上述任何"实体"相关;这意味着(这也是要求),在逻辑上,与实体和账户之间应该有一对一的关系。但是,我们只能将帐户ID存储在实体表中,而不能将实体的外键存储在帐户表中。在这里,问题发生在数据库设计方面。因为如果有客户的账户,就不受数据库设计的限制,不存储在服务表等,现在我们只能将所有转账保存在一个表中,因为所有实体之间的账户是统一的。
将余额信息保存在表Primary Entities表中,并为所有传输保留单独的表。在这里,对于实体之间的所有类型的转移,我们都保留单独的表。例如,客户和服务提供商之间的转移将存储在一个名为"支出"的表中。另一个表将有用于服务和经销商之间转移的转移数据,称为"佣金"等。在这种情况下,我们不会将所有资金转移存储在一个表中,但由于"支出"和"佣金"表仅在两个特定实体之间,所以外方密钥被正确定义。
根据最佳实践,上述哪一个解决方案是正确的,为什么?
- 你关于最佳实践的问题必须由几个世纪以来关于复式簿记的价值实践来回答。在某种程度上,数字革命使这些做法有些过时了。但其中许多仍然是良好的实践,甚至可能是"最佳实践"。为什么总账系统不是企业解决方案的一部分,即使您必须滚动自己的系统才能将其与其他数据需求集成?
- 当我问到最佳实践时,我指的是根据数据库模式设计的最佳实践,而不是会计。目前的问题是数据库模式,总分类账系统将建立在我提到的账户之上。当然,我不能用一个问题来解释完整的数据库。
- 我知道这是关于一个模式。我的评论是想让您看到数据库会计世界中发布的模式,这些模式精确地完成了您要做的工作,跟踪涉及客户、经销商和服务的事务。
- 伟大的!现在,请就当我们有三个不同的实体时如何实现它提出建议,您能给我一些关于已发布模式的链接吗?
如果您只是在寻找声称可以处理像您这样的情况的模式,那么有一个拥有数百个已发布模式的网站。其中一些与存储有关客户和供应商的交易数据有关。你可以采取其中一个并加以调整。
http://www.databaseanswers.org/datau模型/
如果您的问题是如何将账户与业务联系人联系起来,请继续阅读。
客户、服务和经销商都是一些我要联系的超级类的子类。有两种众所周知的设计模式用于在数据库表中建模子类。还有一种称为共享主键的技术,可以与其中一种技术一起使用以获得良好的优势。
看一下这三个标签下面的信息和问题:
单表继承类表继承共享主键
如果使用类表继承和共享主键,则最终将得到与联系人相关的四个表:联系人、客户、经销商和服务。contacts中的每个条目将在三个子类表中的一个子类表中具有相应的条目。
在accounts表中有一个fk,我们称之为accounts.contactid,它不仅引用contacts中的一行,还引用与当前案例相关的客户、经销商和服务中的一行。
这可能对你很有效。或者,在一些简单的情况下,单表表继承可以很好地工作。这取决于您的数据及其预期用途的详细信息。
您可以使用fk为客户、经销商和服务创建三个字段的表帐户,这将解决问题。但是您也可以为每种类型的具有会计数据的实体创建三个表。您可以在系统设计中处理多系统案例。每个系统解决任务。但对于设计而言,您需要对算法复杂性、性能和其他系统需求进行优缺点分析。例如,一个表的代码编写更简单,但三个表的SQL数据库性能更好。
- 三列并不能解决这个问题,因为在这种设计中,您在技术上允许模式将一个帐户链接到三个不同的实体。
- 在科目表中创建一对一实体时,您可以通过业务逻辑来保存它。但是,如果您想要更多地控制数据一致性,可以在RDBMS中放置约束。例如在触发器中。
- 如果我们这样做,你认为这是一个好的数据库设计?
- 需要对每个数据模型设计决策的优缺点进行完整的分析。在这种情况下,三个字段的主要缺点是空值。这不好。具有三个表的模型更清晰,SQL将具有更高的性能,但代码将更复杂,将来您可能会遇到系统开发问题,因为您的系统中有逻辑实体"contactor",但它分为三种类型。每种类型都有自己的计算模型。我认为您首先需要考虑您的业务领域模型。
- 如果您将有清晰的业务领域模型,您将在下一步得到清晰的数据模型。在我看来,你必须在模特身上看到"美"。
- 我们考虑过它,但不幸的是它不是一个好的数据库模式设计。
- 你担心什么?
- 为了保持数据的完整性,我希望模式本身是自给自足的。我不想依赖数据模型/代码来确保数据完整性。
- 在RDBMS级别的复杂应用程序中是不可能的。实际上,您可以通过触发器和存储过程,但更有效的方法是使用API和事务与RDBMS进行交互。它将为你的应用程序提供更多的可移植性。
- 当可以在数据库级别上实现触发器时,我们不需要在编程级别上编写触发器或执行触发器,以确保数据完整性。此链接帮助我们:stackoverflow.com/questions/3579079/…查找类表继承(即每个类型的表继承)
- 同意,这是一个很好的解决(账户对账户类型)关系的方法。