在数据库中存储多个标志的最佳方式

时间:2008-10-16 00:07:40

标签: database-design

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

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

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

提前致谢!

5 个答案:

答案 0 :(得分:21)

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

create table notifications (
   user_id int,
   notification_type int
);

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

添加新通知变得微不足道(删除也是如此)。只需添加(删除)新类型值,让用户选择是否接受。如果您希望将通知类型保留在表中以通过可行的应用程序进行管理,但它会更复杂一些。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

使用MySQL?

然后,SET数据类型就是答案。

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

答案 3 :(得分:1)

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

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

这是权衡。如果你想要一些非常容易实现的东西,并且快速考虑位字段。如果你想要的东西更容易扩展和维护,代价是稍微复杂一点,那么一定要去单独的表。如果投票告诉你任何你可能想要遵循单独的表实现。

答案 4 :(得分:0)

我希望让DB使用Bool列管理它会更好。我似乎记得有些系统会将bool打包到位(null可能会搞砸了)。为避免混乱,您可以将其作为单独的表格。

(我不是DBA)

编辑:低头“我只是建议你到底是什么”:b