我有一个表ASSETS,它具有如下所示的结构:

----------------------------------------------------
ID (PK) | DESCRIPTION | TYPE | Do- | Do+ | Dx- | Dx+
----------------------------------------------------
TYPE列具有外键,可能的值为SECURITYCURRENCY(即FX),另外还有两个表:CURRENCIES(例如EURRUBUSD):
--------------------------------------------------------
ID (PK)| FROM (FK ASSETS.ID) | TO (FK ASSETS.ID) | VALUE
--------------------------------------------------------

SECURITIES(例如MTSGAZPVTB):
----------------------------------------------------------
ID (PK)(FK ASSETS.ID)| CURRENCY (PK)(FK ASSETS.ID) | VALUE
----------------------------------------------------------

我如何进行约束,不仅要像CURRENCIES.FROMCURRENCIES.TOSECURITIES.CURRENCY中的外键一样,还要检查引用的ASSETS.TYPE是否为CURRENCY,并且在SECURITIES中还要检查引用的ASSETS.TYPE是否为SECURITIES.ID

我想我可以编写触发器来检查SECURITY值,但是我现在正在寻找另一种解决方案(当然,如果可能的话)。

如果有更好的方法来做一件想要的事情(作为更好的数据库设计),请分享您的想法。

P.S.我想这是一个非常普遍的问题,因此,如果在此网络上有关于此问题的文章或类似问题或某些一般情况的解决方案,可以随时分享。

最佳答案

原始问题的答案是使用其他CHECK约束,例如:

CREATE TABLE CURRENCIES (
   ...
   CONSTRAINT c_asset_from CHECK(exists(select 1 from ASSETS a where a.id = from and a.type = 'CURRENCY'))
);

对于TO字段和SECURITIES字段中的CURRENCY字段具有类似的约束。
但是我认为您的新设计(为securitycurrency分别使用FK)是更好的设计。

10-08 20:04