programing

외부 키가 null일 수 있습니까?

closeapi 2023. 10. 8. 09:54
반응형

외부 키가 null일 수 있습니까?

가 .Sale와 두 다.Vehicle_ID그리고.Piece_ID를 들어 한다면.Vehicle_ID외국 열쇠로서 그러나 그렇지는Piece_ID을 .NULL 에 수 ?Piece_ID 수 null 가입니까?아니면 이 일을 할 수 있는 방법이 있습니까?

감사해요.

기본 키의 열(또는 열)은 NOT NULL이어야 합니다. 레코드는 NULL로 고유하게 식별될 수 없으므로 외부 키의 참조된 끝에 있는 ID 열은 NOT NULL로 정의되어야 합니다.

그러나 외부 키 관계가 선택 사항이 되는 것은 정당한 설계 결정이며, 이를 나타내는 방법은 키의 참조 끝을 선택 사항으로 만드는 것, 즉 NULL을 허용하는 것입니다.

데이터 모델링 용어에서 설명한 것은 (단순) 호입니다. "표 ... 두 개 이상의 외래 키가 있는 테이블로, 하나의 키 이 아닐 수 있습니다입니다." 는 완벽하게 표로 하는 강력한 .논리적 모델링에서 호는 완벽하게 수용 가능하지만, 호를 별도의 표로 구현하는 것에 찬성하는 강력한 의견이 있습니다.당신의 시나리오에서 그것은 일반적인 것이 될 것입니다.Sale + 두의 하위 블 +블,VehicleSale그리고.PieceSale.

별도의 테이블 구현의 장점은 다음과 같습니다.

  • 외산 키 제약을 시행하기가 더 용이함.
  • 부품 판매에 적용되지 않는 차량 판매와 관련된 추가 열을 더 쉽게 추가할 수 있습니다.
  • 추가적인 하위 유형으로 모델을 확장하기 더 쉽습니다.
  • 애플리케이션 개발을 단순화할 수 있는 보다 명확한 데이터 모델.

그러나 장점이 모두 일방적인 것은 아닙니다.를만을 꽤,Sale는 A됩니다에 됩니다.VehicleSale아니면.PieceSale,건Sale 아동 기록이 실제로는 꽤나 껄끄러워졌을 겁니다

그래서 배타적 호를 잘못 알고 있다는 조언이 지배적이고, 일반적으로 좋은 조언입니다.하지만 그것은 몇몇 사람들이 말하는 것처럼 명확하지 않습니다.

답변:

예, 이렇게 하면 됩니다. FK 자체를 NULL로 설정할 수 있지만, 그 중 하나에 NULL이 아닌 값이 포함되도록 CHECK를 추가합니다.

정교화:

FK는 NULL-able일 수 있으며, 이는 1..0:N 관계를 모델링합니다.즉, "자녀" 행은 "부모" 행을 가질 수 있지만 반드시 있어야 하는 것은 아닙니다.

NOT NULL 외부 키는 1:N 관계를 모델링합니다.다시 말해서, 모든 아이들은 부모가 있어야만 합니다.

FK가 복합적이고1 필드 중 적어도 하나가 NULL이 가능한 경우 NULL 값과 NULL이 아닌 값의 혼합이 특수한 방식으로 처리됩니다.

  • FK가 MATCH FULL이면 모든 값이 NULL이거나 모든 값이 NULL이 아니며 일부 상위 행과 일치해야 합니다.
  • FK가 MATCH PARIAL이면 NULL이 아닌 값만 일부 상위 행과 일치해야 합니다(NULL은 무시됨).
  • FK가 MATCH SIMPL이면 모든 값이 NULL이 아니며 일부 상위 행과 일치해야 하거나 NULL 값이 하나 이상 있습니다(이 경우 NULL이 아닌 값은 일치할 필요가 없습니다).

대부분의 DBMS는 기본적으로 MATCH SIMple(MS Access를 제외하고)로 설정되어 있으며 대부분의 DBMS는 기본값 외에는 아무것도 지원하지 않습니다.


1 여기에 없는 것 - 단지 완성을 위해 언급하는 것입니다.

"외산 열쇠 독점"을 의미하는 바에 따라 차량과 부품을 판매 가능한 품목이라고 부르는 더 큰 슈퍼클래스의 두 가지 하위 클래스로 생각할 수 있습니다.

클래스 테이블 상속이라는 설계 패턴을 사용하면 슈퍼 클래스에 대해 하나씩 세 개의 테이블이 있고 각 하위 클래스 테이블에 대해 하나씩 있습니다.또한 "공유 기본 키"라는 설계를 사용하는 경우 세 개의 테이블에 모두 동일한 기본 키를 사용할 수 있습니다.

이렇게 하면 Sales 테이블에 Saleable_이라는 하나의 외국어 키를 가질 수 있습니다.아이템_Id, 세일러블 참조_항목 테이블과 경우에 따라 Vehicle 또는 Piece 테이블도 있습니다.이것은 기존의 디자인보다 당신에게 더 효과적일 수 있습니다.

자세한 내용은 Google "class table inheritance" 및 "shared primary key"를 참조하십시오.

만약 당신이 null 외국 키를 가지고 있다면 오라클은 불평하지 말아야 합니다.

실수를 하고 있었나요?

언급URL : https://stackoverflow.com/questions/14022750/can-foreign-key-be-null

반응형