【问题标题】:Alternatives to isActiveisActive 的替代品
【发布时间】:2013-01-23 06:37:00
【问题描述】:

Should I delete or disable a row in a relational database?关系不大

鉴于我将采用在历史表中对我的表进行仓库更改的策略,我面临以下选项来为 MySQL 中的给定行实现状态:

  • 一个isActivebooelan
  • activeStatus 枚举
  • 一个activeStatus INT 引用一个小的ActiveStatus 查找表
  • activeStatus INT 未引用另一个表

在我看来,第一种方法相当不灵活,因为将来我可能需要更多布尔值来支持其他类型的活动状态(我不确定它们会是什么,但可能类似于“被逐步淘汰”或“对随机的一组用户有效”等)。

听说 MySQL 枚举不好,所以第二种方法可能行不通。

我喜欢第三种方法,但我想知道它对于一个相对较小的问题是否是一个严厉的解决方案。

第四种方法要求我们提前知道每个状态 INT 的含义,并且似乎是一种过时的做事方式。

有规范的正确答案吗?我是否忽略了另一种方法?

【问题讨论】:

    标签: database database-design data-warehouse


    【解决方案1】:

    我个人会选择你的第三个选项。

    正如您所建议的,布尔值在现实中通常会变得更复杂。 ENUM 可能很好,但它们有一个缺点,即一旦您想要存储有关每个值的附加信息 - 谁添加了它,何时添加它,它是否仅在特定时间段或源系统、cmets 等内有效 - 它变得很困难,而使用查找表,这些数据可以很容易地保存在其他列中。 ENUM 是将数据限制为特定值的好工具(例如 CHECK 约束),但如果这些值具有重要意义并且需要向用户公开,则不是这样的好工具。

    如果您打算将历史记录表视为事实表并在报告中使用它,您的问题并不完全清楚,但如果是这样,那么您可以将ActiveStatus 查找表视为一个维度。在这种情况下,表格要容易得多,因为您的报告工具可以从维度表中读取可能的值,以便让用户选择他的查询条件;此类工具通常对 ENUM 一无所知。

    【讨论】:

      【解决方案2】:

      从我的角度来看,如果您的状态超过 2 个,您的第二种方法会更好。因为ENUM 非常适合您知道将属于静态集合的数据。但是如果你只有两个状态活动和非活动,那么使用布尔值总是更好。

      编辑: 如果您确定将来您不会更改 ENUM 的值,那么将 ENUM 用于此类字段非常好。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2012-01-25
      • 2015-08-05
      • 2011-01-01
      • 2011-10-24
      • 2011-05-31
      相关资源
      最近更新 更多