복붙노트

[SQL] 외래 키 열은 여러 개의 기본 키에 매핑

SQL

외래 키 열은 여러 개의 기본 키에 매핑

나는 세 개의 테이블이있는 데이터베이스가

메시지 - PK = messageID 설명 임시 보관함 - PK = DraftId 역사 - FK = RelatedItemId

역사 테이블은 하나의 외래 키를 가지고 메시지 및 임시 보관함에 두 개의 기본 키 중 하나에 매핑 [RelatedItemId].

이 관계의 이름이 있습니까?

그냥 나쁜 디자인인가?

이 관계를 설계하는 더 좋은 방법이 있나요?

다음은이 질문에 대한 CREATE TABLE 문은 다음과 같습니다

 CREATE TABLE [dbo].[History](
    [HistoryId] [uniqueidentifier] NOT NULL,
    [RelatedItemId] [uniqueidentifier] NULL,
    CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED ( [HistoryId] ASC )
 )

CREATE TABLE [dbo].[Messages](
    [MessageId] [uniqueidentifier] NOT NULL,
    CONSTRAINT [PK_Messages] PRIMARY KEY CLUSTERED (    [MessageId] ASC )
 )


CREATE TABLE [dbo].[Drafts](
    [DraftId] [uniqueidentifier] NOT NULL,
    CONSTRAINT [PK_Drafts] PRIMARY KEY CLUSTERED (  [DraftId] ASC )
)

해결법

  1. ==============================

    1.내가 찾은 가장 좋은 방법은 값에 통과했는지 여부를 반환하여 메시지 및 임시 PK 열 중 하나에 존재하는 함수를 만드는 것입니다. 그런 다음이 함수를 호출하는 역사에 열 제약 조건을 추가 할 수 있으며 통과되는 경우에만 (존재 즉) 삽입합니다.

    내가 찾은 가장 좋은 방법은 값에 통과했는지 여부를 반환하여 메시지 및 임시 PK 열 중 하나에 존재하는 함수를 만드는 것입니다. 그런 다음이 함수를 호출하는 역사에 열 제약 조건을 추가 할 수 있으며 통과되는 경우에만 (존재 즉) 삽입합니다.

    코드가 아닌 구문 분석 된 예를 추가 :

    (기능 is_related_there을 CREATE ) @value 고유 식별자 IN RETURNS의 TINYINT BEGIN IF (초안에서 선택 카운트 (DraftId) 여기서 DraftId @value = + = @value의 MessageID 메시지의 개수 (의 MessageID) 선택) THEN> 0 RETURN 1; 그밖에 RETURN 0; END IF; 종료;

    ALTER TABLE 역사 ADD 제약 CK_HistoryExists 검사 (is_related_there (RelatedItemId) = 1)

    그 실행을 희망하고 있습니다 롤

  2. ==============================

    2.간단한 설명에서 사용한 한 솔루션이라고합니다 : 다형성 협회 목적 : 참조 여러 부모 안티 패턴 결과 : 참조 무결성을 잃어버린를 사용하여 이중 목적 외래 키, 제 1 정규형 (원자 문제를) 위반을, 해결 방법 : 단순화 관계] 이 문제에 대한 자세한 정보를 제공합니다.

    간단한 설명에서 사용한 한 솔루션이라고합니다 : 다형성 협회 목적 : 참조 여러 부모 안티 패턴 결과 : 참조 무결성을 잃어버린를 사용하여 이중 목적 외래 키, 제 1 정규형 (원자 문제를) 위반을, 해결 방법 : 단순화 관계] 이 문제에 대한 자세한 정보를 제공합니다.

    BOTW는 공통의 슈퍼 테이블이 당신을 도울 것입니다 만들기 :

  3. ==============================

    3.거기에 제가 알고 아무 표준 이름은 없다,하지만 난 용어는 "일반적인 FKS"또는 "내부 플랫폼 효과"를 사용하는 사람들을 들었습니다.

    거기에 제가 알고 아무 표준 이름은 없다,하지만 난 용어는 "일반적인 FKS"또는 "내부 플랫폼 효과"를 사용하는 사람들을 들었습니다.

    예.

    그 이유는 외부 키를 선언하지 못하도록, 따라서 직접 참조 무결성을 시행에서 DBMS를 방지 할 수 있습니다. 따라서 당신은 놀라 울 정도로 어려운 필수 코드, 저점을 시행해야합니다.

    예.

    각 참조 된 테이블에 대해 별도의 FOREIGN KEY를 작성합니다. 그들이 NULL-수 있는지 확인하지만, 정확히 그 중 하나가 NULL이 아닌이 CHECK 제약 조건을 통해, 있는지 확인합니다.

    또한, 상속를보십시오.

  4. from https://stackoverflow.com/questions/22177776/foreign-key-column-mapped-to-multiple-primary-keys by cc-by-sa and MIT license