代码之家  ›  专栏  ›  技术社区  ›  unsafe_where_true

这应该是3个sql表还是一个?

  •  1
  • unsafe_where_true  · 技术社区  · 16 年前

    这是一个新问题 this question

    由于答案,问题的性质改变了,所以我认为发布一个新的可以吗?.

    你可以看到我原来的DB设计如下。我有3个表,现在需要一个查询来获取特定用户的所有记录,以便运行余额计算。

    • 交易是用户之间的,就像相互的信用。所以单位在用户之间交换。
    • 发明是带到系统中的物理内容;用户为此获取单位。
    • 消耗是消耗的物质,用户必须为此支付单位。
    |--------------------------------------------------------------------------|
    |  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个表的解决方案,因为它在语义上更有意义。但是我需要这样一个复杂的select语句(可能有负的性能结果)来实现运行平衡。上面链接中最初的问题是问这个声明,这里我问的是数据库设计是否合适(抱歉四次重复发帖,希望没问题)。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Walter Mitty    16 年前

    当您尝试实现用于单分录记账的总账系统时,也会出现同样的问题。你所说的“交易”对应于“转账”,比如从储蓄到支票。你所说的“发明”与“收入”相对应,就像存工资一样。你所说的“消费”与“费用”相对应,比如你付电费的时候。唯一的区别是,在记账时,所有的东西都被换算成美元(或其他货币)价值。所以你不必担心识别资产,因为一美元和另一美元一样好。

    因此,问题是,你是否需要为“借方金额”和“贷方金额”分列,或者,你是否可以只为“金额”一列,并输入借方的正数和贷方的负数。本质上,同样的问题也会出现,如果你是实行复式记账,而不是单一分录记账。

    在内部算术和内部数据处理方面,采用单列方法要简单得多。例如,要测试给定事务是否处于平衡状态,只需询问sum(amount)是否等于零。

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

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

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

        2
  •  2
  •   Heiko Hatzfeld    16 年前

    你说数量是不同的单位,那么我想你应该把每一张桌子都留着。

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

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

        3
  •  0
  •   Russ Cam    16 年前

    目前还没有明确的答案,答案将主要取决于答案者采用的数据库设计方法。

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

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