database - isActive 的替代方案

标签 database database-design data-warehouse

Should I delete or disable a row in a relational database? 略有相关

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

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

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

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

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

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

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

最佳答案

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

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

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

关于database - isActive 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14473821/

相关文章:

mysql - 子查询通过更新返回多于 1 行

android - 在不同的 Activity 中通过 Android 应用程序使用 mysql lite 和 Web 服务或其他请求

php - Facebook-Timeline 系统应该如何查看数据库?

sql-server - 在不使用链接表的情况下,可以将多个事实表连接到相同的维度表吗?

hadoop - 如何在Google Cloud Dataproc中衡量高可用性

sql - WITH 子句和临时表有什么区别?

android - iOS 和 Android 使用哪个数据库

python - 如何将 Django 开发者服务器连接到 MySQL 数据库?

Mysql根据多案例取记录

database - BCNF 和非平凡的函数依赖