【发布时间】:2012-06-06 16:21:28
【问题描述】:
我需要构建一个应用程序,其中有通用实体(比如文章、页面、节点),用户可以在其中添加自定义字段。
我已经看到最流行的 php CMS(wp、drupal)用来实现这个目标的方法;他们都有 base 表,其中包含最少的字段(例如标题和正文),然后将所有其他字段委托给其他表,例如:
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 环境中是很符合逻辑的;字段控制器分别处理每个字段。
但谈到性能,加载单个节点将需要许多查询 - 或许多连接。
我采取了不同的方法(即使我的应用程序不提供任何基本字段):对于每个字段,我在基本表上添加一个新列,该列将存储 raw 值,然后每个需要它的字段的表(例如多个字段,或对其他实体的引用)和一个只有索引 entity_id | 的 relation 表field_id(该表实际上执行其他类型的工作,例如跟踪版本控制和实体之间的关系类型)
所以通过一个查询,我从一个实体中获取所有 原始 数据,然后字段控制器知道(在需要时)如何以及在何处加载 real 值那些字段。
data表中的列类型(table_entity_data)是字段数据的最佳猜测:对于text是text,对于decimal是decimal;仅对于多个字段(在该表之外具有它们的值)是数组(并且真正的 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
有什么建议吗?
ps:我知道这个问题很笼统,如果不合适,请随时标记关闭。
【问题讨论】:
标签: performance postgresql database-design entity-relationship relationships