一个或多个表

时间:2013-10-17 08:30:02

标签: ruby-on-rails database-design polymorphic-associations single-table-inheritance

我有不同类型的测量。它们彼此无关。我们说ABC。它们中的所有三个具有相同的结构ID (integer)value (float)experiment_id (integer)(与实验表的关系)。

我不知道存储此信息的最佳方式。

A)使用三个表(ABC)是否更好?

B)或者最好将所有这些内容存储在一个名为measurements的表中,并添加一个名为measurement_type的其他列来存储AB的信息,或C(包括索引)。

在我的应用程序中,我希望有三个名为ABC的模型。

解决方案应该很快,因为对于每种测量类型,一天可能有数亿甚至数十亿条目。此外,有一天可能会有衡量类型DE...Z

顺便说一下,我正在使用Oracle Enterprise数据库。

2 个答案:

答案 0 :(得分:3)

根据您的评论,并假设您专注于查询性能(而不是INSERT性能),看起来您需要一个类似于此的模型:

enter image description here

MEASUREMENT表上使用ORGANIZATION INDEX(也请考虑使用COMPRESS子句,因为会有很多行共享相同的前导EXPERIMENT_ID。)

索引I1按顺序包含:{FEATURE_ID, EXPERIMENT_ID, MEASUREMENT_TYPE, VALUE}。考虑使用COMPRESS子句,因为会有许多行共享相同的前导FEATURE_ID。)

这给了我们2个B树:

  1. B-Tree“位于PK下方,即索引组织表本身。
  2. B-Tree“位于”索引I1下面。
  3. EXPERIMENT_ID B-Tree中的单个索引范围扫描和 no 表堆访问(堆不存在)可以满足PK上的查询。 PK B-Tree自然地将属于相同实验的行物理地靠近在一起,因此I / O被最小化。

    FEATURE_ID的查询也可以通过单一范围扫描(在I1 B树中)来满足。 I1covering索引,因此无需对PK B-Tree进行双重查找。 I1 B-Tree自然地将属于相同特征的行物理地靠近在一起,因此I / O被最小化。

    我不愿意在MEASUREMENT上对MEASUREMENT_TYPE表进行水平分区,除非您对代表性的数据量进行了测量,并得出结论,它提供了更符合您需求的性能权衡。

答案 1 :(得分:0)

由于测量类型可以增长而不限于A,B和C,因此建议使用选项B),因为它在需要时支持其他测量类型。