我有一个表ASSETS
,它具有如下所示的结构:
----------------------------------------------------
ID (PK) | DESCRIPTION | TYPE | Do- | Do+ | Dx- | Dx+
----------------------------------------------------
TYPE
列具有外键,可能的值为SECURITY
或CURRENCY
(即FX),另外还有两个表:CURRENCIES
(例如EUR
,RUB
或USD
):--------------------------------------------------------
ID (PK)| FROM (FK ASSETS.ID) | TO (FK ASSETS.ID) | VALUE
--------------------------------------------------------
和
SECURITIES
(例如MTS
,GAZP
或VTB
):----------------------------------------------------------
ID (PK)(FK ASSETS.ID)| CURRENCY (PK)(FK ASSETS.ID) | VALUE
----------------------------------------------------------
我如何进行约束,不仅要像
CURRENCIES.FROM
,CURRENCIES.TO
和SECURITIES.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
字段具有类似的约束。但是我认为您的新设计(为
security
和currency
分别使用FK)是更好的设计。