在我的一个网站上,我有一个主用户表,其中包含每个用户唯一的用户ID,电子邮件地址,密码等。
我需要开始跟踪与每个用户相关的大量二进制标记,例如他们是否已确认他们的电子邮件,他们是否已发布消息,他们是否已升级其帐户,是否已完成X ,无论他们是否做过Y等。
这些标志中的每一个都是简单的“0”(假)或“1”(真),并且基于这些标志,我的网站显示用户或做不同的事情。
我的问题是,将这些二进制标志添加到主Users表或为二进制标志或其他东西创建单独的表更有意义吗?
请尝试解释您的推理(以及您的方法的优势),以便我了解您的来源。
答案 0 :(得分:3)
是否需要存储所有这些标志,或者可以计算?例如,如果用户没有发布任何消息,可以通过查询MESSAGE表轻松确定。
物理存储“可计算”标志是多余的,并且可能导致数据不一致。例如,如果用户添加了消息,但应用程序中的错误会阻止标志更新?出于性能原因,这种“非规范化”可能是合理的,但只有在测量在实际数据量和代表性工作负载上的性能之后才做出此决定。
OTOH,一些标志可能是“真实的”(例如用户是否已确认电子邮件)。如果这些标志是相对静态的(即您在设计数据模型时事先知道它们),则将它们直接存储为USER表本身中的简单布尔(或等效)字段。仅当您需要具有相当大的运行时灵活性时,请考虑使用与USER表具有N:1关系的单独FLAG表。这是一种EAV。
答案 1 :(得分:0)
你有把它们放在一起的好处和分离它们的优点:如果你把标志放在Users
表中,用一个简单的查询用户ID就可以得到关于那个用户的所有信息,而不是使用联接以检索它们。
另一方面,将它们放在一个单独的表上会使它们与Users
表上的数据“逻辑”分离,这可能完全不相关(即使他们同时谈论用户),因此具有更清晰的数据库结构。
要考虑的另一件事是你必须经常更改和检索这些数据:例如,如果你只是在登录时需要它们,那么你可能希望将它们保存在同一个表中并获取所有登录数据立刻;相反,如果你必须反复更改它们,那么你的选择应该放在另一张桌子上。
那就是说,无论如何我会选择两个表解决方案,但这就是我喜欢在数据库架构中看到它们的方式。