field_collection与multifield的简单对比

field_collection比较完美地实现了子字段的使用,但由于collection是通过entity+field实现的,据说有性能问题,还带来了数据迁移时的复杂性。drupal的entity+field可以被理解为扁平化结构的数据表,在扁平化结构中记录父子关系,对于复杂的数据查询是比较难构建的。试想一下,要提取某个node的所有field,首先得先将各个子字段表join到父字段(其实是个entity)表,再join到node表,还要join上其它非collection的field表。

multifield简化了field_collection的数据存储方式,尽管也是通过entity+field实现,在数据库中它同样建立的子字段对应的数据表,但里面都是空的——而所有子字段都放入同一个数据表中,这样的话至少查询子字段时比较方便,免去子字段与父字段的联合查询(join)。

multifield是对 field_collection的简化,所以功能上是有点限制的。例如子字段只能是单值,不支持多个值。更要命的是,一旦输入数据,multifield的字段就不能再更改了。好比说,你定义好子字段后,用了一段时间,要想增加一个子字段,是不可能的。multifield的作者介绍说可以直接更改数据库的表格定义,清空再导入数据来实现。这对于一般的文本数字等字段应该没问题,但对于图片字段这样复杂的构造恐怕就不行了,而且直接操作数据库会带来很大风险。

所以还是决定选用field_collection, Do it the drupal way!把麻烦留给以后:)

更新:field_collection已出D8版本,配合Reference Table Formatter模块可实现子字段的表格形式输出。

个人认为field_collection确实是一套完整的解决方案,后台编辑内容时用户体验非常好!推荐使用。

 

 

文章分类: