【发布时间】:2014-12-22 12:40:22
【问题描述】:
我有一个表ASSETS,其结构如下所示:
----------------------------------------------------
ID (PK) | DESCRIPTION | TYPE | Do- | Do+ | Dx- | Dx+
----------------------------------------------------
TYPE 列有一个外键,可能的值为SECURITY 或CURRENCY(即FX),我还有两个表:@987654327 @(例如、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 中还检查如果为SECURITIES.ID 引用ASSETS.TYPE 是SECURITY?
我想我可以编写触发器来检查ASSETS.TYPE 的值,但我现在正在寻找另一种解决方案(如果可能的话,当然)。
如果有更好的方法来做想做的事情(作为更好的数据库设计),请分享你的想法。
附注我想这是一个很常见的问题,所以如果在这个网络上有关于它的文章或类似的问题或一些一般案例解决方案,请随时分享。
【问题讨论】:
-
查看我的回答here。 (这个特定问题令人困惑地部分在其原始文本中没有学生表(您的 ASSESTS_DATA),但在其编辑图中有一个。)您的第一个设计就像我建议的那个(相对简单)(第一组项目符号),而您的可以按照我的建议进行修改/检查(第二组项目符号)
-
@philipxy :正如我已经标记了我的问题,FireBird。
-
乍一看,将证券和货币仅视为两种资产对我来说似乎很奇怪。一个(安全)是具有价值的东西——无论是建筑物,仅仅是债务证明或其他任何东西——而另一个(货币)只是一个计量单位。我宁愿将证券和 Money 结合起来,Money 是不同货币的现金,不同银行账户中的钱等。
-
@Thorsten Kettner : FX 和 Securities 具有几乎相同的一组属性,如上图所示,在寻找投资组合等过程中成本或初始(+ 调整后的初始)和最低利润率,它们被视为资产,而不是金钱或证券。
标签: sql database database-design schema polymorphic-associations