【问题标题】:Should "binary flags" for each user be placed in the main Users table or in its own "binary flags" table?每个用户的“二进制标志”应该放在主用户表中还是放在它自己的“二进制标志”表中?
【发布时间】:2012-12-14 14:25:24
【问题描述】:

在我的一个网站上,我有一个主用户表,其中包含每个用户的唯一用户 ID、电子邮件地址、密码等。

我需要开始跟踪很多与每个用户相关的二进制标志,比如他们是否确认了他们的电子邮件,他们是否发布了消息,他们是否升级了他们的帐户,他们是否做过 X ,是否做过Y等。

这些标志中的每一个都是简单的“0”(假)或“1”(真),根据这些标志,我的网站向用户展示或做不同的事情。

我的问题是,将这些二进制标志添加到主用户表或为二进制标志或其他东西创建一个单独的表是否更有意义?

请尝试解释您的推理(以及您的方法的优点),以便我了解您的来历。

【问题讨论】:

    标签: mysql database-design database-schema


    【解决方案1】:

    所有这些标志都需要存储还是可以计算?例如,如果用户没有发布任何消息,则可以通过查询 MESSAGE 表轻松确定。

    物理存储“可计算”标志是多余的,并可能导致数据不一致。例如,如果用户添加了一条消息但您的应用程序中的错误阻止了标志更新怎么办?出于性能原因,这种“非规范化”可能是合理的,但只有在您测量实际数据量和代表性工作负载的性能后才能做出此决定。

    OTOH,某些标志可能是“真实的”(例如,用户是否已确认电子邮件)。如果此类标志是相对静态的(即您在设计数据模型时提前知道它们),请将它们作为简单的布尔(或等效)字段直接存储在 USER 表本身中。

    仅当您需要具有相当大的运行时灵活性时,才考虑使用与 USER 表处于 N:1 关系的单独 FLAG 表。这是EAV的一种。

    【讨论】:

    • 感谢您的意见!因此,如果我的理解正确,相对“静态”的不经常更改的标志应该存储在用户表中,而经常更改的标志应该即时计算,对吗?另外,“运行时灵活性”是什么意思?
    • @Programmer 我的意思是:您在设计数据库模型时是否提前了解它们?如果,并且它们不能从数据库中已经存在的其他数据派生,则将它们存储为简单字段。如果,但可以派生,要么存储它们,要么不存储它们,这取决于您确定的是性能和数据完整性之间的正确平衡。如果 no,将它们作为行存储在单独的表中,以便在运行时根据需要轻松添加它们,而无需更改数据库结构(即添加新列) - 这就是我的意思“运行时灵活性”。
    • @Programmer 这与特定标志的 更改频率无关。
    【解决方案2】:

    将它们放在一起有优势,将它们分开也有优势:如果将标志放在Users 表中,通过对用户 ID 的简单查询,您可以获得有关该用户的所有信息,而不是使用连接检索它们。

    另一方面,将它们放在单独的表中会使它们与 Users 表中的数据“逻辑上”分开,这可能完全不相关(即使它们都谈论用户),因此更清晰的数据库结构。

    要考虑的另一件事是您必须多久更改和检索此类数据:例如,如果您只需要在登录时使用它们,那么您可能希望将它们保存在同一张表上并获取所有登录数据立刻;相反,如果您必须反复更改它们,那么您的选择应该在另一张桌子上进行。

    也就是说,无论如何我都会选择两个表的解决方案,但这正是我希望在 DB 架构中看到它们的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多