2012-06-07 38 views
0

我正在創建數據模型以存儲與生產跟蹤相關的數據。我爲一家工程公司工作,爲我們的客戶建模和分析數據。流程中有幾個步驟,流程不斷更新。可更新順序記錄的數據庫設計

我想模擬進程,幷包括父進程和進程順序。

例如:

Process Table 
--------------------- 
ProcessID - uniqueidentifier 
ProcessName - varchar 
ProcessDescription - varchar 
... 

ProcessOrder Table 
--------------------- 
ProcessID - uniqueidentifier FK - Process 
ParentProcessID - uniqueidentifier FK - Process 
ProcessOrder - int 
... 

ProcessOrder表的ProcessOrder柱將簡單地存儲表示在它所表示的父進程,其順序步驟的數字。

例如,建模過程有以下步驟:創建新的空模型,名稱模型,輸入模型參數。該Process表如下所示:

ProcessID | ProcessName | ProcessDescription 
------------------------------------------------- 
UUID1  | Modeling | Create Model of Data 
UUID2  | New Model | create new empty model 
UUID3  | Name Model | name model 
UUID4  | Parameters | enter model parameters 

ProcessOrder表如下所示:

ProcessID | ParentProcessID | ProcessOrder 
-------------------------------------------------- 
UUID2  | UUID1   | 1 
UUID3  | UUID1   | 2 
UUID4  | UUID1   | 3 

這種設計的問題是,當工作流被更新,流程訂單將有所改變,我需要爲更改的過程更新ProcessOrder記錄,並更新ParentProcessID相同的所有後續記錄。

有沒有更好的方式來存儲這種數據和維護規範化?

回答

0

我認爲解決方案類似於我在Advise on database design for a project lifecycle

以上的數據是在前面的例子中所描述的不同狀態值所建議的一個。因此,對於您有以下表的每個客戶端項目:

a)客戶項目 - 客戶端ID - 參考客戶 - 狀態(FK到的ProcessID) - 項目名稱,描述,日期開始

B)狀態的變化 - 它跟蹤的變化,從一個狀態到另一個 - 專案編號 - 舊狀態(FK到的ProcessID) - 新狀態(FK到的ProcessID) - 更改日期 - 筆記(等欄目類似審批等)

0

該問題類似於爲什麼LinkedList具有更好的插入性能(因爲您已經有對要插入的節點的引用)與在ArrayList中插入相比較。

在ArrayList進行插入時,您必須移動所有記錄以爲新插入騰出空間。這可能需要O(N)個時間,假設有N個記錄(想象插入列表的開頭)。

在LinkedList中,您只需要更新要插入點處的節點。通過上面的假設,這將花費O(1)次,因爲您只需要更新Prev節點和Next節點。

要設置數據庫中的LinkedList結構而不是ProcessOrder列,您需要有兩列PrevProcessID和NextProcessID。

選擇此項時出現問題。幼稚的做法是在表格上遞歸地自我加入。這將導致N個連接。

不使用任何連接,而是使用父連接ID選擇所有進程,而不是使用N連接。

在代碼中,具有以下字段的過程對象: ParentProcessID 的ProcessID PrevProcessID NextProcessID

在讀取在從選擇的記錄,創建這些對象,並將它們在一個哈希表與所述的ProcessID作爲存儲鑰匙。這將花費O(N)時間循環選擇語句。

既然記錄在HashTable中,您可以通過查找表中的NextProcessID(或PrevProcessID)輕鬆地從一個節點移動到下一個節點。使用HashTable可以避免做N個連接,而是需要O(N)時間來設置。

比較兩種方法

1)當前的解決方案。這是一個ArrayList類型的解決方案(將ProcessOrder視爲索引)。插入操作需要O(N)時間,因爲您不必設置HashTable,因此節省了讀取時間。但是,如果您已經循環返回的記錄以設置實體對象,那麼這將在LinkedList解決方案中具有相同的設置時間量。

2)我提出的解決方案。這是一個LinkedList類型的解決方案。插入需要O(1)時間,假設您知道要插入的位置。安裝時間需要O(N)時間。