2016-07-04 7 views
1

나는 뭔가의 독창성을 명시 적으로 정의하는 것과 관련하여 질문이 있습니다. 이것은 복합 외래 키의 작성과 관련이 있습니다. 가능한 한 명확한 질문을하기 위해 아래 예제를 만들었습니다. 테스트의 편의를 위해 일부 데이터 삽입물을 포함 시켰습니다.복합 외래 키의 경우 /는 왜 기본 키가있는 열 조합에 대해 참조 된 테이블의 복합 UNIQUE 제약 조건입니까?

[Table1]의 각 항목에는 고유 한 [Name]이 있어야합니다.

CREATE TABLE [Table1] 
(
    [ID] INT IDENTITY   NOT NULL PRIMARY KEY, 
    [Name] NVARCHAR(255) UNIQUE NOT NULL CHECK(LTRIM(RTRIM([Name])) <> '') 
); 

INSERT INTO [Table1]([Name]) 
VALUES 
('Name 1'), 
('Name 2'), 
('Name 3'), 
('Name 4'), 
('Name 5'), 
('Name 6'), 
('Name 7') 

[Table2][Value][Table1ID]에 대해 고유해야합니다.

CREATE TABLE [Table2] 
(
    [ID]  INT IDENTITY NOT NULL PRIMARY KEY, 
    [Table1ID] INT    NOT NULL FOREIGN KEY REFERENCES [Table1]([ID]), 
    [Value]  NVARCHAR(255) NOT NULL CHECK(LTRIM(RTRIM([Value])) <> ''), 

    --UNIQUE([ID], [Table1ID]), 
    UNIQUE([Table1ID], [Value]) 
); 

INSERT INTO [Table2]([Table1ID], [Value]) 
VALUES 
(1, 'Entry 1'), 
(1, 'Entry 2'), 
(1, 'Entry 3'), 
(1, 'Entry 4'), 
(3, 'Entry 5'), 
(3, 'Entry 6'), 
(3, 'Entry 7') 

[Table3][Table1ID][Table2ID]의 각 조합 [Table2]에 일치하는 조합이 있어야합니다 (I가 복합 FOREIGN KEY 장소에있는 경우 [Table1ID][Table2ID]에 대한 두 FOREIGN KEY의이 불필요한 것이 겠지?)를.

CREATE TABLE [Table3] 
(
    [ID]  INT IDENTITY NOT NULL, 
    [Table1ID] INT    NOT NULL FOREIGN KEY REFERENCES [Table1]([ID]), 
    [Table2ID] INT    NOT NULL FOREIGN KEY REFERENCES [Table2]([ID]), 

    FOREIGN KEY ([Table2ID], [Table1ID]) REFERENCES [Table2](ID, [Table1ID]) 
); 

INSERT INTO [Table3]([Table2ID], [Table1ID]) 
VALUES 
(5, 3) 

[Table3] 복합 FOREIGN KEY 제약은 문제가된다. 주석 처리 된 UNIQUE 제약 조건이 [Table2]에서 주석 처리되지 않은 경우 [Table3]을 성공적으로 만들 수 있습니다. 그렇지 않은 경우 [Table3]을 작성하면 "참조 된 테이블에 외부 키의 참조 컬럼리스트와 일치하는 기본 또는 후보 키가 없습니다"라는 메시지가 표시되지 않습니다.

내가 [Table2]에 대한 [ID] 열이 PRIMARY KEY이다 그러나 같은 키에 관해서 고유성에 대한 필요성을 이해하고 항상 고유 한 것, 왜 [Table2] 독특한 존재하지 [Table1ID] 열은 [Table2]의 모든 [ID]의 조합 [Table1ID]을 방지 할 수 고유 한 것에서?

기본적으로 UNIQUE([ID], [Table1ID]) 부분은 나에게 매우 불필요한 것, 그러나 [Table2]에서 [Table1ID]의 고유성이 명시 적으로 [Table3]에 복합 외래 키의 생성을 허용하도록 SQL 서버의 순서를 정의해야합니다 보인다.

실제로 그런 경우입니까? 위와 같은 제약 조건은 불필요한 것처럼 보일 수 있지만 위의 내용을 허용하려면 필요합니까? 또는 나는 무엇인가 놓치고 있냐?

+0

예, 고유성이 선언되어야 함을 발견했습니다. 나는 당신이 요구하는 것을 할 필요가있는 데이터 디자인에 의문을 가질 것이다. – Paparazzi

+0

또 다시, 나는 물건을 시연하는 예로서 위를 합친 것입니다. 데이터 디자인 주석을 확장 할 수 있습니까? – Interminable

+0

이걸 똑바로 세워 줘. Table2는 이미 Table1과 관계가 있습니다. 표 3에서 1과 2 사이의 관계를 직접 만들고 동시에 기존 관계 2를 존중합니다. 그 유형의 관계에 대한 합리적인 비즈니스 요구를 확장 할 수 있습니까? – Paparazzi

답변

1

실제로 관계형 데이터베이스의 이론적 측면과 관련이 있습니다.

상위 테이블에서 어떤 외래 키 참조가 임의의 열 집합이 아니지만 고유 할 수 있습니다. 기본 또는 대체 키 중 하나를 참조합니다. 그리고이 열쇠는 분명히 그렇게 선언되어야합니다.

+0

그리고 참조 된 테이블의 UNIQUE 제약 조건은 복합 FOREIGN KEY 제약 조건을 위해 참조 가능한 키로 간주됩니까? – Interminable

+0

@Interminable, yes - 학술적으로 말해서 대체 키입니다. 놀랍지 만 SQL Server에서도 고유 한 인덱스조차도 참조 된 키로 표시 될 수 있습니다 (필터링 된 인덱스는 확실하지 않습니다). –

+0

@philipxy, 나는 데이터베이스가 여기 "미안한 것보다 더 안전한"전략을 사용한다고 생각한다. 키를 참조 할 때 더 이상 키를 삭제할 수 없습니다. 그러나 열의 하위 집합 만 키로 선언 된 경우 데이터베이스 엔진은 부모 테이블에서 특정 키를 삭제할 수 있는지 여부를 알아 내려고 너무 많은 작업을 수행해야합니다. 게다가, 그런 규칙 굴곡에서 발생할 것 인 모호성의 수준은 비참 할 것이다, imo. –

0

고유 한 열 집합의 모든 수퍼 집합은 고유합니다. DBMS는 이것을 이해하도록 프로그램 될 수 있습니다. 하지만 SQL은 어쨌든 참조 된 테이블에서 고유 한 조합을 선언해야합니다.

추신 : 관계형 모델에서 외래 키는 후보 키를 참조해야하며, 둘 다 선언해야합니다. 그러나 SQL에서 UNIQUE는 수퍼 키를 선언하고 FOREIGN KEY는 외부 슈퍼 키를 선언합니다. (수퍼 키에 더 작은 수퍼 키가 포함되어 있지 않으면 후보 키입니다.) 외국 수퍼 키 선언의 대상에 명시 적으로 일치하는 고유 선언이있는 인체 공학적 중복을 선호 할 수 있습니다.그러나 이론적으로나 구현상의 타당성은 없습니다.