优化 table 结构
Optimize table structure
拥有 200 万用户。每个用户可以订阅 3 项服务。在这种情况下想知道哪种结构会更好。
- 在 table 中为一个用户存储一行,并且每个用户都有更多字段
服务
- 为每个服务存储三行,在这种情况下字段更少,但数据更多
您应该使用 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
拥有 200 万用户。每个用户可以订阅 3 项服务。在这种情况下想知道哪种结构会更好。
- 在 table 中为一个用户存储一行,并且每个用户都有更多字段 服务
- 为每个服务存储三行,在这种情况下字段更少,但数据更多
您应该使用 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