[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.내가 찾은 가장 좋은 방법은 값에 통과했는지 여부를 반환하여 메시지 및 임시 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.간단한 설명에서 사용한 한 솔루션이라고합니다 : 다형성 협회 목적 : 참조 여러 부모 안티 패턴 결과 : 참조 무결성을 잃어버린를 사용하여 이중 목적 외래 키, 제 1 정규형 (원자 문제를) 위반을, 해결 방법 : 단순화 관계] 이 문제에 대한 자세한 정보를 제공합니다.
간단한 설명에서 사용한 한 솔루션이라고합니다 : 다형성 협회 목적 : 참조 여러 부모 안티 패턴 결과 : 참조 무결성을 잃어버린를 사용하여 이중 목적 외래 키, 제 1 정규형 (원자 문제를) 위반을, 해결 방법 : 단순화 관계] 이 문제에 대한 자세한 정보를 제공합니다.
BOTW는 공통의 슈퍼 테이블이 당신을 도울 것입니다 만들기 :
-
==============================
3.거기에 제가 알고 아무 표준 이름은 없다,하지만 난 용어는 "일반적인 FKS"또는 "내부 플랫폼 효과"를 사용하는 사람들을 들었습니다.
거기에 제가 알고 아무 표준 이름은 없다,하지만 난 용어는 "일반적인 FKS"또는 "내부 플랫폼 효과"를 사용하는 사람들을 들었습니다.
예.
그 이유는 외부 키를 선언하지 못하도록, 따라서 직접 참조 무결성을 시행에서 DBMS를 방지 할 수 있습니다. 따라서 당신은 놀라 울 정도로 어려운 필수 코드, 저점을 시행해야합니다.
예.
각 참조 된 테이블에 대해 별도의 FOREIGN KEY를 작성합니다. 그들이 NULL-수 있는지 확인하지만, 정확히 그 중 하나가 NULL이 아닌이 CHECK 제약 조건을 통해, 있는지 확인합니다.
또한, 상속를보십시오.
from https://stackoverflow.com/questions/22177776/foreign-key-column-mapped-to-multiple-primary-keys by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 저자에 의해 표현 엔진 SQL 쿼리 항목 목록 (0) | 2020.07.16 |
---|---|
[SQL] 어떻게 내가 어디 절에 별칭을 사용합니까? [복제] (0) | 2020.07.15 |
[SQL] 중복 레코드를 삭제 (0) | 2020.07.15 |
[SQL] 어떻게 콤보 <모두 선택>에 대한 기능을 추가하려면 Microsoft Access 폼에서 (0) | 2020.07.15 |
[SQL] 어떻게 읽을 더 쉽게 잘 포맷 코드를 읽을 수있는 블록으로 SQL 문자열을 포맷하기 (0) | 2020.07.15 |