문제

내 SQL 데이터베이스 (Firebird)에 이름이 붙은 테이블이 있습니다. TTRANSACTION. 두 개의 열이 포함되어 있습니다. senderfk 그리고 수신기. 세 개의 다른 테이블이 있습니다. tbufferstock, tfacility 그리고 toutsidelocation.

발신자 또는 수신기는 버퍼 스톡, 우리 자신의 시설 또는 외부 위치 일 수 있습니다.

내 문제는 내가 어떻게 놔두는 방법을 모른다는 것입니다 senderfk 또는 수신기 오른쪽 테이블을 참조하십시오.

나는 신분증이있는 발신자와 3 개의 가능한 발신자 사이의 새로운 테이블, 테이블의 1과 3 사이의 숫자 와이 테이블 내에서 참조 된 ID를 생각했지만 실제로는 문제를 해결하지 못합니다. 어떤 아이디어?

노버트

도움이 되었습니까?

해결책

당신이하려는 일은 SQL로 할 수 없습니다. 단일 FK로 최대 3 개의 다른 테이블을 참조 할 수 없습니다.

당신이해야 할 일은 다음과 같습니다.

  • 추가 열을 만듭니다 senderBufferstockFK, senderFacilityFK, 그리고 senderOutsideLocationFK
  • 해당 테이블에 연결하십시오
  • 메인 테이블에 확인 제약 (지원되는 경우) 또는 트리거 또는 다른 메커니즘이 있어야이 세 가지 중 하나만 주어진 시간에 값을 갖도록하십시오.

이는 주어진 시간에 3 개의 "FK"열 중 하나만 값을 가질 수 있지만 각 FK 열은 특정 테이블에 대한 특정 FK입니다.

당신은 이것을 당신이 말하는 테이블에 직접 넣을 수 있거나, 이것을 별도의 테이블로 외부화하고 메인 테이블에서 "중개자"테이블을 참조 할 수 있으며, 거기 에서이 3 개의 FK가 있습니다.

YourTable.SenderFK --> Intermediary.PK
    Intermediary.SenderBufferstockFK --> tBufferstock.ID
    Intermediary.SenderFacilityFK --> tFacility.ID
    Intermediary.SenderOutsideLocationFK --> tOutsideLocation.ID

아니면 FK 관련성을 떨어 뜨릴 수는 있지만 확실히 아니다 좋은 아이디어!

마크

다른 팁

다음 스키마를 시도하십시오.

tSenderReceiver (type INT, id INT, PRIMARY KEY (type, id))

tTransaction (id INT PRIMARY KEY, senderType INT, senderId INT, receiverType INT, receiverID INT,
      FOREIGN KEY (senderType, senderID) REFERENCES tSenderReceiver,
      FOREIGN KEY (receiverType, receiverID) REFERENCES tSenderReceiver
)

tBufferStock (type INT, id INT,
      CHECK (type = 1),
      PRIMARY KEY (type, id),
      FOREIGN KEY (type, id) REFERENCES tSenderReceiver
)

tFacility (type INT, id INT,
      CHECK (type = 2),
      PRIMARY KEY (type, id),
      FOREIGN KEY (type, id) REFERENCES tSenderReceiver
)

tOutsideLocation (type INT, id INT,
      CHECK (type = 3),
      PRIMARY KEY (type, id),
      FOREIGN KEY (type, id) REFERENCES tSenderReceiver
)

SQL은 "표 X 의이 열 또는 표 Y의 해당 열"형식의 외래 키를 지원하지 않습니다. 당신은 할 수 있습니다 :

  1. 3 개의 가능한 외국 키 테이블이 하나로 결합되도록 데이터베이스를 리팩터링하십시오. 해당 테이블의 구조가 동일하거나 매우 유사한 경우 확실히 적합합니다. 비슷하지 않은 경우 여전히이 접근법을 취하고 다양한 정보를 보유하기 위해 TCounterParty에 연결된 세 개의 다른 테이블을 사용할 수 있습니다.

  2. 데이터베이스에서 지원하는 경우 외국 키에서 외국 키에서 트리거로 이동하십시오.

발신자에는 3 개의 열, 수신기에는 3 개의 열을 사용할 수 없습니까? 따라서 BuffersenderFK, FacilitySenderFK 및 FacilitySenderFK가 있습니다. 단일 트랜잭션의 경우 1 개의 열을 사용할 수 있고 다른 두 개는 NULL입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top