2011-11-03 60 views
0

我正在爲Java Web應用程序工作流應用程序的數據庫設計來跟蹤和檢查各種業務產品(文檔)。但是我的設計和實現有很多不確定性。
這裏是我的表:數據庫設計一對多

  • WORK_FLOW_CLASS - 定義工作表類型的產品,即流量:報告,演示,工程計算

  • ROLE_CLASS - 工作流角色,即定義表:發起人,檢查員,審批人,經理

  • WORK_ITEM_CLASS - 代表某些紙質表格的工作項目定義表,即:作業表單,計算覈對表,報告審覈表,Clos EOUT清單等,這些形式要求將被按照一定的順序多個角色被認爲完成之前的工作

  • WORK_ACTION_CLASS - 的工作項行動,即定義:通過檢查完整的計算清單(一WORK_ITEM)(一ROLE) ,完整的審查報告(一WORK_ITEM)由經理(一個ROLE),完整的審查報告(一WORK_ITEM)通過審批(一ROLE

  • WORK_FLOW_SEQUENCE - 定義表與一個WORK_FLOW_CLASS的許多WORK_ITEM_CLASS ES,即系入門級1計算順序是:(1)A (2)計算清單,(3)清理清單。部門XYZ 1級計算順序爲:(1)分配表格,(2)清理清單[XYZ選擇不在其Calc工作流程中執行清單]。

第一個問題:如若WORK_ACTION_CLASS有一個FK它涉及到WORK_ITEM_CLASS?

或者我應該使用中間表來提供關係?我認爲後者是不必要的,因爲我不需要將WORK_ACTION與多個WORK_ITEMS相關聯,只有一個。

當用戶啓動一個新的工作流實例時,我的計劃是查詢CLASS表以獲取所選WORK_FLOW_CLASS的詳細信息,並將它們實例化到下表中。

  • WORK_FLOW_INSTANCE - 工作流的實際實例 - 我想就像一個購物車訂單

  • WFI_WORK_ITEMS - WORK_ITEMs的工作流程實例行項目 - 我想喜歡的產品的訂單

  • WFI_WORK_ITEM_ACTIONS - 工作流實例的工作項目操作

這裏就是我需要的^ h elp與第二個問題

是否應該有兩個單獨的表WFI_WORK_ITEMSWFI_WORK_ITEM_ACTIONS或應該有一個複合表?我需要查詢工作流實例中的WORK_ITEMS以及包含WORK_ACTIONS子步驟的WORK_ITEMS。

這裏是被質疑的兩個表的細節。對不起,我不知道描述我的模式的最佳方式。

WFI_WORK_ITEMS 
============== 
WFI_WORK_ITEM_ID (PK) 
WORKFLOW_INSTANCE_ID (FK) 
WORK_ITEM_CLASS_ID (FK) 
STEP_NUM 
LAST_DATE 
STATUS 
IS_ACTIVE 


WFI_WORK_ITEM_ACTION 
==================== 
WFI_WORK_ITEM_ACTION_ID (PK) 
WORKFLOW_INSTANCE_ID (FK) 
WFI_WORK_ITEM_ID (FK) 
WORK_ITEM_CLASS_ID (FK) 
STEP_NUM 
WORK_ACTION_CLASS_ID (FK) 
ACTION_OWNER 
LAST_DATE DATE 
STATUS 
IS_ACTIVE 

我似乎在這兩個表中有很多冗餘信息。但是我已經閱讀過,有時會執行非規範化表格。

任何幫助我的設計是非常感謝。

編輯 我的意思通過冗餘數據是兩個表列出WORKFLOW_INSTANCE_IDWORK_ITEM_CLASS_ID我的想法是,如果我想知道一個工作流的特定實例的WORK_ITEM_ACTIONS,我可以通過查詢表WFI_WORK_ITEM_ACTION得到它而無需加入「WFI_WORK_ITEM」表。也許這是錯誤的想法。 WORK_ITEM_CLASS_ID也一樣。通過查詢WFI_WORK_ITEM_ACTION表,我知道ACTION的WORK_ITEM類型。

這是一個更好的設計?

 
WFI_WORK_ITEM 
============== 
WFI_WORK_ITEM_ID (PK) 
WORKFLOW_INSTANCE_ID (FK) 
WORK_ITEM_CLASS_ID (FK) 
WORK_ITEM_STEP_NUM 
WORK_ITEM_LAST_DATE 
WORK_ITEM_STATUS 
WORK_ITEM_IS_ACTIVE 


WFI_WORK_ITEM_ACTION 
==================== 
WFI_WORK_ITEM_ACTION_ID (PK) 

         
 
  
          WORKFLOW_INSTANCE_ID (FK)
         
  
WFI_WORK_ITEM_ID (FK) 

         
 
  
          WORK_ITEM_CLASS_ID (FK)
         
  
WORK_ACTION_STEP_NUM 
WORK_ACTION_CLASS_ID (FK) 
ACTION_OWNER 
WORK_ACTION_LAST_DATE 
WORK_ACTION_STATUS 
WORK_ACTION_IS_ACTIVE 

回答

4

您應該始終以第三範式(3NF)設計表格。如果您瞭解和減輕影響,恢復到較少的表單(通常是出於性能原因)是完全可以接受的,但從3NF開始

(略簡體)規則要記住的是,表中的每個非鍵列應取決於:

  • 關鍵,
  • 整個鍵,
  • 並沒有什麼,但關鍵,
  • 「所以幫助我,科德」 - 一個小DBA的幽默(我的意思是「小」)。

第一個問題很簡單。

一對多關係最好在「多」表中表示爲外鍵。所以你提出的是明智的。它允許您自動限制關係。如果你有一個單獨的連接表(用於多對多),你需要求助於「欺騙」來強制執行一對多關係。

至於你的第二個問題,你需要看看上面的「Codd」規則,並自己想一想:每個表中的這些行究竟代表什麼?如果工作項目操作與工作項目是不同的對象(它們可能與相關但是,如果它們不代表同一個對象,則它們是不同的),它們應該位於不同的表格中。

另外,看起來你有一對多的關係(一個項目可以有很多動作),所以它們應該在不同的表格中,僅僅是出於這個原因。

至於你對冗餘信息的查詢:如果他們真的冗餘,他們應該被修復。

step_num爲例,這究竟代表什麼?如果它是工作項目的一個屬性,它應該不在工作動作表中。

如果您想知道工作操作表中某一行的步驟編號,可以使用外鍵連接工作項目表。

如果相反它是工作行爲的屬性,則應將其從工作項表中刪除,因爲它沒有任何意義。你可能有兩個動作,每個動作都有不同的步驟號,那麼在這種情況下父項的步驟號是什麼?

當然,你可能有兩個項目行動不同步數 - 在這種情況下,我會考慮重新命名,使意圖明確,像item_step_numaction_step_num東西。

底線是以3NF開頭。如果在某些時候你的數據庫運行速度太慢,,然後考慮回覆到較小的形式。然後,您可以在此詢問另一個問題,以瞭解如何識別和緩解由此產生的問題(例如,兩個地方的數據不一致的可能性以及使用觸發器來防止這些問題)。

+0

+1,該主題的優秀概述。 – DCookie

+0

+1,這與@DCookie所述的原因相同。 –

+0

@paxdiablo - 謝謝你的出色答案。你所說的一切都很有道理。關於步驟編號的部分是肯定的,我需要工作項目和工作項目操作的步驟編號。我會解決這個問題,重構爲3NF並重新發布。 – jeff

相關問題