我知道,之前有人问过这个问题的变体。但我的情况可能有点不同:-)
所以,我正在建立一个跟踪事件的网站。每个事件都有 id 和 value。它也由具有 id、年龄、性别、城市、国家和等级的用户执行。(如果重要,这些属性都是整数)
我需要能够快速获得两个查询的答案:
- 从具有特定个人资料的用户那里获取事件数量(例如,来自俄罗斯莫斯科的 18-25 岁的男性)
- 从具有特定配置文件的用户那里获取事件值的总和(也可能是平均值) -
此外,数据是由多个客户生成的,而这些客户又可以有多个 source_id。
访问模式:数据将主要由收集器进程写入,但在查询时(不经常通过 web ui),它必须快速响应。
我希望有很多数据,当然不止一个表或单个服务器可以处理。
我正在考虑每天将事件分组在不同的表中(即“events_20111011”)。此外,我想在表名前加上客户 ID 和源 ID,以便数据被隔离并且可以很容易地丢弃(清除旧数据)并且相对容易移动(将负载分配到其他机器)。这样,每个这样的表都会有有限的行数,比如 10M 的顶部。
所以,问题是:如何处理用户的属性?
选项 1,规范化:将它们存储在单独的表中并从事件表中引用。
- (pro) 不重复数据。
- (con) 连接,这很昂贵(或者我听说过)。
- (con) 这要求用户表和事件表在同一台服务器上
选项2,冗余:将用户属性存储在事件表中并对其进行索引。
- (亲)更容易的负载平衡(自包含的表可以移动)
- (专业版)更简单(更快?)的查询
- (con) 大量磁盘空间和内存用于重复用户属性和相应的索引