实体属性值模型 - 性能替代?

时间:2012-10-14 13:09:50

标签: mysql sql performance entity-attribute-value

我使用PHP和mySQL。

我有一个页表和一个元表。它看起来有点像这样。

Page table

page_id | headline    | content
--------------------------
1       | My headline | My content
2       | Another one | Another text

元表格

id | page_id | meta_key  | meta_value
------------------------------------
1  | 2       | seo_title | Hello world
2  | 2       | price     | 299

我读过这种类型的模型叫做EAV。我还读到它是bad for performance

我的元表适用于连接到页面的任何类型的值。我这次不能用“静态”列创建一个表。

问题

  • 对于每页有30个元值的300页,这有多糟糕? 9000 元表中的行是。
  • “动态”数据是否有更好的模型?

2 个答案:

答案 0 :(得分:2)

首先,有时此模型可以更轻松地查询数据。几天前我问过一个问题here,有些用户建议我为什么不将我的模型更改为1NF表单以使查询数据更容易。只有当他们意识到我被这个设计困住时,他们才提供了一些问题的答案。关键是我很幸运,只有12列可以总结;否则,如果我的表包含300列,也许没有用户打扰自己为该问题编写查询。 : - )

第二,由于数据库自然会施加一些限制,有时这种设计的实施会更容易。如果您的meta_key值包含一些大于30个字符的冗长值,则您必须缩短值并在某处进行映射,否则这可能是您可能拥有的唯一选项。

最后,表现非常重要;确实如此。但是,另一方面,您可以应用某些技术来提高性能;例如,通过创建适当的索引,分区表等。

在这种情况下,表格尺寸非常小。因此,除非您的查询非常复杂,例如计算量大,连接和聚合复杂,并且如果应用程序对小时间分数不敏感,我想如果采用此模型,您将不会受到性能影响。

最后,如果您仍然过于关注性能,我建议创建两个模型,用一些随机或真实数据填充它们,并分析计划成本以查看模型更适合您的需求。

答案 1 :(得分:1)

规范化的数据库模式基本上针对一般情况进行了优化。与之相比,高度非规范化的模式对性能不利。

但这实际上意味着什么取决于您的用例。你在运行什么问题?所以我建议如下:

  • 确保将完整的持久层与其他所有内容完全分开。

  • 确保自动测试包括性能测试。

  • 实施您当前的解决方案,从创建最复杂的性能关键查询的部分开始。不要在这一步投入太多。可能低于项目预算的5%。

  • 检查表现是否足够。

  • 如果检查失败,您有以下选项:

    1. 添加物化视图

    2. 使用更适合工作的替代系统。密钥值存储可能就是您要找的东西。

    3. 或者您可能需要一种混合方法:应用程序的一部分使用EAV,使用其他更适合查询的方法复制数据。