我有不同类型的测量。它们彼此无关。我们说A
,B
和C
。它们中的所有三个具有相同的结构ID (integer)
,value (float)
,experiment_id (integer)
(与实验表的关系)。
我不知道存储此信息的最佳方式。
A)使用三个表(A
,B
和C
)是否更好?
B)或者最好将所有这些内容存储在一个名为measurements
的表中,并添加一个名为measurement_type
的其他列来存储A
,B
的信息,或C
(包括索引)。
在我的应用程序中,我希望有三个名为A
,B
和C
的模型。
解决方案应该很快,因为对于每种测量类型,一天可能有数亿甚至数十亿条目。此外,有一天可能会有衡量类型D
,E
,...
,Z
。
顺便说一下,我正在使用Oracle Enterprise数据库。
答案 0 :(得分:3)
根据您的评论,并假设您专注于查询性能(而不是INSERT性能),看起来您需要一个类似于此的模型:
在MEASUREMENT
表上使用ORGANIZATION INDEX
(也请考虑使用COMPRESS
子句,因为会有很多行共享相同的前导EXPERIMENT_ID
。)
索引I1
按顺序包含:{FEATURE_ID, EXPERIMENT_ID, MEASUREMENT_TYPE, VALUE}
。考虑使用COMPRESS
子句,因为会有许多行共享相同的前导FEATURE_ID
。)
这给了我们2个B树:
PK
下方,即索引组织表本身。I1
下面。 EXPERIMENT_ID
B-Tree中的单个索引范围扫描和 no 表堆访问(堆不存在)可以满足PK
上的查询。 PK
B-Tree自然地将属于相同实验的行物理地靠近在一起,因此I / O被最小化。
FEATURE_ID
的查询也可以通过单一范围扫描(在I1
B树中)来满足。 I1
是covering索引,因此无需对PK
B-Tree进行双重查找。 I1
B-Tree自然地将属于相同特征的行物理地靠近在一起,因此I / O被最小化。
我不愿意在MEASUREMENT
上对MEASUREMENT_TYPE
表进行水平分区,除非您对代表性的数据量进行了测量,并得出结论,它提供了更符合您需求的性能权衡。
答案 1 :(得分:0)
由于测量类型可以增长而不限于A,B和C,因此建议使用选项B),因为它在需要时支持其他测量类型。