对于数据量较大的系统,数据库应该如何设计
设计一个监控系统,连接有多台终端,每台终端几秒钟更新一条数据,用户比较关心最新的数据(一天内的),但是他们也会经常查询历史数据,怎么设计数据库,可以使软件界面对最新数据的刷卡比较快,对历史数据的查询响应也比较快?
------解决方案--------------------#1.当天数据用一张表存储,历史数据用一张表存储(可以考虑表分区)
#2.当天数据表根据查询设计合适的索引;历史数据根据查询设计合适的索引。
#3.系统空闲时,把数据归档。楼主能再说下数据量大概有多少,每日增多少,及其它要求吗?
------解决方案--------------------归档的话按你的方法可以了,记得移入之后要把原数据清空(不是在历史表),而且你的代码里面可能需要考虑是否要引用历史表,如果是2005以上,可以考虑使用分区表功能,不过这个有利有弊,并不是完全没有坏处的,要多测试
------解决方案--------------------
如果仅仅是这些情况
感觉单表就可以解决了,不需要多表或者其他操作
以“日期”或者“时间”作为聚集索引即可
------解决方案--------------------1. 软件界面对最新数据的刷卡比较快
想最快,那就得考虑使用缓存.
2. 对历史数据的查询响应也比较快
对where和关联查询的字段进行索引,可以提高查询速度
------解决方案--------------------#1.触发器,个人认为不好,相当于同时两份数据,而且属于同一事务,历史表INSERT有问题时,会导致整个INSERT操作失败。
#2.分区表,也不建议。它的优点:按分区存储数据,可以把数据放在不同的文件组(文件组可放在不同的磁盘)来提高效率;且当按分区段查询时,只查询表中的某个分区,效率高。缺点:需要想办法定时增长分区;SQL没按分区段查询时,效率可能会更低
#3.数据量不大的话,且逻辑不复杂的情况下,建议自定义JOB,注意点:
归档时,用DELETE from 源表 output into 历史表 这种方式写,保证是一个事务,不会丢数据; 加上TOP(N)条件,一次删除N条,停1秒,再删除,保证不会影响其它SQL;WHERE 主键 < 100 and 日期 < getdate() 这种方式,就是说,你确定下主键的大概值,再用日期过滤,走的是聚集索引,加上TOP(N),删除的比较快
------解决方案--------------------1、最新的刷卡数据保存到内存数据库中
2、定期将内存数据库中的数据迁移到关系数据库中,历史数据可以按时间或者按终端等分表存储