我想知道什么是动态归档行的最佳解决方案。例如,当用户将任务标记为已完成时,该任务需要归档但仍可访问。动态归档行
实现此目的的最佳实践是什么?我是否应该将它全部留在同一张表中,并且不要完成查询中的完成任务?恐怕随着时间的推移桌子会变得很大(一年或更少的时候有1,000,000行)。或者我应该创建另一个表,即task_archive
并在需要数据时查询该行?
我知道类似的问题之前已经被问过,但其中大部分关于同时存档数千行的问题,我只需要知道一旦标记了一行,最好的方法(以及为什么)完成
我想知道什么是动态归档行的最佳解决方案。例如,当用户将任务标记为已完成时,该任务需要归档但仍可访问。动态归档行
实现此目的的最佳实践是什么?我是否应该将它全部留在同一张表中,并且不要完成查询中的完成任务?恐怕随着时间的推移桌子会变得很大(一年或更少的时候有1,000,000行)。或者我应该创建另一个表,即task_archive
并在需要数据时查询该行?
我知道类似的问题之前已经被问过,但其中大部分关于同时存档数千行的问题,我只需要知道一旦标记了一行,最好的方法(以及为什么)完成
为了提高速度和易用性,我通常会将该行保留在同一个表中(并将其标记为已完成),然后再将其移至归档表中。这样用户就不会在现场做出这种动作的延迟;此举可能会在非繁忙时段作为批处理进行。
何时该发生取决于您的应用程序。例如,如果他们有一个显示“最近完成的任务”的仪表板小部件,该小部件小部件显示过去一周内完成的所有任务(并允许他们深入查看详细信息),那么将行移动到存档一周后,他们已经完成。或者如果他们经常需要查看本学期的任务(针对学术应用),但很少针对之前的学期,请在本学期结束时进行批量移动。
如果表索引1,000,000行应该不是那么大的交易,诚实。
您可以使用触发器捕获订单已标记为已完成,从当前表中删除并插入到归档表中。
或者,您可以创建一个执行存档的存储过程。例如
sp_markcompleted(taskid)
开始事务;
insert into newtable select * from oldtable where id = taskid;
从oldtable中删除其中id = taskid;
commit;
岂不东西在这个意义上,如果用户查看所有已完成的任务从一个日期范围内(按创建日期排序)我会使用'UNION ALL'这也将影响到查询表的复杂化性能? – Serge 2010-06-02 17:02:23
是的。目标是在用户可能想要进行这样的查询之后的某个时间将内容移动到存档;也许这对你的应用程序来说是5年。这个想法是,经常进行的查询类型由常规任务表提供,而针对存档的查询应该很少。甚至可能是“档案”存在于一个单独的系统中,例如数据仓库。 – 2010-06-02 18:22:41
我明白你的意思,非常有道理。为了统计目的,我仍然需要查询存档表,但是如果我认为长期的话,那么这些查询应该像您所说的那样很少见。谢谢! – Serge 2010-06-02 19:30:19