我以前曾参与维护过一个舆情监控系统,该系统天天源源不断地监控着互联网上的新闻,不断从网上下载新闻保存进入数据库。javascript
为了表述简单,我特地模拟了一张相似的表:html
CREATE TABLE NEWS( Id int PK, Title nvarchar(500) --新闻标题 Content text --新闻内容
CreateTime DateTime
)
随着时间的推移,数据库里的新闻变得愈来愈多,系统开始跑得愈来愈慢。随后,技术经理考虑到,舆情监控须要的仅仅是近期的数据,过期的数据,不过重要。因而,新建了一个表,该表以时间命名,字段同样:java
CREATE TABLE NEWS2009( Id int PK, Title nvarchar(500) --新闻标题 Content text --新闻内容
CreateTime DateTime
)
一、不断产生的新表git
照个人估计,这个数据库以后还会有数据库
News2010,News2011,News2012.......数据库设计
添加时须要选择表:post
因为数据要被拆分到不一样的表中,假如系统不似个人舆情监控系统同样,不断有不一样时间的数据录入,那么根据不一样的数据,选择不一样的数据添加就成了你的责任。网站
INSERT INTO NEWS2010 (2010年的数据)
特殊时间点:this
若是元旦到了,你还在享受着美满的假期,忽然客户打电话来,问系统为何不监控了,shit,2013.1.1你忘了建新表。致使大量数据漏掉了,你不免比老板痛扁一顿。spa
二、管理数据完整性
加入某一天,你运行:
SELECT * FROM NEWS2009 WHERE CreateTime NOT BETWEEN '2009-01-01' AND '2009-12-31'
结果竟然有返回,那么你又有麻烦了。为了不这种状况,你不得不对每一张新闻表添加约束,不在规定时间内的数据,不容许添加规定的表。
三、同步数据
忽然,产品经理要求将几条数据的CreateTime由进库时间,改成新闻网站的发布时间。例若有一点时是2010-01-02,但实际发布时间稍早是2009-12-31。
你满怀自信兴冲冲地敲入:
UPDATE NEWS2010 SET CreateTime = '2009-12-31' WHERE Id = 12345
运行时,忽然一想,这数据变成了一条无效数据,它应该存入NEWS2009这张表中。UPDATE无用了,你必须添加进NEWS2010而后再删除本条数据。
四、确保惟一性
分割出来的数据,其主键要在全部年份的表里都是惟一的,若是你要从NEWS2010表移一条数据到NEWS2009表,那么你得确保主键不会冲突。你不得不本身实现主键策略。
五、跨表查询
假如老板要每一年2月14号的数据报表。你不得不拼命地
SELECT * FROM NEWS2009 UNION SELECT * FROM NEWS2010 UNION SELECT * FROM NEWS2011 . . .
六、同步元数据
假如产品经理忽然要求全部新闻添加一个字段,那么你不得不ALTER多张表。
七、管理引用完整性
假如产品经理要求评论也一块儿抓取回来,NEWS表的NEWSID不行被Comments评论表引用,那么这个外键不得不被关键多张表。
基于以上种种分析,明显已经看出,这样的设计不是一个好的设计。
对于这种时间效应比较强,数据比较多的表,咱们应该博览群魔,分区表。
关于分区表的实现,以前已经写过http://www.cnblogs.com/kissdodog/p/3156758.html