在 MS SQL 服务器中跨多个表共享基于相同列的复合外键

Sharing composite foreign key based on the same columns across multiple tables in MS SQL Server

我有多个 table 的数据库,其中包含有关不同工具(货币、基金、股票等)的信息。所有仪器都有 TypeId 字段,代表仪器的唯一键。我还有一个 table InstrumentMeta 用于收集所有以 (Type,Id) 作为主键的工具的统计信息。

  1. Instrument_1 - Type(int), Id(string), Values, ...
  2. Instrument_2 - Type(int), Id(string), Code, ...
  3. ...
  4. InstrumentMeta - Type(int), Id(string), PerformanceValue1, PerformanceValue2, PerformanceValue3

是否可以为 InstrumentMeta table 和所有 Instrument_ table 创建基于同一对 (Type, Id) 的外键?

简短的回答是"No!"这与复合键无关,对所有键都是如此。外键必须指定键引用的 ONE table。

但是,您必须有一个包含所有不同键值组合的 "master" table。据我所知,它可能是元 table,因为它必须包含所有 Type/Id 值。所以这是主table,所有"instrument_x" table都是子table。

子table包含引用回主table的FK。这是一个例子。

create table Meta(
    Type    varchar( 16 ) not null,
    ID      smallint not null,
    <other meta fields>,
    constraint PK_Meta primary key( Type, ID ),
    constraint CK_Meta_Type check( Type in( 'Currency', 'Fund', 'Equity' ))
);
create table Currencies(
    Type    varchar( 16 ) not null,
    ID      smallint not null,
    <other currency fields>,
    constraint PK_Currencies primary key( Type, ID ),
    constraint CK_Currencies_Type check( Type = 'Currency' ),
    constraint FK_Currencies_Meta foreign key( Type, ID )
        references Meta( Type, ID )
);
create table Funds(
    Type    varchar( 16 ) not null,
    ID      smallint not null,
    <other fund fields>,
    constraint PK_Funds primary key( Type, ID ),
    constraint CK_Funds_Type check( Type = 'Fund' ),
    constraint FK_Funds_Meta foreign key( Type, ID )
        references Meta( Type, ID )
);

等等。

此设计强制您在元 table 中输入 "Currency:42" 行,然后才能在货币 table 中创建 ID 42。但无论如何这可能是一个非常好的主意。