質問

My SQLデータベース(Firebird)には、 tTransaction という名前のテーブルがあります。これには、 senderFK receiverFK の2つの列が含まれています。他にも3つのテーブル、 tBufferStock tFacility 、および tOutsideLocation があります。

送信者または受信者は、バッファストック、自社施設、または外部の場所のいずれかです。

私の問題は、 senderFK または receiverFK に正しいテーブルを参照させる方法がわからないことです。

ID、テーブルの1〜3の番号、およびこのテーブル内の参照IDを持つ送信者と3人の送信者との間の新しいテーブルを考えましたが、実際には問題は解決しません。アイデアはありますか?

ノーベルト

役に立ちましたか?

解決

やろうとしていることはSQLではできません。 1つのFKで最大3つの異なるテーブルを参照することはできません。

必要なことは次のとおりです。

  • 追加の列を作成 senderBufferstockFK senderFacilityFK 、および senderOutsideLocationFK
  • それらを適切なテーブルに接続する
  • メインテーブルにチェック制約(サポートされている場合)またはトリガーまたはその他のメカニズムを用意して、これら3つのうちの1つだけが常に値を持っていることを確認します

これは、常に、3つの「fk」のうち1つだけを意味します。列には値を設定できますが、各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つの可能な外部キーテーブルがすべて1つに結合されるようにします(tCounterPartyと呼ばれることもあります)。これらのテーブルの構造が同一または非常に類似している場合、これは間違いなく適切です。それらが類似していない場合でも、このアプローチを取り、tCounterPartyにリンクされた3つの他のテーブルを使用して、さまざまな情報を保持できます。

  2. データベースでサポートされている場合、参照整合性を外部キーからトリガーに移動します。

送信者に3列、受信者に3列を使用できませんか?したがって、bufferSenderFK、facilitySenderFK、およびfacilitySenderFKがあります。単一のトランザクションの場合、1列を使用でき、他の2列はヌルになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top