2009-10-12 37 views
2

我有多组度量。每个集合都有多个值。数据目前在电子表格中,我想将其移至真实的数据库。简单的数据库设计问题 - 度量集

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

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

等。如果我有10个数据集并且每个数据集都有8个测量数据,那么我就可以得到一个有80个数值的8x10表格。

为了将数据库置于正常形式,我知道它应该设计为每个新集合添加行而不是列。我认为这意味着这些表应该安排类似于(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表中,对吗?

我明白任何意见,

+0

尽管您想将Measurement_Data中的测量值作为外键进行编码(如果您的数据库支持),但听起来对我来说是正确的。 – 2009-10-12 00:11:01

回答

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递增。复合主键应该是足够的,就像我认为在MeasurementData上没有真正需要额外的代理键一样。

确保您的解决方案足以满足您的问题集。其他列是否需要在任何一个表中(测量的类型,何时发生,谁躲避)?每次测量的数据读数总是相同的,还是可以变化?如果是这样,你是否需要存储在父表中的数据量的数量(为了更快地检索,并且需要冗余的成本?)你是否需要更新数据条目,并且这会混淆命令?它看起来有点稀疏,并且可能还有其他业务规则需要考虑。

2

什么关于这一个简单的表解?

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

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

0

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