这些应该是3个SQL表还是一个?

时间:2009-09-12 08:12:32

标签: sql database-design data-modeling

这是一个由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设计是否合适(道歉四次双重发布,希望没问题)。

3 个答案:

答案 0 :(得分:2)

你说金额将是不同的单位,那么我认为你应该保留每张表。

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

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

答案 1 :(得分:2)

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

因此,问题是您是否需要为“借方金额”和“贷方金额”设置单独的列,或者您是否只能为“金额”设置一列,并为借方输入一个正数和负数为学分。基本上同样的问题是,如果你实施复式簿记而不是单一记账。

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

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

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

在您的情况下,它将取决于您打算如何使用数据。我将使用两种设计中的每一种构建原型,然后开始为每种设计进行基本的CRUD处理。无论哪种环境在您的环境中更容易实现,都可以选择。

答案 2 :(得分:0)

对此没有明确的答案,答案主要取决于回答者采用的数据库设计方法。

我的建议是两种方式进行试验,看看哪一方在查询,性能和维护/可用性之间有最好的妥协。

您始终可以设置一个视图,将所有3个表作为一个表进行查询,并为行所涉及的进程类型提供type字段。

相关问题