0

我们有一个 Postgres 数据库,其中包含一个表“foo”和辅助表“bar_1”...“bar_k”,它们保存特定类型 foo 的附加数据。基本上,我们可以将“foo”视为具有公共属性的父类,而每个“bar_i”表都是“foo”的子类,它添加了额外的属性。

我们正在考虑重新设计模式,以便我们有一个“foo_metadata”表来代替几个“bar”表,它列出了每种“bar”表中的不同列,以及一个“foo_attributes”表通常在“条形”表中的值。

这样一个系统的优点是它非常通用:我们基本上会将每个类的元数据放入数据库中,这样就不需要为每个更改或添加的类更新应用程序和编写测试。

我想这会影响性能:我们不是从“foo”表中读取一行,从“bar”表中读取一行,而是从“foo_metadata”和“foo_attributes”表中读取几行。更新也是如此(尽管我们只会更新未编入索引的值和时间戳。)

我的问题是:我们会得到多少性能影响?有没有办法将性能影响降到最低?在投入大量开发人员时间重新设计系统之前,我们可以使用哪些指标来估计性能损失。

(我们不关心 Postgres 对值强制执行类型,因为它们通常是字符串,并且应用程序需要在将值插入数据库之前检查它们......)

4

1 回答 1

1

您描述的模型是通用 EAV 模型(实体-属性-值模型)。

互联网上已经有大量关于它的信息。只是谷歌EAV。您甚至可以从thiswiki 中的文章开始。

EAV的最大问题:

  1. 编写查询可能很困难。(多个连接到同一个值表,而不是单个表中的多个列)
  2. 您不能轻松地将数据库约束应用于此模型(因此没有引用完整性和检查)。
于 2013-02-19T18:38:47.707 回答