Database design 数据库设计:多个潜在标识符

Database design 数据库设计:多个潜在标识符,database-design,Database Design,创建基金或资产表时,我经常遇到相同的问题:并非所有资产都具有相同的标识符 例如:70%的人有一个ISIN,有些人有彭博社代码,有些人两者都有,有些人只有一个来自本地会计包的AccountingID,等等 通常情况下,我会给该表一个代理PK,以及所有可能标识符的不同字段(Bloomberg、ISIN、AccoutingID,…) 我曾经继承过这样一个数据库,其中开发人员将备用键迁移到子表[Identifiers],因为他事先不知道每个可能的备用键 此标识符表如下所示: AssetID(代理项)

创建
基金
资产
表时,我经常遇到相同的问题:并非所有
资产
都具有相同的标识符

例如:70%的人有一个
ISIN
,有些人有彭博社代码,有些人两者都有,有些人只有一个来自本地会计包的
AccountingID
,等等

通常情况下,我会给该表一个代理PK,以及所有可能标识符的不同字段(
Bloomberg、ISIN、AccoutingID
,…)

我曾经继承过这样一个数据库,其中开发人员将备用键迁移到子表[Identifiers],因为他事先不知道每个可能的备用键

此标识符表如下所示:

  • AssetID
    (代理项)
  • 标识类型
    (例如:ISIN)
  • IdValue
最佳解决方案是什么?


我认为第一个(单表)是最好的,因为即使我冒着有几个空值的风险,ISIN是一种ISIN,是
基金的定义良好的属性。它取决于您的需要,但第二种方法通常更灵活,因为您可以提供一个合理的界面来插入新的“标识符”记录,而不需要更改数据库模式

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


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

我会使用单表,因为标识符表方法对idValue的数据类型进行假设。如果您得到了使用guid而不是int的新内容,该怎么办


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

+1用于将来的校对。我从不相信外部标识符是主键。如果其他人控制了这些价值观,那么他们就没有动力让你的系统保持稳定。隔离多个外部标识符可以方便、一致地检索,同时为将来的更改保持灵活性。是的,我完全同意,将标识符放入相关实体中所描述的非正常类型可能只有在您知道它不会更改的情况下才应使用,或与实体的单一关系。@Joel Brown:解决方案1(单表)并不意味着使用外部标识符作为主键!我提到过使用代理PK。@iDevlop-理解,但是外部标识符与PK一样危险的东西-你无法控制它们-也使得它们作为实体的专用属性具有风险。这就是为什么像您这样的情况下,存在基于外部标识符的多个候选密钥,这使我成为EAV的一个非常好的候选。