基于数据结构设计数据库

时间:2009-04-01 04:06:26

标签: database-design data-structures

我的数据结构如下:

typedef struct tagSUB_DATA
{
    double measuredValue;
    double standardDeviation;
    double calculatedValue;
    double weightedError;

} SUB_DATA;

typedef struct tagALL_THE_DATA
{
    int aNumber;
    double aDouble;
    SUB_DATA measurements1;
    SUB_DATA measurements2;

} ALL_THE_DATA;

我需要存储在关系数据库中。

我的查询涉及两个字段measurements1measurements2。显然,它们是相同的类型,所以我的第一个想法是“让我们创建一个SUB_DATA表并在它们之间创建一个外键链接”。

Table: ALL_THE_DATA
Field: ID (int, Primary Key)
Field: aNumber (int)
Field: aDouble (double)
Field: measurements1 (int, Foreign Key referencing SUB_DATA)
Field: measurements2 (int, Foreign Key referincing SUB_DATA)

Table: SUB_DATA
Field: ID (int, Primary Key)
Field: measuredValue (double)
Field: standardDeviation (double)
Field: calculatedValue (double)
Field: weightedError (double)

但是,数据的实际上下文是measurements1measurements2是不同事物的测量值(比方说,苹果和 oranges 火箭),两者都发生需要测量值,标准偏差等。然后,将测量的苹果和测量火箭的数据存储在同一个表中仍然是合适的,即使它们使用相同的数据,或者设计它是否更为谨慎火箭和苹果有自己的(设计相同的)桌子吗?

Table: ALL_THE_DATA
Field: ID (int, Primary Key)
Field: aNumber (int)
Field: aDouble (double)
Field: appleMeasurements (int, Foreign Key referencing APPLE_MEASUREMENTS)
Field: rocketMeasurements (int, Foreign Key referencing ROCKET_MEASUREMENTS)

Table: APPLE_MEASUREMENTS
Field: ID (int, Primary Key)
Field: measuredValue (double)
Field: standardDeviation (double)
Field: calculatedValue (double)
Field: weightedError (double)

Table: ROCKET_MEASUREMENTS
Field: ID (int, Primary Key)
Field: measuredValue (double)
Field: standardDeviation (double)
Field: calculatedValue (double)
Field: weightedError (double)

您认为这两种解决方案中哪一种最好?第一个似乎不那么冗余,但可能有更大的潜力导致数据不一致。或许还有比我想象的更好的方法来解决这个问题?

干杯!

(请原谅我的Apples / Rockets伪数据 - 我不能在这里真正发布实际代码)

额外信息:
在这种情况下,我们可以肯定火箭和苹果以后不会改变他们的领域,所以我不太担心“如果火箭或苹果中的田地后来发生变化会怎么样”。

3 个答案:

答案 0 :(得分:1)

如果您的SUB_DATA确实是苹果和火箭(以及苹果和火箭队),那么它们都是相同数据结构的实例可能是一个设计问题,可能会使您的代码使用风险更高。您可能希望使用子类(即使结构没有不同),只是为了区分类型。

如果将两者混合到同一个表中,则存在想要更改其中一个结构而不是另一个结构的风险,就像使用同一个类时一样。如果这是未来的可能性,那么显然不要在同一个表中共享它们。或者,如果他们共享某些共同点并且将来可能存在差异,则可以使用多个表。

这可能听起来像是很多工作,但是一个体面的对象关系映射(例如,Hibernate)实际上可以很好地处理类层次结构并分割出需要拆分的内容。

但无论你做什么,在你100%确定什么是共同的以及可能会发生什么变化之前,不要启动你的数据库。

答案 1 :(得分:0)

你总是有两个测量值吗?如果是这样,你根本不需要打破表(只有一个表有两组用于两次测量的列)。

Table: ALL_THE_DATA
Field: ID (int, Primary Key)
Field: aNumber (int)
Field: aDouble (double)
Field: measuredValue1 (double)
Field: standardDeviation1 (double)
Field: calculatedValue1 (double)
Field: weightedError1 (double)
Field: measuredValue2 (double)
Field: standardDeviation2 (double)
Field: calculatedValue2 (double)
Field: weightedError2 (double)

对于结构之间的非可选1:1关系,将子结构嵌入父表是可接受的设计和有效。

这使得添加第三种测量类型变得更加困难。

答案 2 :(得分:-1)

为什么不创建这两个表,但让它们从公共测量表继承?