2011-12-06 30 views
1

我正在嘗試開發一個基於Java的基於Web的應用程序,該應用程序可以使不同的路徑下的不同對象流動。這些對象和路徑將在DB中定義爲Work Flow Classes and Work Items。現在我正在研究Calculation Assignment對象,該對象根據其選定的計算級別獲取其工作流程路徑。當兩個FK有關係時,數據庫設計和規範化

這裏是我的流動工作計算表:

TPQOT_CALC_ASSIGNMENT "Calculation Assignment - Main Object" 
===================== 
CONSTRAINT dup_wf_instance UNIQUE (WORKFLOW_INSTANCE_ID) 
--------------------- 
CALC_NUM (PK)  VARCHAR2(6) "Calculation Number" 
CALC_REV (PK)  VARCHAR2(2) "Calculation Revision Designator" 
CALC_DEPT (PK)  VARCHAR2(3) "Calculation Originating Department" 
CALC_LEVEL_ID (FK) VARCHAR2(24) "Calculation Level ID" 
WORKFLOW_INSTANCE_ID (FK) VARCHAR2(24) "Workflow Instance Unique ID" 


TPQOT_CALC_LEVEL_WORKFLOW "Calculation Level To Work Flow Class Lookup Table" 
========================= 
CONSTRAINT dup_calclvlwf UNIQUE (CALC_LEVEL, DEPT_OWNER, WORKFLOW_CLASS_ID) 
CONSTRAINT dup_calclvl UNIQUE (CALC_LEVEL, DEPT_OWNER) 
------------------------- 
CALC_LEVEL_ID (PK)  VARCHAR2(24) "Calculation Level To Work Flow Type Unique ID (Surrogate)" 
CALC_LEVEL    VARCHAR2(3) "Calculation Level" 
DEPT_OWNER    VARCHAR2(3) "Department Owner" 
WORKFLOW_CLASS_ID (FK) VARCHAR2(24) "Work flow Class Unique ID" 


WF_WORKFLOW_INSTANCE "Workflow Instances" 
==================== 
WORKFLOW_INSTANCE_ID (PK) VARCHAR2(24) "Work Flow Instance Unique ID" 
WORKFLOW_CLASS_ID (FK)  VARCHAR2(24) "Work Flow Class Unique ID" 
STARTED_BY     VARCHAR2(9) "Work Flow Instance Started By Badge" 
LAST_DATE     DATE   "Last date instance was worked" 
STATUS      VARCHAR2(3) "Workflow Instance Status" 


WF_WORKFLOW_CLASS "Workflow process classes by department Reference Table" 
================= 
CONSTRAINT dup_workflow UNIQUE (DEPT_OWNER, NAME) 
----------------- 
WORKFLOW_CLASS_ID (PK) VARCHAR2(24) "Work flow Class Unique ID (Surrogate)" 
DEPT_OWNER    VARCHAR2(3) "Department Owner" 
NAME      VARCHAR2(64) "Short Name" 
DESCRIPTION    VARCHAR2(256) "Description" 
VERSION     VARCHAR2(2) "Version Number" 

當用戶啓動一個新的計算工作流程,他們選擇從下拉,它告訴我,我應該在存儲其中WORK_FLOW_CLASS_ID一個計算層WF_WORKFLOW_INSTANCE表,當他們點擊提交。

在TPQOT_CALC_ASSIGNMENT表存儲在兩個外鍵 - CALC_LEVEL_ID & WORKFLOW_INSTANCE_ID - 既涉及同一WORK_FLOW_CLASS在他們的尊敬表。

如果計算分配數據被編輯,並且計算水平從II級計算改變爲III級計算(它涉及到不同的工作流程類別)會怎麼樣?

這是一個瑕疵,會來困擾我的道路?我意識到我可以編寫代碼以確保如果更新計算級別,然後確保適當地創建新的工作流程實例。

您可能想知道爲什麼我在工作流程實例中沒有Calc Level權限。這是因爲我可能想要創建另一個對象到不使用Level字段的工作流,並且它可能只有一個路徑。例如求職者的簡歷。

JOB_APPLICANT 
===================== 
APPLICANT_ID (PK) 
FIRST_NAME 
WORKFLOW_INSTANCE_ID (FK) 

==== ====編輯 如果我剛剛從TPQOT_CALC_ASSIGNMENT表中刪除CALC_LEVEL_IDTPQOT_CALC_LEVEL_WORKFLOW表格將用於Calc Level Pull下拉,這爲我提供了WORKFLOW_CLASS_ID來創建WF_WORKFLOW_INSTANCE?查看計算分配表單時,我可以將表格合併,並獲得計算級別標籤。任何雖然?

回答

3

如果什麼計算分配數據進行編輯,並Calc的水平 從二級計算器轉變爲III級計算(這涉及到 不同的工作流程類)?

如果這是您打算允許的更新,那麼您有責任對更新做出適當的反應。您可能需要撤銷對基表的權限,並通過可更新視圖或存儲過程處理所有更新。或者您可能需要編寫一個或多個觸發器。

如果這是一個更新,你不應該允許,那麼你不應該允許它。您只能授予INSERT和DELETE權限並撤消更新權限。可能還有其他方法。

允許更新但未對其做出適當反應會使數據庫處於無效狀態。由於這是一項適用於所有用戶的要求,因此理想情況下應該在數據庫中,而不是應用程序代碼中。

+0

什麼我希望聽到。現在我的意圖是不允許更改級別,但我知道管理層會說我們如何升級calc的級別。聽起來像我的桌子設計是足夠的,如果我允許更新,處理狀態取決於我。 - 感謝 – jeff

+0

@jeff:在應用程序代碼中這樣做是有道理的。 (或者在一個存儲過程中)。選擇「計算行」,增加(不管)該級別,插入一個新的「計算行」。你對舊的做什麼取決於應用程序。 –

+0

我回頭質疑我的設計。如果我只是從TPQOT_CALC_ASSIGNMENT表中刪除CALC_LEVEL_ID,該怎麼辦? TPQOT_CALC_LEVEL_WORKFLOW表將用於Calc Level Pull down,這爲我提供了WORKFLOW_CLASS_ID來創建WF_WORKFLOW_INSTANCE?查看計算分配表單時,我可以使用UNION並獲得計算級別標籤。 – jeff

2

如果您發現撤銷更新權限制過多, 你可以使用一個簡單的觸發器,如果​​鈣水平不流ID更新引發錯誤強制規則被改變:

CREATE OR REPLACE TRIGGER trg_chk_class_change 
BEFORE UPDATE 
ON tpqot_calc_assignment 
REFERENCING NEW AS New OLD AS Old 
FOR EACH ROW 
DECLARE 

BEGIN 
    IF :NEW.calc_level_id <> :old.calc_level_id AND :NEW.workflow_class_id = :OLD.workflow_class_id THEN 
     raise_application_error(-20001, 'Class change only allowed if workflowid is changed'); 
    END IF;  
END; 
+0

+1爲觸發器。 -謝謝 – jeff