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プログラムで使用するチェックリストの詳細をアクションが認識できるようにするために が必要です。CHECKLIST_CLASS_IDこのアクション定義が動的チェックリストでない場合、フィールドは適用されないため、このデザインは好きではありません。この事実を切り離す最善の方法がわかりません。

したがって、私のテーブルは 3NF ではなく 2NF であると言うのが正しいかもしれません。もしそうなら、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_type_id = '2' を持つ work_action_class の行を参照することが保証されます。

ただし、他の変更も実装しない限り、「2」の work_action_type_id を持つすべての行に対して checklist_class_id を要求する機能が失われます。(CHECK() 制約は、元のテーブルでそれを修正できます。) トリガーまたは更新可能なビューでその問題に取り組むことができます。

于 2013-08-07T06:01:34.560 に答える