2014-09-30 3 views
0

각 항목에 몇 가지 다른 테이블과의 외래 키 관계 가능성이있는 언어 매핑 테이블이 있습니다. 이 구성을 처리하는 가장 좋은 스키마는 무엇입니까?외래 키 여러 테이블 중 하나와의 관계

테이블 : LanguageMap, TableA의, TableB의

이있는 두 가지 가능성 :

1. 조회 열 방법 - 아니 외래 키 제약 조건 :

Create Table LanguageMap (
    Id int not null primary key, 
    Language nvarchar not null, 
    Value nvarchar not null, 
    Type nvarchar not null, -- 'TableA', 'TableB', etc. 
    ForeignTableId int not null -- Is Foreign key to another table dependent on the type of the row. 
) 

2 복수의 외래 키 열

,210
create Table LanguageMap(
    Id int not null primary key, 
    Language nvarchar not null, 
    Value nvarchar not null, 
    Type nvarchar not null, -- 'Activity', 'Verb', etc. 
    TableAId int null, 
    TableBId int null 
) 
alter table LanguageMap add constraint FK_LanguageMap_TableA 
foreign key (TableAId) references TableA (Id) 

alter table LanguageMap add constraint FK_LanguageMap_TableA 
foreign key (TableBId) references TableB (Id) 

alter table LanguageMap add constraint CK_LanguageMap_OneIsNotNull 
check (TableAId is not null or TableBId is not null) 
go 
alter table LanguageMap add constraint CK_LanguageMap_OneIsNull 
check (TableAId is null or TableBId is null) 
go 

외부 키 제약은 "공유가 기본 키"라는 또 다른 대안은있다 Foreign Key for either-or column?

+0

TableA 및 TableB에 저장된 내용을 명확히하기 위해 약간의 샘플 데이터를 표시 할 수 있습니까? 그것들은 서로 같은 스키마를 가지고 있는가? 또한 당신이 링크하는 테이블이 2 개 밖에 없거나이 질문의 목적 상 2 개로 제한되어 있습니까? – Tanner

+0

나는 여전히 스키마를 작성하고 있으므로 얼마나 많은 테이블이 있는지 확실하지 않습니다. 그러나 스키마가 근본적으로 다르고 최소한 테이블 4 개, 즉 TableA, TableB, TableC, TableD가있을 것이라고 가정합니다. 아마도 더. 샘플 데이터는 왜 관련이 있습니까? – Rafi

+0

스키마/데이터가 테이블에서 유사하면 해결하려고했습니다. – Tanner

답변

2

을 기반으로합니다. 당신은 이것을 볼 수 있습니다. TableA, TableB, TableC 등이 모두 "TableMaster"라는 일부 Master 테이블에서 PK의 복사본으로 PK를 "상속"하는 경우이를 LanguageMap의 FK로 사용할 수 있습니다.

올바른 조인은 올바른 인스턴스를 선택합니다.

공유 기본 키는 "클래스 테이블 상속"이라는 디자인 패턴과 함께 사용됩니다. TableA, TableB, TableC 등이 무엇인지 알지 못한다면 클래스 테이블 상속이 귀하의 사례와 관련이 있는지 말할 수 없습니다.

"Shared Primary Key"와 "Class Table Inheritance"를 모두 참조하여 추가 정보를 얻으십시오. 해당 이름의 태그가이 영역에 있습니다.

+0

공유 기본 키에 대해 설명하는 훌륭한 게시물 : http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server – Rafi