0

我有以下表格设计:

 TABLE: WORK_ACTION_CLASS 
 WORK_ACTION_CLASS_ID VARCHAR2(24) Primary Key
 NAME VARCHAR2(64)  64 Action Name
 ROLE_CLASS_ID VARCHAR2(24) Role Class ID That Performs This Action  
 CHECKLIST_CLASS_ID VARCHAR2(24) Checklist Class PK  
 WORK_ACTION_TYPE_ID VARCHAR2(3) 

WORK_ACTION_TYPE_ID 是一个简单的查找

 1=Done Button
 2=Dynamic Checklist
 3=Custom Form
 4=Progress Log
 5=Approve/Decline Button  

当动作类型是动态清单时,CHECKLIST_CLASS_ID需要 a 以便动作知道要以编程方式使用的清单的细节。我不喜欢这种设计,因为如果此操作定义不是动态清单,CHECKLIST_CLASS_ID则字段不适用。我不知道区分这个事实的最佳方法。

所以说我的桌子是 2NF 而不是 3NF 可能是正确的。如果是这样,我该如何或应该尝试达到 3NF?

4

1 回答 1

1

您可以为动态清单添加表格。

create table work_action_dynamic_checklists (
  work_action_class_id varchar2(24) primary key,
  work_action_type_id varchar2(3) not null
    default '2'                                  -- ???
    check(work_action_type_id = '2'),
  checklist_class_id varchar2(24) not null,
  foreign key (work_action_class_id, work_action_type_id) 
    references work_action_class (work_action_class_id, work_action_type_id)
);

为此,您需要在 work_action_class 的 {work_action_class_id, work_action_type_id} 上添加唯一约束。这保证了表中的行始终引用 work_action_class 中具有 work_action_type_id = '2' 的行。

但是,除非您也实施其他更改,否则您将无法为 work_action_type_id 为“2”的每一行要求一个 checklist_class_id。(CHECK() 约束可以修复原始表中的问题。)您可以使用触发器或可更新视图来解决该问题。

于 2013-08-07T06:01:34.560 回答