是否有一个适用于PHP/MySQL的实体属性值(EAV)框架?

21

是否有适用于PHP/MySQL的实体属性值框架?我开始编写自己的框架,但感觉这已经被完成了。有什么建议吗?


不知道。好问题! - Till
这个问题成为“实体属性值框架”这一术语在谷歌上排名最高的页面,而且该页面只有8小时的历史记录,这意味着你运气不佳。话虽如此,如果你使用Zend Framework之类的工具,你可以轻松地扩展Zend_DB_Table抽象类。 - Andrew Taylor
@Andrew 我相信你的 Google 搜索可能会受到你的位置或搜索历史的影响。对于同样的搜索,我在前 100 个结果中没有看到 stackoverflow。现在的 Google 搜索已经不再给出一个带有客观数据的单一结果页面。它似乎在某种程度上是不可避免地主观的。 - Liam
我没有答案,但我最近在php|architect上读到了这个。http://www.phparch.com/c/magazine/issue/76或许可以帮助你找到更多信息... - user13243
3个回答

4

我认为Magento采用了EAV风格的架构,值得研究一下。Magento是基于Zend框架的电子商务平台。


1

1

我不知道有哪些。

话虽如此,eZ Publish ECMS(这是自由软件)使用了一种EAV风格、高度规范化的数据模型。 结构化内容类型("content classes")的定义和实际内容实例(文章、用户账户、评论、产品等任何东西)都在单个数据库表中定义和存储。

通过Web界面,可以动态地组合各种数据类型来创建新的内容类型(例如"simplearticle"可能包含"Textline"用于标题、"Datetime"用于发布日期和"XML field"用于正文)。在EAV中,“simplearticle”是实体,“headline”是属性名称,“Textline”是其值,而包含“Textline”数据类型的长度和验证规则是EAV上下文中的元数据。

正如任何EAV架构所期望的那样,这种灵活性的代价是性能降低,因为任何查找都需要多个自连接,每个自连接对应结果集中的一列。

不幸的是,这个堆栈还没有被整合到eZ相关的eZ Components库中(该库包含数据库和数据访问对象/ORM组件,但都是标准关系型组件),因此使用它意味着要么处理整个eZ Publish套餐,要么自己剥离所需的类库。


虽然灵活,但这听起来对性能来说很糟糕,甚至可能过于灵活了。 - Keyframe
这对性能来说确实很糟糕。eZ Publish 进行了多层缓存以使其可行(只有在更改时才从数据库中重新读取/连接“内容类”和内容本身),但仍然比关系结构或像 BigTable 这样的本地对象存储慢。 - joelhardi
1
"EAV-style"和"normalized"是反义词。 - Bill Karwin
@Bill Karwin:我当然能看到EAV的缺点(正如Magento所展示的那样),但是当你需要一个灵活的数据模型时,比如存储自定义产品属性或设计自定义表单时,你会提出什么替代方案呢? - Lèse majesté
2
@Lèse majesté:请参考我的回答https://dev59.com/-nRB5IYBdhLWcg3wLUu3或者我的书籍《SQL Antipatterns: Avoiding the Pitfalls of Database Programming》http://www.pragprog.com/titles/bksqla/。 - Bill Karwin
@Bill,eZ Publish(或者说在我写这篇文章的时候)使用了一个高度规范化的SQL结构作为EAV风格数据模型的存储后端。但是EAV数据本身并没有被规范化。抱歉之前表述不够清晰。 - joelhardi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接