简单的DB设计问题 - 测量集

时间:2009-10-12 00:00:11

标签: sql database-design

我有多套测量。每个集合中都有多个值。数据目前在电子表格中,我想将其移至真实数据库。

在电子表格中,每组测量都在其自己的列中,即

 1  |  2  |  3  | ...
0.5 | 0.7 | 0.2 | ...
0.3 | 0.6 | 0.4 | ...

等等。如果我有10个数据集,每个数据集有8个数据集,那么我最终得到一个8x10表,其中包含80个值。

为了使数据库处于正常形式,我知道它应该被设计为为每个新集添加行而不是列。我认为这意味着表格应该像(MySQL语法)那样排列:

create table Measurement(
    int id not null auto_increment,
    primary key(id)
);

create table Measurement_Data(
    int id not null auto_increment,
    double value not null,
    int measurement,
    primary key(id),
    constraint fk_data foreign key(measurement) references Measurement(id)
}

这是对的吗?结果是一个只包含一个自动生成列的表(当然我可以在以后添加更多内容)和另一个将每个数据集存储为“纵向”的表,这意味着在给定上述值的情况下,该表将有800行。这是处理这个问题的正确方法吗?这也意味着我需要添加数据,我需要在Measurement表中插入一行,获取其分配的pk,然后将所有新行添加到Measurement_Data表中,对吗?

我感谢任何建议,

3 个答案:

答案 0 :(得分:2)

对于这个简单的单表解决方案怎么样?

CREATE TABLE measurements
(
    id INT AUTO_INCREMENT,
    dataSetId INT,
    measurementNumber INT,
    measurementValue DOUBLE,
    CONSTRAINT UNIQUE (dataSetId, measurementNumber)
);

除非你的问题比你描述的更复杂,否则这应该足够了。

答案 1 :(得分:1)

一般来说,你的计划听起来不错。我的调整与其他帖子略有不同:

create table Measurement(
    int  MeasurementId  not null  auto_increment,
    primary key(id)
);

create table MeasurementData(
    int  MeasurementId  not null,
    int  MeasurementDataEntry  not null,
    double  value  not null,
    primary key(MeasurementId, MeasurementDataEntry),
    constraint fk_data foreign key(MeasurementId) references Measurement(MeasurementId)
)

根据LukLed,MeasrementDataEnry将是一个序数值,从1开始,并为该MeasurementId的每个“数据条目”递增1。复合主键应该足够了,正如所述的问题所示,我认为在MeasurementData上没有真正需要额外的代理键。

确保您的解决方案足以解决您的问题集。两个表中是否都需要其他列(测量类型,发生时,谁是dunnit)?每次测量的数据读数总是相同,还是可以变化?如果是这样,您是否需要存储在父表中的数据测量数量(以便更快地检索,以及冗余成本?)您是否需要更新数据条目,这会使订单陷入困境?它看起来有点稀疏,可能还有其他业务规则需要考虑在路上。

答案 2 :(得分:0)

首先,我将'测量'列名称更改为“measurement-id”,因为此名称不直观。您还可以在Measurement-Data表中添加序号,以了解测量的顺序,并在measurement-id和ordinal-numer上添加唯一。通过添加序数数字您还可以使用检查约束限制每个测试中的测量次数。