【发布时间】:2009-04-01 04:06:25
【问题描述】:
我有一个类似这样的数据结构:
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;
我需要将其存储在关系数据库中。
我的查询涉及measurements1 和measurements2 这两个字段。显然,它们是同一类型,所以我的第一个想法是“让我们创建一个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)
但是,数据的实际上下文是这样的,measurements1 和 measurements2 是不同事物的测量值(比如说,苹果和 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 伪数据 - 我无法在此处发布实际代码)
额外信息:
在这种情况下,我们可以确定火箭和苹果以后不会改变它们的字段,所以我不太担心“如果火箭或苹果的字段稍后改变”的情况。
【问题讨论】:
标签: database-design data-structures