【问题标题】:Integer values for status fields状态字段的整数值
【发布时间】:2013-12-27 21:52:40
【问题描述】:

我经常发现自己为数据库表创建“状态”字段。我将这些设置为 TINYINT(1),因为我通常只需要少数状态值。我在代码中将这些值交叉引用到数组查找中,示例如下:

0 - Pending
1 - Active
2 - Denied
3 - On Hold

这一切都很好,除了我现在正在尝试创建更好的数据库结构并意识到从数据库的角度来看,这些整数值实际上没有任何意义。

现在解决此问题的方法可能是为状态创建单独的表 - 但数据库中可能有多个状态列,并且为每个状态列设置单独的表似乎有点矫枉过正? (我希望每个状态都从零开始 - 所以为所有状态创建一个状态表对我来说并不理想)。

另一种选择是使用 ENUM 数据类型 - 但对此有不同的看法。我看到很多人不建议使用 ENUM 字段。

那该怎么走呢?我绝对需要将这些数据放入自己的表中吗?

【问题讨论】:

  • 不,你没有。不要将数据(存储在数据库中)与信息(具有应用意义的数据)混淆。
  • 在我看来,1 个由 4-5 列组成的表是唯一性的标识,从 0 开始的顺序为每个“字段”递增 1,然后是活动日期和非活动日期来控制何时显示字段集中的值。当您需要值时,您可以从 fieldname ='NameofYouField' 的状态中选择,以便将其全部保存在一个地方。一个额外的字段来指示它是否可维护(这意味着它有特殊的逻辑驱动值,因此更改 ID、字段或值会破坏系统。
  • Java: Enum vs. Int 的可能重复项
  • int 常量有缺陷;请参阅this answer 了解原因。
  • 您可以从 1000000 开始表格,而不仅仅是 0,它默认为 0,但您可以随意使用它!

标签: mysql sql database-design


【解决方案1】:

我认为最好的方法是为每种状态设置一个状态表。例如,order_status ("placed", "paid", "processing", "completed") 与 contact_status ("received", "replied", "resolved") 本质上是不同的,但后者可能只适用以及客户联系人和供应商联系人。

这可能已经是您正在做的事情了——只是您的“表”是内存数组而不是数据库表。

【讨论】:

    【解决方案2】:

    我真的同意“ruakh”创建另一个结构为idstatusName 的表,这很棒。但是,我想补充一点,对于这样的表,您仍然可以将 tinyint(1) 用于 id 字段。因为tinyint 接受来自0 to 127 的值,这将涵盖您可能需要的所有状态情况。

    【讨论】:

      【解决方案3】:

      您能否在不更改代码的情况下添加(或删除)状态值?

      • 如果是,则为每个状态“类型”考虑单独的查找表。您已经在代码中以 generic 方式处理这些数据,因此您应该有一个 generic 数据结构。
      • 我不,然后保留 ENUM(或有据可查的整数)。您正在以一种特殊的方式处理每个值,因此尝试概括数据模型并没有太大意义。

      (我希望每个状态都从零开始 - 所以为所有状态创建一个状态表对我来说并不理想

      您不应该在同一个查找表中混合几组不同的值(无论您的“零问题”如何)。原因:

      • 仅靠一个简单的 FOREIGN KEY 将无法防止引用错误集合中的值。
      • 所有值都被强制为同一类型,这可能并不总是可取的。

      这是一种常见的反模式,它甚至有一个名字:“一个真正的查找表”。

      相反,将每个查找“类型”保存在单独的表中。这样一来,FK 就可以按预期工作,并且您可以根据需要调整数据类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-07
        • 1970-01-01
        相关资源
        最近更新 更多