2013-08-05 1 views
0

나는 다음과 같은 테이블 디자인이 있습니다데이터베이스 설계 - 다른 필드는 특정 코드가있는 경우이 필드에만 적용됩니다 (2NF)

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가 simpe 조회를하다

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에 어떻게 가야합니까?

답변

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에서 항상 행을 참조합니다.

다른 변경 사항을 구현하지 않으면 work_action_type_id가 '2'인 모든 행에 대해 checklist_class_id를 요구할 수 없게됩니다. (CHECK() 제약은 원래의 테이블에서 그것을 고칠 수있다.) 당신은 트리거 나 갱신 가능한 뷰로 그 문제를 공격 할 수있다.

+0

네, 체크리스트 클래스 ID를 구분하는 것이 좋습니다. 트리거, 검사 및 제약 조건과 함께 제안하는 논리 중 일부를 사용하여 Java 웹 응용 프로그램에 도움을 줄 수 있습니다. – jeff