数据库 不同季度的数据库模型

liwen_zhang · 2012年09月12日 · 最后由 jamst 回复于 2013年04月25日 · 3504 次阅读

现在遇到的业务如下:只操作当前季度的所有单据,历史季度的单据不做操作,如果有需要才能看到历史季度的单据。 方案如下:如果把不同季度的单据都放在同一张表,那每次检索都需要检索所有单据(历史季度的,当前季度的),而通常只需要检索当前季度,历史季度的单据是在特殊情况下才需要的,因此这个方案排除; 还有一个方案就是:不同季度用不同的数据库。意思是如果有多个季度,那就用多个数据库,需要用到哪个季度,在切换到哪个数据。这样出现的问题是不能共存; 首先我非常感谢 frogley 给我一个很好的思路。我根据他的想法延伸了一下,有了第三个方案:同一个单据有两张表分别是当前季度的和历史季度的,在存储的过程中只存进当前季度的,历史季度布改变,当到新季度需要清空当前季度前,将当前季度的信息批量添加到历史季度中。 除了这三个方案,大家还有什么想法没有?我听听你们的想法。

思路 1:

每个季度会产生多少单据?如果数据量不大,放一张表完全没有问题吧。检索的时候加个索引就可以。

思路 2:

每个季度一张表,表名为: invoice_2012a, invoice_2012b, invoice_2012c, invoice_2012d,abcd分别代表4个季度。2013年的表名,依次类推。

要保存一张单据,只要按单据创建日期找到所在的表,然后保存即可。 

我所在的 Company 有 3 个库,当前,历史和归档。历史库的数据会在一段时间后手动归档进入归档库。其它同方案三

#1 楼 @daqing (^__^) 嘻嘻,谢谢 daqing 思路 1:单据的数据量还是蛮大的,这是一间加工厂,单据分成三类:加工单,交接单,任务单;我们预计这个 ERP 能使用四五年,一年两季度,这样几年下来的单据量就挺客观的,所以还是不能放一张表。 思路 2:在设计数据库的时候,如果每过一个季度就更改一次数据库结构,那会引发很多问题。如果耦合度比较紧密的程序,代码肯定要改的;要到企业更新代码,甚至小部署一次,虽然更新代码可以用 capistrano 等类似的完成,但不可避免的会出现意外情况……而且知道会季度的问题的话,本身这样的设计就不算合理了。

#2 楼 @DavidWei 谢啦 o(∩_∩)o 哈哈,你的方案又将我心中的想法进一步完善了。 有个小问题哦,历史库的数据归档之后,历史库的数据会不会被清空?历史和归档的数据不会有交集?

很典型的在线交易和数据仓库案件,建议去读数据仓库方面的文章或书,怎么样建立实时表和仓库,怎么样批量处理,有什么需要注意的问题。不要重新发明车轮

#5 楼 @knwang 好的,谢谢你,我明白我要做什么了。

如果数据量不是特别大、并且查询比较固定(比如总是使用时间字段),按时间分区即可,代码层面不用做改动,这种方式最简单

如果分区以后单区数据依然太大,或查询条件无法满足分区要求,则需要分表。照 lz 的描述,定期归档历史数据、清理当前表中的过期数据,保持当前表数据量不会无限制增长,即可解决问题

#9 楼 @suupic 嗯。数据量的评估是需要进行。总体设计应该就是这样使用第三种方案了。具体还需要根据其他的因素做调整,比如这两天获取的一个新需求:季度的划分不清晰,有可能确定季度之后会做调整

#8 楼 @bhuztez 呵呵,非常感谢你,又给我提供了更多的学习资料,我现在还是学生,没有大牛带着我们设计,也没办法吸取前人的经验,只有自己摸索 + 网上学习。

如果你用的是 oracle 数据库的话,针对大数据量你可以按季度归档。把历史数据放在不常用的表分区中。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号