2012-09-18 37 views
1

SQL Server 2005.實體修訂架構設計

在我們的應用程序中,我們有一個包含父表以及多個子表的實體。我們希望跟蹤對此實體進行的修改。來回之後,我們將其縮小爲兩種可供選擇的方法。

  1. 有一個實體歷史表。在sproc更新表之前,從父表和所有子表中檢索整個實體的當前狀態。將其XML化並將其作爲XML數據類型粘貼到歷史記錄表中。包含一些要查詢的列,以及修訂號/創建日期。

  2. 對於每個表,使用相同的列創建匹配歷史記錄表。還有一個修訂號/創建日期。在sproc更新單個表之前,檢索該表的記錄的現有狀態,並將其複製到歷史記錄表中。所以,它有點像SVN。如果我想在修訂版Y中獲取實體,我需要在每個表中獲取最大版本號不大於Y的歷史記錄。一個實體可能在一個表中有50個修訂記錄,但只有3個修訂記錄一個子表,等等。我可能想堅持整個實體的修訂計數器。

這兩種方法似乎都令他們頭疼,但我仍然更喜歡解決方案#2解決方案#1。這是一個已經很龐大的數據庫,並且已經遭遇性能問題。在每個修訂版中使用XML Blob來擴展它(並且會有很多)似乎是一種可怕的方式。爲所有事情創建歷史記錄表是我願意吃的成本,只要沒有更好的方法來做到這一點。

有什麼建議嗎?

感謝, Tedderz

+2

從頭開始。你爲什麼需要歷史?這僅僅是爲了審計,還是你期望對此做些什麼?歷史將如何使用?不知道這些提供1對2建議的事情是個人偏好。如果動態設計可以在表發生變化時自動調節,則#1具有優勢。 #2需要重新編碼,除非在本質上也是動態的(但是動態變化的結構永遠不會漂浮在我身邊)所以我的觀點是。不僅將如何使用它;但是父母/實體/孩子結構的變化性質是什麼?頻繁?靜態的? – xQbert

+0

最終用戶將能夠查看歷史記錄,並且它也將與一些業務邏輯一起發揮作用。它不會被超重使用,但它會在這裏和那裏使用。並且結構會經常發生變化。 – Tedderz

回答

3

2號幾乎可以肯定是要走的路,我做這樣的事情與我的歷史表,雖然我用一個「事件」表以及彼此相關聯的變化而不是使用時間戳。我想這就是你的意思是「修訂計數器」。我的「事件」表包含一個唯一的ID,一個時間戳(當然),負責更改的應用程序用戶和一個「動作」指示符,它表示用戶所做的導致更改發生的應用程序級動作。

爲什麼#2?因爲您可以更容易地使用partition表格來歸檔或滾出舊條目。因爲索引更容易。因爲這是一個更容易查詢的整體。因爲它的開銷比XML少,而且要小很多。

另外,考慮使用觸發器而不是編碼存儲過程來完成所有這些。觸發器幾乎總是要避免的,但對於這樣的事情來說,它們是一種相當輕量級和強大的方式來執行這種事情。

+0

啊,那個事件表正是我需要的!我同意觸發器;我們沒有像過去那樣使用它們。對於事件表,你是否爲每一個實體創建一個?我想有一個事件表跟蹤所有實體的事件可能會太臃腫?我想在邏輯和物理上將它們分開是有意義的。 – Tedderz

+0

不,我爲每個邏輯事務創建一個事件,並將該EventID與每個表歷史記錄表中的每個更改綁定。這樣,我可以將發生的變化聯繫起來。我在SQL Server中使用CONTEXT_INFO(或者您可以使用#temp表),以便觸發器「知道」他們正在記錄的事件ID。 –