1

私のSQLデータベース(Firebird)には、tTransactionという名前のテーブルがあります。これには、 senderFKreceiverFKの2つの列が含まれています。他に、 tBufferStocktFacilitytOutsideLocationの3つのテーブルがあります。

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

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

送信者と、IDを持つ3つの可能な送信者の間に新しいテーブルを考えました。テーブルの番号は1〜3で、このテーブル内の参照IDですが、実際には問題は解決しません。何か案は?

Norbert

4

4 に答える 4

2

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

あなたがする必要があることは次のとおりです:

  • 追加の列、、、を作成senderBufferstockFKsenderFacilityFKます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関係を削除することもできますが、それは絶対に良い考えではありません。

マーク

于 2009-10-23T12:39:19.570 に答える
1

次のスキーマを試してください。

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
)
于 2009-10-23T12:46:06.593 に答える
1

SQLは、「テーブルXのこの列またはテーブルYのその列」の形式の外部キーをサポートしていません。あなたはできる:

  1. データベースをリファクタリングして、3つの可能な外部キーテーブルすべてが1つに結合されるようにします。これは、tCounterPartyと呼ばれることもあります。これらのテーブルの構造が同一または非常に類似している場合、これは間違いなく適切です。それらが類似していない場合でも、このアプローチを採用し、tCounterPartyにリンクされた他の3つのテーブルを使用して、さまざまな情報を保持できます。

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

于 2009-10-23T12:48:19.910 に答える
0

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

于 2009-10-23T12:43:27.473 に答える