数据库中的布尔标志是否可以接受此选项列表?

时间:2009-04-17 14:06:53

标签: database-design

我正在努力将用户提交的评论添加到个人项目中。

评论有许多用于特殊目的的标志。注释也会因审核目的而进行版本控制,因此特定字段不需要时间戳。

这些是我到目前为止在功能设计中的选项。 (列表不是最终的)这个列表会在某些时候发生变化,因为我知道我还没弄明白。

  • Wrapped(文本隐藏在javascript链接后面)
  • 隐藏(评论文本对非版主隐藏)
  • 已锁定(无法编辑)
  • 已删除(已删除评论)
  • 主持人(隐藏海报的名称)
  • 管理员(与主持人不同,主持人无法编辑)
  • Hellbanned(除了海报外,法案被删除)

有一些规则可以管理哪些标志可以存在。 (就显示而言。)

  • 管理员/版主评论不应包装,隐藏,锁定或hellbanned。 (主持人不能成为hellbanned)
  • 评论不能同时是管理员和主持人评论。
  • Hellbanned不应该删除。
  • 评论不能同时包含和隐藏
  • 隐藏的评论应该被锁定。

布尔标志是否足以在数据库中实现这一点? (我正在使用带有SQLite / MySQL的Ruby on Rails,因此数据库不能有触发器/约束)

3 个答案:

答案 0 :(得分:4)

这是布尔标志的问题:它们只有两种状态。

许多事情都变成了多个条件,而一个简单的布尔结果证明是不合适的。

有些东西实际上可能是布尔值。然而,这种情况很少见。

我建议不使用布尔值,而是使用某种值的枚举。

  • Wrapped(文本隐藏在javascript链接后面)。看起来布尔:有一个链接或没有链接。遗憾的是,您可能有不同类型的链接(内部,外部等),因此这可能会超出两个值。

  • 隐藏(评论文本对非版主隐藏)。看起来布尔 - 隐藏或不隐藏。当然,除非主持人的定义可能会扩大,然后这会变得更加复杂。

  • 已锁定(无法编辑)。看起来布尔,锁定或打开。除非您可能已锁定某类用户但未锁定其他类别的用户。布尔值分解。

  • 已删除(已删除评论)。布尔值,直到您添加待删除,或需要另一个投票进行删除。

  • 主持人(隐藏海报的名称)。布尔值,直到您拥有其他类别的用户,超级用户,更多特权用户和权限较低的用户。

  • Hellbanned(除了海报外,法案被删除)。这似乎是评论作者的一个特征,而不是评论本身。这甚至不属于此处,但属于您模型中的其他位置。

我投票支持枚举值,而不是简单的True / False。

答案 1 :(得分:0)

您可以将它们实现为布尔标志列,或者使用充当位掩码的int列。有些人可能认为(并且他们在技术上是正确的)数据库中的位掩码违反了规范化(因为多个“值”存储在单个列中),但我发现它们在过去很有用。唯一的问题是它可以使代码的可读性降低。

但最后,我会说你的方法没有错。

答案 2 :(得分:0)

对于规则,似乎有两种选择:

  1. 您可以尝试设置约束和触发器,以强制执行数据库中无法获取任何错误数据
  2. 您可以通过功能的前置和后置条件确保您的应用代码(不一定是编码的前置和后置条件,但定义并遵守明确的条件),以确保它们不会引入错误数据。然后,您可以定期运行错误数据脚本,以提醒您违反规则的任何内容。
  3. 无论如何你都需要做一些#2,除非你打算在数据库中引发异常并处理它们的客户端(这对我来说闻起来很糟糕......)但我想我会犹豫不决做#1,除非你覆盖所有的情况,因为如果你不这样做,你会有一些强制执行,有些没有,这对我来说也很难闻......