我SQL数据库(火鸟)具有一个表叫 tTransaction.它包含两栏, senderFKreceiverFK.还有其他三个表, tBufferStock, tFacilitytOutsideLocation.

发送者或接收器可以是一个缓冲储存,我们自己的设施或一个位置外。

我的问题是,我不知道如何让 senderFKreceiverFK 准的权利表。

我已经想到了一个新的表之间的发件人和三个可能的发件人和身份证件,数量之间1和3对于发表和引用的ID在这个表格,但实际上这并不解决问题。任何想法?

Norbert

有帮助吗?

解决方案

什么你想要做不可能在SQL。你不能引用了三种不同的表用一个单一的FK。

你需要做的是:

  • 创造额外的列 senderBufferstockFK, senderFacilityFK, , senderOutsideLocationFK
  • 连那些适当的表格
  • 有一个检查约束(如果支)或一个触发器或其他一些机构在您的主表,以确保只有一个,这三个有价值在任何给定的时间

这将意味着,在任何给定的时间,只有三个"fk"列可能具有价值,但每个FK列将是一个具体FK到一个具体的表。

你可以把这个直接进入表你说的,或者你可以具体化这个为一个单独的表格,并从主要表就参考,"中介"表格,并从那里有这三个FK

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

或者你可以放下FK关系,但是,绝对是 一个好主意!

Marc

其他提示

尝试以下架构:

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. 重构数据库,以便将所有三个可能的外键表合并为一个,可能称为tCounterParty。如果这些表的结构相同或非常相似,这绝对是合适的。如果它们不相似,您仍然可以采用这种方法,并使用与tCounterParty相关联的其他三个表来保存不同的信息。

  2. 如果您的数据库支持,则将您的参照完整性从外键移动到触发器中。

你不能使用3列作为发送者而3作为接收者吗?所以你将拥有bufferSenderFK,facilitySenderFK和facilitySenderFK。对于单个事务,可以使用1列,其他两个将为null。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top