【问题标题】:Schema for storing "binary" values, such as Male/Female, in a database用于在数据库中存储“二进制”值(例如男性/女性)的模式
【发布时间】:2011-02-13 01:38:12
【问题描述】:

简介

我正在尝试决定如何最好地为 (Rails) 模型设置我的数据库架构。我有一个与金钱相关的模型,它表明价值是收入(正现金价值)还是费用(负现金价值)。

我想要单独的列来表明它是收入还是支出,而不是依赖于存储的值是正值还是负值。


问题:

您将如何存储这些值,为什么?

  • 只有一个列,比如Income, 并存储1,如果是收入,0 如果是费用,null 如果不是 已知。
  • 有两列,Income 和 Expense,将它们的值设置为 1 或 0 为 合适的。
  • 还有别的吗?

我认为这个问题类似于将一个人的性别存储在数据库中(忽略外星人/跨性别/等),因此我的标题。


到目前为止我的想法

  • 使用单列查找可能更容易,但存在将0(false,费用)误认为null(未知)的风险。
  • 单独的列可能更难维护(如果我们最终在两列中都有 1 会发生什么?

也许我走的路没什么大不了的,但是在我走得太远并且不得不更改我的代码库之前提出任何疑虑/想法会很棒,因为我错过了应该有的东西很明显!

谢谢, 菲利普

【问题讨论】:

  • 您甚至还没有开发表格,并且您已经期望它们被错误的数据填充(0 表示空值,1 表示收入和费用列)?您希望如何在这样的环境中拥有一个可以工作的系统?
  • 对于“未知”交易类型,您到底会怎么做?
  • @Jeffrey - 我当然希望这两种情况都没有真正发生,我只是想考虑这两种模式可能的优点/缺点。
  • @kurosch - 我不打算实际保留未知交易。相反,我在考虑如果交易还没有被分配为收入/费用,而不是仅仅默认为一个或另一个,价值会是什么。
  • @latentflip - 大多数关系数据库系统都有很好的设施来维护数据完整性。不要希望坏数据不会出现,只需验证数据始终是好的。使用存储过程作为看门人(并拒绝对表本身的更新权限),使用检查约束、外键等。始终尽可能明确地说明数据值的含义。除非有很好的理由,否则使列不可为空。然后让它们无论如何都不可为空。 :)

标签: ruby-on-rails database-design schema


【解决方案1】:

有时我会使用角色。例如,我的数据库中有一个列gender,其中存储了m 或f。

而且我通常选择只有一列。

【讨论】:

    【解决方案2】:

    我通常会将标志实现为 nchar(1) 并使用一些有意义的缩写。我认为这是最容易处理的事情。例如,您可以使用“I”表示收入,使用“E”表示费用。

    也就是说,我认为这不是实现这个系统的好方法。

    我可能会将收入和支出放在不同的表格中,因为它们看起来是不同类型的东西。一旦通过标志而不是正值和负值来区分含义,我能想到将它们放在同一个表中的唯一优势就消失了。

    【讨论】:

      【解决方案3】:

      您将如何存储这些值,为什么?

      我会将它们存储为单个列。尽管您希望将数据分成多个列,但任何了解会计或簿记的人都会知道,交易的美元价值是一回事,而不是基于收入或支出(或资产、负债、权益等)的两个独立的东西第四次)。

      作为一个真正编写过完全平衡的复式记帐应用程序和不太正式的预算应用程序的人,我建议您重新考虑您的决定。这将使这项工作的未来工作变得更加容易。

      很抱歉,这可能不是您想听到的,并且很可能会导致对我产生负面影响,但老实说,我不能不告诉您这将是什么错误就放手。

      您的“到目前为止的想法”表明问题已经出现。

      1/“拥有单独的列可能更难维护(如果我们最终在两列中都为 1 会发生什么?” - 好吧,这不应该发生。数据应该与数据模型在内部保持一致. 最好建议您使用插入/更新触发器来阻止它,或者说,一个不允许它发生的列:-)

      2/“使用单列查找可能更容易,但存在将 0(错误,费用)误认为 null(未知)的风险。” - 如果符号与值的大小一起存储,则不会出错。不知道一个项目是费用还是收入的整个想法对会计师来说是可恶的。该知识在创建交易时就存在,直到交易发生后的某个时刻才模糊不清。

      【讨论】:

      • 为了确保我理解,您是在建议不要有任何额外的收入/费用列,而只是使用现金价值是正数还是负数来决定?不要道歉,有经验支持的建议正是我想要的。
      • 是的,我建议这样做。为收入/支出项目(以及复式记账系统中的资产/负债/股权,尽管外行人难以理解的非直觉迹象)拥有一个签名值将使您的生活更轻松。我不确定您是否有正当理由希望他们分开而我没有看到(尽管我自己从未找到过)因此提前道歉。
      • 你现在说的很有意义。我通常处理预计的未来交易,而不是实际的真实交易,但无论如何,我认为听从您的建议会让生活变得更轻松。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2015-02-23
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      相关资源
      最近更新 更多