Database-Design

在父表中具有狀態或摘要列的正確方法還是應該選擇另一個程序?

  • April 5, 2020

我的父表是“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。

引用自:https://dba.stackexchange.com/questions/264349