从具有多列的表切换到具有多行的辅助表

时间:2013-02-19 15:29:18

标签: database postgresql

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

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

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

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

我的问题是:我们会获得多少性能影响?有没有办法最大限度地降低性能?我们可以使用哪些指标来评估在提交大量开发人员时间之前重新设计系统的性能。

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

1 个答案:

答案 0 :(得分:1)

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

互联网上已有大量关于它的信息。只需谷歌EAV。您甚至可以从维基的this文章开始。

EAV最大的问题:

  1. 编写查询可能很困难。 (多个连接到相同的值表而不是单个表中的多个列)
  2. 您无法轻松地将数据库约束应用于此模型(因此没有参考完整性和检查)。