我的数据结构如下:
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伪数据 - 我不能在这里真正发布实际代码)
额外信息:
在这种情况下,我们可以肯定火箭和苹果以后不会改变他们的领域,所以我不太担心“如果火箭或苹果中的田地后来发生变化会怎么样”。
答案 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)
为什么不创建这两个表,但让它们从公共测量表继承?