数据库设计:多个可能的标识符

4
创建一个基金资产表时,我经常遇到同样的问题:并非所有的资产都有相同的标识符。
例如:70%的资产具有ISIN,一些具有bloomberg代码,一些同时具有两者,一些仅具有来自本地会计软件的AccountingID等。
通常我最终会为该表分配一个代理主键,并为所有可能的标识符(Bloomberg,ISIN,AccoutingID等)提供不同的字段。
我曾经继承过这样的数据库,其中开发人员将备用键迁移到了一个子表[Identifiers]中,因为他事先不知道每个可能的备用键是什么。
这个Identifiers表看起来像这样:
  • AssetID(代理主键)
  • IdentifierType(例如:ISIN)
  • IdValue
什么是最好的解决方案? 我认为第一种(单一表)是最好的,因为即使我冒着一些空值的风险,ISIN也是ISIN,并且是Fund的定义良好属性。
2个回答

1

这有点取决于你的需求,但第二种方法通常更灵活,因为您可以提供一个合理的接口来插入新的“标识符”记录,而无需更改数据库架构。

如果您不知道可能存在多少标识符,或者知道需要随时间添加更多标识符,则通常会使用此选项。

前一种方法在撰写查询方面更简单,如果标识符是静态的,则可能最容易使用。


+1 以保证未来兼容性。我从不相信外部标识符作为主键。如果其他人控制它们,那么他们没有动机通过保持值不变来保持您的系统稳定。隔离多个外部标识符可以实现轻松、一致的检索,同时保持未来更改的灵活性。 - Joel Brown
是的,我完全同意,将标识符与相关实体放在一起描述的反规范化类型可能只适用于您知道它不会更改或与实体存在单一关系的情况。 - dougajmcdonald
@Joel Brown:方案1(单个表)并不意味着要使用外部标识作为主键!我提到了使用代理主键。 - iDevlop
@iDevlop - 我明白,但是将外部标识符作为主键的风险在于你无法控制它们,这也使它们作为实体专用属性的风险增加。这就是为什么像你这样有多个基于外部标识符的候选键的情况,我认为使用EAV是一个相当不错的选择。 - Joel Brown

0

我会选择单表,因为Identifiers表方法对idValue的数据类型做出了假设。如果你得到一个使用guid而不是int的新东西怎么办?

你仍然可以为每个可能的资产ID设置单独的列,并将有关资产的数据保存在一个单独的表中,该表以代理ID为键。你采取的方法主要取决于您如何使用数据以及您可能添加新资产ID类型的频率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接