1

这是从这个问题中产生的一个新问题

由于答案,问题的性质发生了变化,所以我认为发布一个新问题是可以的(?)。

您可以在下面看到我的原始数据库设计。我有 3 个表,现在我需要一个查询来获取特定用户的所有记录以进行 running_balances 计算。

  • 交易是在用户之间进行的,就像相互信用一样。所以单位在用户之间交换。
  • 清单是带入系统的物理内容;用户为此获得单位。
  • 消费是消耗的物质;用户必须为此付费。
|------------------------------------------------- --------------------------|
| 类型 | 交易 | 清单 | 消耗品|
|------------------------------------------------- --------------------------|
| 专栏 | 日期 | 日期 | 日期 |
| | 债权人(FK用户) | 债权人(FK用户) | |
| | 借方(FK 用户) | | 借方(FK 用户) |
| | 服务(FK服务)| | |
| | | 资产(FK资产) | 资产(FK资产) |
| | 金额 | 金额 | 金额 |
| | | | 价格 |
|------------------------------------------------- --------------------------|

(请注意,“金额”的单位不同;这些是根据这些金额进行的条目和计算。超出了解释原因的范围,但这些是字段)。

问题是:“这可以/应该在一个表中还是多个表中(就像我现在拥有的那样)?” 我喜欢 3 表解决方案,因为它在语义上更有意义。但是,对于 running_balances,我需要这样一个复杂的选择语句(可能会产生负面的性能结果)。上面链接中的原始问题要求此声明,这里我问数据库设计是否合适(抱歉四次重复发布,希望没问题)。

4

3 回答 3

2

你说数量将是不同的单位,那么我认为你应该为自己保留每张桌子。

我个人讨厌具有“不同规则”的数据库设计,用于根据存储在一行中的实体类型填充表。它只是变得一团糟,而且很难让你的约束在这样的桌子上正确地保持活力。

只需创建一个索引视图来回答您的余额问题,以保持您的查询“简单”

于 2009-09-12T08:31:12.633 回答
2

当您尝试为单项记账实施总账系统时,也会出现同样的问题。您所说的“交易”对应于“转账”,例如从储蓄到支票。您所说的“发明”对应于“收入”,例如存入薪水。您所说的“消耗”对应于“费用”,例如您支付电费时。唯一的区别是,在簿记中,一切都已减少为美元(或其他货币)价值。所以你不必担心识别资产,因为一美元和另一美元一样好。

所以问题出现了,您是否需要为“借方金额”和“贷方金额”设置单独的列,或者是否可以只为“金额”设置一列,并为借方输入正数,为贷方输入负数。如果您正在实施复式记账而不是单式记账,则基本上会出现相同的问题。

在内部算术和内部数据处理方面,当您采用单列方法时,事情要简单得多。例如,要测试给定的交易是否平衡,您所要做的就是询问总和(金额)是否等于零。

当人们需要传统的簿记格式用于数据输入表格、屏幕检索和发布的报告时,就会出现复杂情况。传统格式需要两个单独的列,分别标记为“借方”和“贷方”,它们只包含正数或空白,并限制每个项目必须在借方或贷方中都有一个条目,但不能同时在两者中,并且另一列必须是留空。这些转换需要在外部格式和内部格式之间进行一定的编程。

这真的是一个选择问题。是保留并排借方和贷方的传统簿记格式更好,还是前进到以有意义的方式使用负数的格式更好?有一些情况有利于这些设计选择。

就您而言,这将取决于您打算如何使用数据。我将使用这两种设计中的每一种构建原型,然后开始为每种设计进行基本的 CRUD 处理。无论哪一个在您的环境中更容易工作,都是可以选择的。

于 2009-09-12T12:54:56.993 回答
0

对此没有明确的答案,答案很大程度上取决于回答者采用的数据库设计方法。

我的建议是尝试两种方式,看看哪一种在查询、性能和维护/可用性之间具有最佳折衷。

您始终可以设置一个视图,将所有 3 个表作为一个表返回以进行查询,并具有一个type用于表示行相关的进程类型的字段。

于 2009-09-12T08:34:15.963 回答