数据库设计 - 字段仅在另一个字段具有特定代码(2NF)时适用

时间:2013-08-05 19:51:25

标签: database database-design 3nf

我有以下表格设计:

 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,以便操作知道要以编程方式使用的核对表的详细信息。我不喜欢这种设计,因为如果此动作定义不是动态检查表,则CHECKLIST_CLASS_ID字段不适用。我不知道将这一事实分离出来的最好方法。

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

1 个答案:

答案 0 :(得分: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}上添加唯一约束。这可以保证 this 表中的行始终引用work_action_class中具有work_action_type_id ='2'的行。

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