我将一些模拟的结果存储在数据库中。模拟由其ExperimentID
唯一标识。每个模拟运行一定数量的模拟周期,通过CycleCount
递增。所以在第0周期,我们得到了一些数据:
ExperimentID, CycleCount, data1, data2
0, 0, 100, 200
然后在第1周期,我们获得更多数据:
ExperimentID, CycleCount, data1, data2
0, 0, 100, 200
0, 1, 150, 250
因此,data1
和data2
位于各自的表中,以确保数据库已规范化。此处的复合键由ExperimentID,CycleCount
组成。我可以使用CycleCount
来建立data1
和data2
之间的关系,将其用作外键吗?还有其他方法可以做到这一点吗?
答案 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