When creating a Funds or Assets table, I am often confronted with the same problem: not all Assets have the same identifier.
Eg: 70% have an ISIN, some have a bloomberg code, some have both, some only have an AccountingID coming from the local accounting package, and so on.
Generally I end up by giving that table a surrogate PK, plus distinct fields for all the possible identifiers (Bloomberg, ISIN, AccoutingID,..)
I once inherited such a database where the developer had migrated the alternate keys to a child table [Identifiers], based on the fact that he did not know in advance every possible alternate key.
This Identifiers table looked like this:
AssetID(the surrogate one)IdentifierType(e.g: ISIN)IdValue
What is the best solution ?
I think the first (single table) is best because, even if I risk having a few Nulls, an ISIN is an ISIN and is well defined attribute of the Fund.
I would do single table because the Identifiers table method makes assumptions about the datatype of the idValue. What if you get something new that uses a guid rather than an int?
You could still do a separate column for each possible asset ID and keep the data about the assets in a separate table that keys off the surrogate ID. The approach you take will depend mainly on how you will use the data, and how often you might add new asset ID types.