isActive的替代品

时间:2013-01-23 06:37:01

标签: database database-design data-warehouse

Should I delete or disable a row in a relational database?

的边缘相关

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

  • isActive booelan
  • activeStatus enum
  • activeStatus INT引用小ActiveStatus查找表
  • activeStatus INT未引用另一个表

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

我被告知MySQL枚举很糟糕,所以第二种方法可能不会飞。

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

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

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

2 个答案:

答案 0 :(得分:2)

就我个人而言,我会选择第三种选择。

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

如果您计划将历史记录表视为事实表并在报告中使用它,那么您的问题并不完全清楚,但如果是这样,那么您可以将ActiveStatus查找表视为维度。在这种情况下,表格更容易,因为您的报表工具可以从维度表中读取可能的值,以便让用户选择他的查询条件;这些工具通常对ENUM没有任何了解。

答案 1 :(得分:1)

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

编辑: 如果您将来确定不会改变ENUM的价值,那么将ENUM用于此类领域是非常棒的。