2

我应该删除或禁用关系数据库中的行吗?

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

  • 一个isActive布尔
  • 一个activeStatus枚举
  • activeStatus引用小型ActiveStatus查找表的INT
  • 不引用另一个表的activeStatusINT

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

有人告诉我 MySQL 枚举不好,所以第二种方法可能行不通。

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

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

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

4

2 回答 2

2

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

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

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

于 2013-01-23T14:39:40.673 回答
1

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

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

于 2013-01-23T07:16:52.847 回答