在一列上指定外键和另一列的值

pot*_*hin 6 sql database schema database-design polymorphic-associations

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

----------------------------------------------------
ID (PK) | DESCRIPTION | TYPE | Do- | Do+ | Dx- | Dx+
----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

TYPE列具有外键,可能的值是SECURITYCURRENCY(即FX),还我有两个多个表:CURRENCIES(例如,EUR,RUBUSD):

--------------------------------------------------------
ID (PK)| FROM (FK ASSETS.ID) | TO (FK ASSETS.ID) | VALUE
--------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

SECURITIES(例如,MTS,GAZPVTB):

----------------------------------------------------------
ID (PK)(FK ASSETS.ID)| CURRENCY (PK)(FK ASSETS.ID) | VALUE
----------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我怎样才能让一个约束,不仅行为像外键CURRENCIES.FROM,CURRENCIES.TO并且SECURITIES.CURRENCY,还要检查是否指ASSETS.TYPECURRENCY,在SECURITIES 还检查是否指ASSETS.TYPESECURITIES.IDSECURITY

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

如果有更好的方法来做所需的事情(作为更好的数据库设计),请分享您的想法.

PS我想这是一个很常见的问题,所以如果有关于它的文章或在这个网络上提出的类似问题或一些一般情况解决方案,请随意分享.

ain*_*ain 4

回答您原来的问题是使用附加CHECK 约束,例如:

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

TO对于field 和 in SECURITIESfor CURRENCYfield也有类似的约束。
但我认为你的新设计,带有单独的FKsecuritycurrency是更好的设计。

  • 不同的数据库引擎支持不同的功能。该问题最初被标记为支持该问题的“FireBird”。我猜你使用的是 mySql ,但它没有 (2认同)