我可以将主键的一部分用作外键吗?

时间:2015-09-30 21:46:23

标签: database database-design database-schema sql-server-2014

我将一些模拟的结果存储在数据库中。模拟由其ExperimentID唯一标识。每个模拟运行一定数量的模拟周期,通过CycleCount递增。所以在第0周期,我们得到了一些数据:

ExperimentID, CycleCount, data1, data2
0,            0,          100,   200

然后在第1周期,我们获得更多数据:

ExperimentID, CycleCount, data1, data2
0,            0,          100,   200
0,            1,          150,   250

因此,data1data2位于各自的表中,以确保数据库已规范化。此处的复合键由ExperimentID,CycleCount组成。我可以使用CycleCount来建立data1data2之间的关系,将其用作外键吗?还有其他方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

当您说“模拟由其ExperimentID唯一标识”时,您说有一个名为Experiments的表,其中此字段是主键。在Simulations表中,此值是Experiments表的外键,但它不能是此表的PK。该表包含模拟,每个实验可以有几个模拟。所以,是的,只要CycleCount在每个实验中都是唯一的,组合(ExperimentID,CycleCount)就可以为这个表提供出色的PK。

如果CycleCount只是一个递增值,那么将它作为外键是没有意义的。它只是指一个递增值表,它实际上没有对数据添加任何内容。

但是,如果每个周期都有固定含义,您可以创建一个这样的表:

Cycle  Name     Meaning
    0  Initial  This is the initial reading taken before...
    1  PreFlow  This is the first reading taken after the proper flow rate is established...
    2  MidFlow  This is the second reading taken in the middle of the flow...
    3  PostFlow This is the final reading taken after the flow has stopped...

然后将CycleCount作为此表的FK是有意义的。它定义了CycleCount的域,因此您不能拥有值8或17或0..3之外的任何值,并提供您可能希望在某些查询中显示的每个周期的其他信息。

如果不需要这样的表,则应在create table语句中使用检查约束显式限制域:

    CycleCount tinyint check( CycleCount between 0..3 )

被定义为PK的一部分将防止重复值用于相同的实验。

答案 1 :(得分:-1)

我认为这不是一个很好的规范化。 鉴于您可以拥有不同的实验ID,您绝对不能将CycleCount用作唯一标识符。 您还应该告诉我们可能的其他表格或有关您具体含义的详细信息""之间的关系。 data1和data2。 这也可能更适合dba.stackexchange