【问题标题】:Best Way To Store Multiple Flags In Database在数据库中存储多个标志的最佳方法
【发布时间】:2008-10-16 10:06:43
【问题描述】:

我有一个基于 Web 的应用程序,它通过电子邮件通知用户网站上的活动。用户可以选择他们想要接收的通知类型。到目前为止,大约有 10 种不同的选项(每一种都是真/假)。

我目前将它作为 0 或 1 以逗号分隔的形式存储在一个 varchar 字段中。例如: 1,0,0,0,1,1,1,1,0,0

这可行,但很难添加新的通知标志并跟踪哪个标志属于哪个通知。这样做有公认的标准吗?我正在考虑为每种通知类型添加另一个包含一列的表。然后我可以根据需要添加新列,但我不确定这有多有效。

提前致谢!

【问题讨论】:

    标签: database-design


    【解决方案1】:

    我会使用两张桌子。一个表将存储用户数据,另一个表将存储他们订阅的通知。第二个表看起来像这样:

    create table notifications (
       user_id int,
       notification_type int
    );
    

    我会在 user_id 和用户表中的用户 id 之间建立 FK 关系,并在删除时使用级联。使用 user_id 和 notification_type 作为主键。要检查用户是否需要特定通知,只需在两个表之间进行连接,然后选择 notification_type 与所讨论的匹配的行。如果结果集非空,则用户需要通知。

    添加新通知变得微不足道(删除也是如此)。只需添加(删除)一个新的类型值,让用户选择接受或不接受。如果您想将通知类型保存在表格中,以便通过可以工作的应用程序进行管理,但这会稍微复杂一些。

    【讨论】:

    • 这似乎是迄今为止 IMO 最好的解决方案。将它们全部存储在一列中不是很可扩展。将它们作为布尔字段存储在表中意味着每次有新的通知类型时都必须添加一个新字段。
    • 这会很好,特别是如果您希望能够扫描通知类型。
    • 规范化对于可扩展性很有好处,但它确实会在性能上有所下降。
    • FK 关系应该在第二个表中的 user_id 上产生一个索引,使其成为一个索引连接,从而限制对性能的影响。
    • 灵活性第一。在不牺牲太多灵活性的情况下,在以后优化性能,并且仅在您知道必须这样做时。按照这个答案建议的方式去做。
    【解决方案2】:

    使用 MySQL?

    那么,SET 数据类型就是答案。

    “MySQL SET 数据类型在 MySQL 表中存储为整数值,占用 1 到 8 个字节,具体取决于可用元素的数量。” - http://dev.mysql.com/tech-resources/articles/mysql-set-datatype.html"

    【讨论】:

      【解决方案3】:

      我会使用 10 个不同的位或布尔字段。但是,如果您要在一个字段中执行此操作,则可以使用位图 0x1111111111 作为大整数或不带逗号的文本字段。我使用所有这些技术处理过不同的应用程序。但我实际上只是使用多个字段。在上面做选择语句会容易得多。

      【讨论】:

      • 只在现场使用的原因是什么?我已经看到 MediaWiki 这样做了。
      【解决方案4】:

      如果您确实决定使用像@stephenbayer 提到的位字段,您可以随时在桌子上使用视图,以使开发人员更容易使用。这意味着您仍然可以节省位字段的空间,并且可以轻松使用每个字段的单独列,同时避免解析列。

      如前所述,如果您希望解决方案更具可扩展性,那么单独的表格是一个很好的选择。唯一的缺点是稍微增加了复杂性。

      这是权衡。如果您想要一些非常容易实现且速度很快的东西,请考虑位域。如果你想要一些更容易扩展和维护的东西,代价是稍微复杂一些,那么一定要选择单独的表。如果投票告诉您任何事情,您可能想要遵循单独的表格实现。

      【讨论】:

        【解决方案5】:

        我希望让数据库使用 Bool 列来管理它会更好。我似乎记得有些系统会将布尔值打包成比特(null 可能会搞砸)。为避免混乱,您可以将其设为单独的表格。

        (我不是 DBA)

        编辑:拍脑袋“我只是建议你到底是什么”:b

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-21
          • 1970-01-01
          • 2016-10-20
          • 2016-04-14
          • 1970-01-01
          • 2011-06-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多