Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 此选项列表是否接受数据库中的布尔标志?_Database Design - Fatal编程技术网

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:您的更改很好地强调了我的观点。谢谢你发这个帖子。