与 Should I delete or disable a row in a relational database? 略有相关
鉴于我将采用在历史表中存储对表的更改的策略,我面临以下选项来实现 MySQL 中给定行的状态:
isActive
booelanactiveStatus
枚举- 引用小型
ActiveStatus
查找表的activeStatus
INT activeStatus
INT 未引用另一个表
在我看来,第一种方法相当不灵活,因为将来我可能需要更多的 bool 值来支持其他类型的事件状态(我不确定它们会是什么,但可能是“正在逐步淘汰”或“对随机一组用户有效”等)。
有人告诉我 MySQL 枚举很糟糕,所以第二种方法可能行不通。
我喜欢第三种方法,但我想知道这是否是一个针对相对较小问题的严厉解决方案。
第四种方法要求我们提前知道每个状态 INT 的含义,这似乎是一种过时的做事方式。
有规范的正确答案吗?我是否忽略了另一种方法?
最佳答案
我个人会选择你的第三种选择。
正如您所建议的, bool 值在现实中通常会更加复杂。 ENUM 可能很好,但它们有一个缺点,即一旦您想要存储有关每个值的附加信息 - 谁添加了它,何时添加的,它是否仅在特定时间段或源系统、注释等内有效 - 它就变得很困难,而使用查找表可以轻松地在附加列中维护这些数据。 ENUM 是将数据限制为某些值(如 CHECK
约束)的好工具,但如果这些值具有重要含义并且需要向用户公开,那么就不那么好工具了。
从您的问题中尚不完全清楚您是否计划将历史记录表视为事实表并在报告中使用它,但如果是这样,那么您可以将 ActiveStatus
查找表视为维度。在这种情况下,表要容易得多,因为您的报告工具可以从维度表中读取可能的值,以便让用户选择他的查询条件;此类工具通常对 ENUM 一无所知。
关于database - isActive 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14473821/