具有自定义字段数据库性能设计的实体

时间:2012-06-01 12:14:10

标签: performance postgresql database-design entity-relationship relationships

我需要构建一个应用程序,其中有通用实体(比方说文章,页面,节点),用户可以在其中添加自定义字段。

我已经看到了最受欢迎的php CMS(wp,drupal)用于实现此目标的方法;它们都有 base 表,其中包含最小字段(例如title和body),然后将所有其他字段委托给其他表,例如:

table node
id | title | body

table field_foo
node_id | field_type | field_value

table field_bar
node_id | field_type | field_value
// and so on

这在完整的mvc环境中是相当逻辑的;现场控制器分别处理每个字段。

但谈到性能,加载单个节点将需要许多查询 - 或许多连接。

我采取了不同的方法(即使我的应用程序没有提供任何基本字段):对于每个字段,我在基表上添加一个新列,它将存储原始值,然后每个需要它的字段的表(例如,多个字段,或对其他实体的引用)和仅具有索引的 relation 表entity_id | field_id(该表实际上做其他类型的工作,跟踪版本控制和实体之间的关系类型)

因此,通过单个查询,我从实体获取所有原始数据,然后字段控制器知道(如果需要)加载真实值的方式和位置那个领域。

data 表中的列类型(table_entity_data)是字段数据的最佳猜测:对于文本是文本,对于十进制是小数;仅对于多个字段(它们在该表外部具有值)是数组(并且实数data_type在_field_foo_value.entity_value_列中)

假设实体结构不经常改变,我试图规范化结构..

鉴于其他大项目以非常不同的方式处理这个问题,我对我的实现产生了疑问,并想知道我的 hibryd 结构会发生什么样的问题:

table entity
id

table entity_data
entity_id | field_foo_rav_value | field_bar_raw_value

table relations
entity_id | entity_field_id | field_id_value

table field_foo_value
field_value_id | entity_value

// lets say field_bar is a single text field, there no will be another table:
// entity_data.field_bar_raw_value contains the real value

有什么建议吗?

p.s:我知道这个问题很通用,如果不合适,请随意标记关闭。

1 个答案:

答案 0 :(得分:2)

看起来你正在重新发明EAV

http://www.google.com/search?q=entity+attribute+value+antipattern

缺点是您丢弃了关系数据库可以提供的所有类型安全性和结构。

在一个理想的世界里,你可能想要一个:

  1. 允许建立合适的桌子
  2. 使用非关系型数据库