在父表中具有狀態或摘要列的正確方法還是應該選擇另一個程序?
我的父表是“Jobs”表,並且有一個子表記錄了 Job 的操作,名為“JobActions”,如下所示:
作業(JobId、 JobType 、 CurrentStage 、 AssignedTo )
JobActions ( JobActionId , JobId , CreateDate, ActionType, FromUserId, ToUserId, Message, Detail)
在我的網頁網格中,我列出瞭如下網格列:
JobId, CreateDate, CurrentStage, AssignedTo, LastActionType, LastActionDate,…
在用於計算以下列的網格中,我使用子表的連接(當有很多使用者和很多數據時非常慢)
CreateDate ==> 第一個(或最小)JobActions 的 CreateDate,
LastActionType ==> 上次 JobActions 的 ActionType,
LastActionDate ==> 最後(或最大)JobActions 的 CreateDate
我有大約五個這樣的列需要多次加入 JobActions 或另一個表,所以我決定更改 Job 表,如下所示:
作業(JobId、 JobType 、 CurrentStage 、 AssignedTo 、 CreateDate 、 LastActionType 、 LastActionDate )
每當有任何 jobaction 添加到 JobActions 時,最後三列總是更新。
- 問題 1:這是一個正確的版本,(我是否對錶進行了非規範化?)
- 問題 2:我應該對此類作業使用觸發器還是應該從我的程式碼內部更新?
- 問題 3:這是最佳實踐嗎?這類問題有沒有更好的解決方案。
問題 3:這是最佳實踐嗎?這類問題有沒有更好的解決方案。
“最佳實踐”可能取決於環境。建議是嘗試找出 a
VIEW
“慢”的原因。如果你不能讓它更快,那麼你的解決方案似乎很好(在考慮了其他業務需求之後)。問題 1:這是一個正確的版本,(我是否對錶進行了非規範化?)
在您的原始設計中,該
JobActions
表將是漸變維度 (SCD)類型 2 數據。在您的其他設計中,附加列(在
Jobs
表中)將類似於 SCD 類型 4 類型的數據。你的模型看起來不錯(對我來說)。
問題 2:我應該對此類作業使用觸發器還是應該從我的程式碼內部更新?
讓我們從“是否應該將更新放在您的應用程式碼中”開始?國際海事組織 - 不。在處理同一組數據時,所有應用程序都應遵循相同的過程。確保這一點的唯一方法是在數據庫中擁有更新邏輯。
它應該在觸發器中嗎?這個答案可能是高度自以為是的。
一方面,在觸發器中實現所需的更新邏輯可能很容易。另一方面,實現刪除邏輯可能很困難/不可能。
選擇
將程式碼放在儲存過程中。
即:遵循模型-視圖-控制(MVC)理念
- 從應用程序中隱藏您的數據模型
- 應用程序從視圖中獲取數據
- 所有DML操作都通過儲存過程控制
在您的範例中,您實際上並不需要
VIEW
在表上創建一個(從而隱藏您的數據模型)。您只需要阻止(通過GRANT/REVOKE
)應用程序在儲存過程之外執行 DML。