这是一个由this question
产生的新问题由于答案,问题的性质发生了变化,所以我认为发布一个新问题是好的(?)。
您可以在下面看到我原来的数据库设计。我有3个表,现在我需要一个查询来获取特定用户的所有记录以进行running_balances计算。
|--------------------------------------------------------------------------| | type | transactions | inventarizations | consumations | |--------------------------------------------------------------------------| | columns | date | date | date | | | creditor(FK user) | creditor(FK user) | | | | debitor(FK user) | | debitor(FK user) | | | service(FK service)| | | | | | asset(FK asset) | asset(FK asset) | | | amount | amount | amount | | | | | price | |--------------------------------------------------------------------------|
(注意'金额'是不同的单位;这些是条目,并对这些金额进行计算。在范围之外解释原因,但这些是字段)。
问题是:“可以/应该在一个表格中还是多个表格(我现在拥有它)?”我喜欢3表解决方案,因为它在语义上更有意义。但是,对于running_balances,我需要这样一个复杂的select语句(可能有负面的性能结果)。上面链接中的原始问题要求提供此声明,我在这里询问db设计是否合适(道歉四次双重发布,希望没问题)。
答案 0 :(得分:2)
你说金额将是不同的单位,那么我认为你应该保留每张表。
我个人讨厌数据库设计,它根据存储在一行中的实体类型填充表格具有“不同的规则”。它只是变得混乱,很难让你的约束在这样的桌子上保持活力。
只需创建一个索引视图,该视图将回答您的余额问题,以使您的查询“简单”
答案 1 :(得分:2)
当您尝试为单一记账簿实施总帐系统时,会出现同样的问题。你所谓的“交易”对应于“转移”,例如从储蓄到检查。你所谓的“发明化”对应于“收入”,就像存入薪水一样。您所谓的“消费”对应于“费用”,就像您支付电费一样。唯一的区别是,在簿记中,一切都已降低到美元(或其他货币)的价值。因此,您不必担心识别资产,因为一美元和另一美元一样好。
因此,问题是您是否需要为“借方金额”和“贷方金额”设置单独的列,或者您是否只能为“金额”设置一列,并为借方输入一个正数和负数为学分。基本上同样的问题是,如果你实施复式簿记而不是单一记账。
在内部算术和内部数据处理方面,采用单列方法时,事情要简单得多。例如,要测试给定的交易是否处于平衡状态,您只需要询问总和(金额)是否等于零。
当人们需要传统的bookeeping格式的数据输入表格,屏幕检索和已发布的报告时,就会出现复杂情况。传统格式需要两个单独的列,标记为“借记”和“信用”,它们只包含正数或空白,但约束条件是每个项目必须在借方或贷方中有条目,但不能同时包含两个条目,另一列必须是留空了。这些转换需要在外部格式和内部格式之间进行一定量的编程。
这真的是一个选择问题。保留传统的簿记格式并排借记和贷记可以更好吗,还是更好地推进到以有意义的方式使用负数的格式?在某些情况下,有利于这些设计选择。
在您的情况下,它将取决于您打算如何使用数据。我将使用两种设计中的每一种构建原型,然后开始为每种设计进行基本的CRUD处理。无论哪种环境在您的环境中更容易实现,都可以选择。
答案 2 :(得分:0)
对此没有明确的答案,答案主要取决于回答者采用的数据库设计方法。
我的建议是两种方式进行试验,看看哪一方在查询,性能和维护/可用性之间有最好的妥协。
您始终可以设置一个视图,将所有3个表作为一个表进行查询,并为行所涉及的进程类型提供type
字段。