【问题标题】:Should these be 3 SQL tables or one?这些应该是 3 个 SQL 表还是一个?
【发布时间】:2009-09-12 08:12:32
【问题描述】:

这是由this question提出的一个新问题

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

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

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

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

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

【问题讨论】:

    标签: sql database-design data-modeling


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • Walter,您了解问题的真正核心 -> +1。就我而言,它甚至更复杂,但基本上你明白了。简而言之:我不能使用单列方法。我将这样做:尝试不同的解决方案,看看什么最有效;最终可能会在易用性和性能之间进行一些权衡。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        相关资源
        最近更新 更多