2011-09-12 5 views
0

복합 기본 키 테이블 (유지 관리 항목)이 있습니다. 이 테이블 내의 항목 사이에 상위 하위 관계를 매핑하는 다른 테이블을 만들고 싶습니다.복합 기본 키 테이블의 부모/자식 관계 매핑

나는 부모 자식 관계 테이블이 두 옵션 1 또는 옵션 2

참고 아래를 참조 만드는 방법을 모르겠습니다 : 우리의 비즈니스 규칙은 부모 자식 관계가 할 수있는 유일한 공유 유지 보수 항목 사이를 종료 할 것을 규정 동일한 유지 보수 프로그램. 이것은 결코 바뀌지 않을 것입니다!

표 유지 관리 프로그램에
ProgramCode (기본 키)
ProgramDescription
다른 열 ...

테이블 유지 보수 항목 (복합 기본 키 표)
ProgramCode (복합 기본 키)
MaintenanceCode (복합 기본 키)
유지 관리 설명
다른 열 ...

표 부모/자식 유지 보수 항목 (옵션 1)
ProgramCode
ParentMaintenanceCode
ChildMaintenanceCode

테이블 부모/자식 유지 보수 항목 (옵션 2)
ParentProgramCode (ChildProgramCode와 같은 값)
부모 유지 보수 코드
ChildProgramCode (ParentProgramCode와 같은 값)
ChildMaintenanceCode

상위/하위 테이블에는 관계 매핑 테이블 인 다른 열은 없습니다.

어느 것이 더 좋은 옵션입니까? 옵션 2는 베스트 프랙티스에 어울리는 것으로 보이지만, 우리의 사업 규칙에 따라 동일한 데이터 (ProgramCode)를 가진 두 개의 컬럼이 있음을 의미합니다.

답변

2

유지 보수 항목간에 다 대다 관계를 원할 경우 제안하는 것과 같이 연관 엔티티를 사용하는 유일한 이유가 있습니다. 그것이 당신이 추구하는 것이라면 옵션 1이 당신이하는 일입니다. 스키마는

create table MaintenanceProgram 
(
    ProgramCode int not null , 

    ... -- other non-key attributes here 

    primary key (ProgramCode) , 

) 
create table MaintenanceItem 
(
    ProgramCode  int not null , 
    MaintenanceCode int not null , 

    ... -- other non-key attributes here 

    primary key (ProgramCode , MaintenanceCode) , 

    foreign key      (ProgramCode) 
    references MaintenanceProgram (ProgramCode) , 

) 
create table MaintenanceItemMap 
(
    ProgramCode   int not null , 
    ParentMaintenanceCode int not null , 
    ChildMaintenanceCode int not null , 

    primary key (ProgramCode , ParentMaintenanceCode , ChildMaintenanceCode) , 

    foreign key     (ProgramCode , ParentMaintenanceCode) 
    references MaintenanceItem (ProgramCode , MaintenanceCode  ) , 
    foreign key     (ProgramCode , ChildMaintenanceCode ) 
    references MaintenanceItem (ProgramCode , MaintenanceCode  ) , 

    check (ParentMaintenanceCode != ChildMaintenanceCode) , 

) 

이 모든 관련 유지 보수 항목이 같은 ProgramCode를 공유 할 수 있도록하고 유지 보수 항목 자체에 (점검 제한 조건)를 매핑 할 수 없습니다 그런 일처럼 보일 것입니다.

그러나 문제 문은 상위/하위 관계를 말하며 계층/트리와 유사합니다.이 경우, 당신이 원하는 것 스키마는 다음과 같이 보일 것입니다 :

create table MaintenanceProgram 
(
    ProgramCode int not null , 

    ... -- other non-key attributes here 

    primary key (ProgramCode) , 

) 
create table MaintenanceItem 
(
    ProgramCode   int not null , 
    MaintenanceCode  int not null , 
    ParentMaintenanceCode int  null , 

    ... -- other non-key attributes here 

    primary key (ProgramCode , MaintenanceCode) , 

    foreign key      (ProgramCode ) 
    references MaintenanceProgram ( ProgramCode) , 
    foreign key      (ProgramCode , ParentMaintenanceCode) 
    references MaintenanceItem (ProgramCode , MaintenanceCode  ) , 

    check (MaintenanceCode != ParentMaintenanceCode or ParentMaintenanceCode is null) , 

) 

을 위의 각 유지 보수 항목은 단일 유지 보수 프로그램과 관련이 있다고 말한다; 반대로 각 유지 관리 프로그램에는 0 개 이상의 유지 관리 항목이 있습니다.

또한 각 유지 관리 항목에는 0 또는 1 개의 상위 유지 관리 항목이 있어야하며,이 유지 관리 항목은 동일한 유지 관리 프로그램과 관련되어야합니다.

점검 제한 조건은 주어진 유지 보수 항목이 자체 상위가 아닐 수 있음을 나타냅니다.

+0

필자의 최고 스키마는 필자가 추구 한 것입니다. 다 대다 관계가 필요합니다. 고맙습니다! – Reafidy

1

왜 옵션 2가 모범 사례라고 생각하십니까? 그것들이 동일해야만한다면, 그것들을 다른 컬럼에 넣는 것은 의미가 없습니다. 옵션 1이 2보다 우수합니다.

+0

그건 내 무식한 생각이었고 도움을 주셔서 감사합니다. – Reafidy

1

옵션 1이 가장 좋습니다. 부모를 참조 할 수 있으며 참조 무결성을 적용 할 수 있습니다. 또한 SQL Server 2005 이상을 사용하는 경우 재귀 적 CTE를 사용하여 메뉴, 드롭 다운 등에 필요할 경우 상위/하위의 계층을 빌드 할 수 있습니다.

+0

Wil 감사합니다. 재귀 적 CTE가 아마도 내 다음 장벽 일 것입니다. – Reafidy

관련 문제