完全的范式化和完全的反范式化都是实验室才有的东西,实际应用中经常混用,使用部分范式化的schema,缓存表。
反范式化数据的方法:复制或者缓存,在不同的表中存储相同的特定列,可以使用触发器更新缓存值,使得实现这样的方案变得简单。
可以在user表和message表都存储account_type字段,但更新用户账户类型的操作代价就高了,需要同时更新两张表。这需要权衡,需要考虑更新的频率以及更新的时长,并和执行SELECT查询的频率进行比较。
缓存计数,如果需要显示每个用户发了多少消息,可以每次执行一个昂贵的子查询来计算,也可以在user表中建一个num_messages列,每当用户发新消息时更新这个值。
统计过去24小时内发送的消息数,每小时汇总表msg_per_hr存这个小时内发送消息数, 比如现在是2014-01-27 11:48:39 24小时内指的是从 2014-01-26 11:48:39到2014-01-27 11:48:39
先从msg_per_hr表中查 hr 在2014-01-26 12:00:00 到 2014-01-27 11:00:00之间的SUM(cnt) , 然后从message表中查2014-01-26 11:48:39到2014-01-26 12:00:00消息数
从message表中查2014-01-27 11:00:00之后的数据,三者相加
CREATE TABLE `msg_per_hr` ( `hr` datetime NOT NULL, `cnt` int(10) unsigned NOT NULL, PRIMARY KEY (`hr`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;