我有以下表格设计:
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?
答案 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()约束可以在原始表中修复它。)您可以使用触发器或可更新视图来解决该问题。