【问题标题】:One or multiple tables一张或多张桌子
【发布时间】:2013-10-17 08:30:02
【问题描述】:

我有不同类型的测量值。它们彼此不相关。假设ABC。它们三个都有相同的结构,ID (integer)value (float)experiment_id (integer)(与实验表有关)。

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

A) 使用三个表(ABC)会更好吗?

B) 或者最好将它们全部存储在一个名为measurements 的表中,并添加一个名为measurement_type 的附加列来存储ABC 的信息(包括索引)。

在我的应用程序中,我想要三个模型,分别称为 ABC

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

顺便说一下,我使用的是 Oracle Enterprise 数据库。

【问题讨论】:

  • 您打算如何查询数据?另外,ID 有什么内在含义吗?例如,它是否需要在跨越 ABC 之间保持唯一?它是否必须与进行测量的顺序相对应?另外,所有测量值都是float吗?
  • @BrankoDimitrijevic ID 没什么特别的。最好的事情是忽略它:-)。顺序并不重要。所有测量值都是float
  • 如何区分恰好具有相同value 的两个测量值?请回答我的另一个问题:您打算如何查询数据?
  • 我不仅与实验有关。完整的结构包括experiment_idfeature_id。实验和特征的结合是独一无二的。在一个实验中,许多特征都有各自的值。一个值可能出现不止一次。我将查询属于一个实验的所有值。或属于一个特征的所有值(多次实验)。

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


【解决方案1】:

根据您的 cmets,假设您关注的是查询性能(而不是 INSERT 性能),看起来您需要一个类似于以下的模型:

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

索引I1 由以下顺序组成:{FEATURE_ID, EXPERIMENT_ID, MEASUREMENT_TYPE, VALUE}。考虑使用COMPRESS 子句,因为会有很多行共享相同的前导FEATURE_ID)。

这给了我们 2 个 B 树:

  1. PK“下方”的 B 树,即索引组织表本身。
  2. 索引“下方”I1 的 B 树。

EXPERIMENT_ID 的查询可以通过PK B-Tree 中的单个索引范围扫描和no 表堆访问(堆不存在)来满足。 PK B-Tree 自然地将属于同一个实验的行存储在物理上靠近在一起,因此 I/O 被最小化。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-11-17
      • 2012-05-23
      • 2017-02-07
      • 2011-09-25
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 2011-07-16
      • 2013-12-11
      相关资源
      最近更新 更多