两个FK有关系时的数据库设计与规范化



我正在尝试开发一个基于Java web的应用程序,可以工作流不同的对象沿着不同的路径。这些对象和路径将在DB中定义为工作流类和工作项。现在我正在研究Calculation Assignment对象,该对象根据其选择的计算级别获得其工作流路径。

这是我的工作流程计算表:

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"

当用户开始一个新的计算工作流时,他们从下拉菜单中选择一个计算级别,这告诉我当他们点击提交时我应该在WF_WORKFLOW_INSTANCE表中存储哪个WORK_FLOW_CLASS_ID。

在TPQOT_CALC_ASSIGNMENT表中存储的两个外键:CALC_LEVEL_ID &WORKFLOW_INSTANCE_ID -两者在各自的表中都与相同的WORK_FLOW_CLASS相关。

如果计算分配数据被编辑,并且计算级别从II级计算更改为III级计算(与不同的工作流类相关)怎么办?

这是一个缺陷,会来困扰我的道路吗?我意识到我可以编写代码来确保如果Calc Level被更新,那么确保适当地创建一个新的工作流实例。

您可能想知道为什么我在工作流实例中没有Calc Level。这是因为我可能想要创建另一个不使用Level字段的工作流程对象,并且它可能只有一条路径。比如一份求职者的简历。

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

= = = = = = = =编辑如果我把CALC_LEVEL_IDTPQOT_CALC_ASSIGNMENT表中去掉呢?TPQOT_CALC_LEVEL_WORKFLOW表将用于Calc级别下拉,这为我提供了WORKFLOW_CLASS_ID用于创建WF_WORKFLOW_INSTANCE ?在查看计算分配表单时,我将能够联合表并获得Calc级别标签。任何想法吗?

如果编辑了计算赋值数据,并且Calc Level由第II级计算改为第III级计算(与不同的工作流程类)?

如果这是你打算允许的更新,那么你有责任对更新做出适当的反应。您可能需要撤销基表上的权限,并通过可更新视图或存储过程处理所有更新。或者您可能需要编写一个或多个触发器。

如果这是一个你不应该允许的更新,那么你就不应该允许它。您只能授予INSERT和DELETE权限,并撤销UPDATE权限。可能还有其他方法。

允许更新而不适当地响应它会使数据库处于无效状态。因为这是一个应该适用于所有用户的需求,所以理想情况下它应该在数据库中,而不是在应用程序代码中。

如果您发现撤销更新权限限制太大,您可以使用一个简单的触发器来执行该规则,以便在更新计算级别而未更改工作流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;

最新更新