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列具有外键,可能的值是SECURITY或CURRENCY(即FX),还我有两个多个表:CURRENCIES(例如,EUR,RUB或USD):
--------------------------------------------------------
ID (PK)| FROM (FK ASSETS.ID) | TO (FK ASSETS.ID) | VALUE
--------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
和SECURITIES(例如,MTS,GAZP或VTB):
----------------------------------------------------------
ID (PK)(FK ASSETS.ID)| CURRENCY (PK)(FK ASSETS.ID) | VALUE
----------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我怎样才能让一个约束,不仅行为像外键CURRENCIES.FROM,CURRENCIES.TO并且SECURITIES.CURRENCY,还要检查是否指ASSETS.TYPE是CURRENCY,在SECURITIES 还检查是否指ASSETS.TYPE的SECURITIES.ID 是SECURITY?
我想我可以编写触发器来检查ASSETS.TYPE值,但我现在正在寻找另一种解决方案(当然,如果可能的话).
如果有更好的方法来做所需的事情(作为更好的数据库设计),请分享您的想法.
PS我想这是一个很常见的问题,所以如果有关于它的文章或在这个网络上提出的类似问题或一些一般情况解决方案,请随意分享.
回答您原来的问题是使用附加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也有类似的约束。
但我认为你的新设计,带有单独的FK和security,currency是更好的设计。
| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |