优化 table 结构

Optimize table structure

拥有 200 万用户。每个用户可以订阅 3 项服务。在这种情况下想知道哪种结构会更好。

  1. 在 table 中为一个用户存储一行,并且每个用户都有更多字段 服务
  2. 为每个服务存储三行,在这种情况下字段更少,但数据更多

您应该使用 2 个表。一个用于用户,一个用于服务,在服务中有一列引用用户 ID。

table 结构取决于您将要执行的查询类型,即您将如何 select 数据,是否需要索引 select。如果您预计每个邮件列表将至少有 10% 的用户订阅,那么您可能不会从索引中获得很大收益,并且您可以只创建一个整数列,此时每个邮件列表将有一个自己的位 (2^N ), 例如

SELECT * FROM Subscriptions WHERE (MailingListFlags AND 8) <> 0;

根据您需要的位,用 2 或 1 代替 4,其中 1 = 第一位,2 = 第二位,4 = 第三位,8 = 第四位,依此类推

这种逻辑与运算将不允许您有效地使用索引。但是,如果您希望 select 一个接一个地发送邮件列表,您可能只有在结果数量较少时才能从索引中获益,例如少于用户总数的 10%。然后为每个邮件列表创建布尔列。但是这种结构不会很灵活。如果您需要创建新的邮件列表,则需要添加新的列。一种更灵活的方法是为每个用户(其他用户数据,如姓名和电子邮件将存储在不同的 table 中)和每个邮件列表表示一个整数 ID。所以你将只有两个整数列,但用户 ID 列将不是唯一的,例如如果用户 1 订阅了列表 2 和 3,用户 2 订阅了列表 1、3 和 4,则 table 将看起来像

User | List
===========
   1 |    2
   1 |    3
   2 |    1
   2 |    3
   2 |    4