2010-06-02 40 views
1

我想知道什麼是動態歸檔行的最佳解決方案。例如,當用戶將任務標記爲已完成時,該任務需要歸檔但仍可訪問。動態歸檔行

實現此目的的最佳實踐是什麼?我是否應該將它全部留在同一張表中,並且不要完成查詢中的完成任務?恐怕隨着時間的推移桌子會變得很大(一年或更少的時候有1,000,000行)。或者我應該創建另一個表,即task_archive並在需要數據時查詢該行?

我知道類似的問題之前已經被問過,但其中大部分關於同時存檔數千行的問題,我只需要知道一旦標記了一行,最好的方法(以及爲什麼)完成

回答

3

爲了提高速度和易用性,我通常會將該行保留在同一個表中(並將其標記爲已完成),然後再將其移至歸檔表中。這樣用戶就不會在現場做出這種動作的延遲;此舉可能會在非繁忙時段作爲批處理進行。

何時該發生取決於您的應用程序。例如,如果他們有一個顯示「最近完成的任務」的儀表板小部件,該小部件小部件顯示過去一週內完成的所有任務(並允許他們深入查看詳細信息),那麼將行移動到存檔一週後,他們已經完成。或者如果他們經常需要查看本學期的任務(針對學術應用),但很少針對之前的學期,請在本學期結束時進行批量移動。

如果表索引1,000,000行應該不是那麼大的交易,誠實。

+0

豈不東西在這個意義上,如果用戶查看所有已完成的任務從一個日期範圍內(按創建日期排序)我會使用'UNION ALL'這也將影響到查詢表的複雜化性能? – Serge 2010-06-02 17:02:23

+0

是的。目標是在用戶可能想要進行這樣的查詢之後的某個時間將內容移動到存檔;也許這對你的應用程序來說是5年。這個想法是,經常進行的查詢類型由常規任務表提供,而針對存檔的查詢應該很少。甚至可能是「檔案」存在於一個單獨的系統中,例如數據倉庫。 – 2010-06-02 18:22:41

+0

我明白你的意思,非常有道理。爲了統計目的,我仍然需要查詢存檔表,但是如果我認爲長期的話,那麼這些查詢應該像您所說的那樣很少見。謝謝! – Serge 2010-06-02 19:30:19

0

您可以使用觸發器捕獲訂單已標記爲已完成,從當前表中刪除並插入到歸檔表中。

或者,您可以創建一個執行存檔的存儲過程。例如

sp_markcompleted(taskid)

開始事務;

insert into newtable select * from oldtable where id = taskid;

從oldtable中刪除其中id = taskid;

commit;