Database design 此选项列表是否接受数据库中的布尔标志?
我正在将用户提交的评论添加到个人项目中 注释有许多用于特殊目的的标志。注释的版本也是为了调节,所以特定字段上不需要时间戳 这些是迄今为止我在功能设计中的选项。(列表不是最终的)这个列表在某个时候会改变,因为我知道我还没有弄清楚所有的事情Database design 此选项列表是否接受数据库中的布尔标志?,database-design,Database Design,我正在将用户提交的评论添加到个人项目中 注释有许多用于特殊目的的标志。注释的版本也是为了调节,所以特定字段上不需要时间戳 这些是迄今为止我在功能设计中的选项。(列表不是最终的)这个列表在某个时候会改变,因为我知道我还没有弄清楚所有的事情 包装(文本隐藏在javascript链接后面) 隐藏(对非版主隐藏评论文本) 已锁定(无法编辑) 删除(删除评论) 主持人(隐藏海报名称) 管理员(与版主相同,版主不能编辑) HellBanked(除海报外,删除法案) 有一些规则管理哪些标志可以同时存在。(
- 包装(文本隐藏在javascript链接后面)
- 隐藏(对非版主隐藏评论文本)
- 已锁定(无法编辑)
- 删除(删除评论)
- 主持人(隐藏海报名称)
- 管理员(与版主相同,版主不能编辑)
- HellBanked(除海报外,删除法案)
- 管理员/版主的评论不应被包装、隐藏、锁定或禁止。(版主不能被禁止)
- 评论不能同时是管理员和版主评论
- 我不应该删除李>
- 注释不能同时包含包装和隐藏
- 隐藏的注释应该被锁定
布尔标志是否足以在数据库中实现这一点?(我将RubyonRails与SQLite/MySQL一起使用,这样数据库就不会有触发器/约束)您可以将它们实现为布尔标志列,或者使用一个int列作为位掩码。有些人可能会认为(从技术上讲,他们是正确的)数据库中的位掩码违反了规范化(在一列中存储了多个“值”),但我发现它们在过去很有用。唯一的问题是它会降低代码的可读性
不过,最后我想说的是,你的方法没有错。对于规则,你似乎有两个选择:
无论如何,你需要做一些#2,除非你计划在DB中提出异常并在客户端处理它们(这对我来说很糟糕…),但我想我会犹豫做#1,除非你涵盖了所有案例,因为如果你不这样做的话,你会在那里强制一些,而在那里不强制一些,这对我来说也很难闻……布尔标志的问题是:它们只有两种状态 很多事情都有多个条件,而一个简单的布尔值就不够了 有些东西实际上可能是布尔型的。然而,这是罕见的 我建议不要使用布尔值,而是使用某种枚举值
- 包装(文本隐藏在javascript链接后面)。看起来像布尔值:有链接或没有链接。不幸的是,您可能有不同类型的链接(内部、外部等),因此这可能会超出两个值
- 隐藏(对非版主隐藏评论文本)。看起来像布尔值——隐藏或不隐藏。当然,除此之外,非主持人的定义可能会扩大,然后这就变得更复杂了
- 已锁定(无法编辑)。看起来是布尔型的、锁定的或打开的。但您可能已从一类用户锁定,但未从另一类用户锁定。布尔型分解
- 删除(删除评论)。布尔值,直到您添加挂起的删除,或需要另一个删除投票
- 版主(隐藏海报的名称)。布尔型,直到您有其他类别的用户、超级用户、特权更高的用户和特权更低的用户
- HellBanked(除海报外,删除法案)。这似乎是评论作者的特点,而不是评论本身。这甚至不属于这里,而是属于模型中的其他地方
我投票支持枚举值,而不是简单的True/False。考虑到在为视图选择行时需要忽略已删除和已禁用的注释,我必须将它们设置为布尔值。否,SQL具有可使用的按位运算符(and、OR等)。例如,如果第一位是“已删除”,则所有未删除的邮件都将是select*from messages,其中(标志和1)=0 POST updated,忘记了管理员注释,我正在使用SQLite进行开发,因此无法执行触发器。@epochwolf:您的更改很好地强调了我的观点。谢谢你发这个帖子。