【发布时间】:2018-04-25 13:28:53
【问题描述】:
我有一个物业管理应用程序,其中内置了完整的会计系统。我有一个日记帐分录表,用于控制各种会计活动的所有过帐,例如:
发票
付款
账单
存款
在某些情况下,有必要将这些实体加入日记帐分录表,以按不同的属性和单位汇总会计分录。
我正在寻找最好的方法来做到这一点。我有几个选择:
1) 在日记帐分录表上添加一个外键以链接到 invoice_id、payment_id、bill_id、deposit_id,但是这些的大多数组合将是互斥的(即存款没有付款)所以我会有案例对于给定的日记条目,我将在那些不适用于该给定日记条目的外键中有空值。
2) 我可以创建一个外键,我们称之为 doc_id 和另一列 doc_type 来指示文档的类型(发票、付款、账单、存款等),并结合 doc_id 和 document_type_id 来引用其中一个扩展表上的主键(即 doc_id = 1 & doc_type = Invoice,该组合将引用 Invoice 表上的主键)。
哪种方法更好?还是我认为这一切都错了?
【问题讨论】:
-
我不是数据库专家,几个月前才开始。要查看我是否理解您的问题,您有一个主表 (doc) 和其他表连接到它,并使用具有 1:n 关系的引用主键?
-
是的,主表实际上是 journal_entry 表,Invoice、Payment、Deposit 和 Bill 表需要引用其中的相应条目,但是它们不会都有输入到的每条记录的值journal_entry 表(如选项 1 所示)。 1:n,是的。
-
在我看来,每种方法都有其自身的问题。第一个选项表示在 journal_entry 中,每个表都有特定的列。因此,如果您需要添加具有相同引用类型的新表,则必须更改主表并为其添加一列。第二个选项将导致每个项目有很多行。每一行都表示要查找的位置。
-
我会在主表和其他表之间建立一个连接表。一个有 3 列的表:journal_id、ref_id、ref_id_type。并将其用作连接管理器。这样如果你需要更新日志数据,你只需要更新1行(修复选项2的问题),如果你想添加新表,只需要在连接表中添加1行。
-
也许我遗漏了一些东西,但是为什么不能在 Invoices、Payments 等中放置一个指向 Journal 表主键的外键?
标签: mysql database database-design