【问题标题】:Doctrine Inheritance and MySQL Join Table LimitDoctrine 继承和 MySQL 连接表限制
【发布时间】:2014-01-12 16:29:20
【问题描述】:

mysql的61个连接表限制有问题。我有 57 多个不同的类扩展基类,其中包含与 cmets、喜欢、标签的关联。当我得到最多评论时,MySQL 崩溃了。 Doctrine 必须加入整个鉴别器映射和 cmets 本身并按 COUNT(cmets) 排序。

有办法解决吗?

还有另一种方法可以为不同类型的实体实现 cmet,而无需继承和重新复制相同的关联?

这是实体的示例架构。当我想用 cmets 添加新的实体类型时,我只是扩展 BaseClass 来接收这些特性。

【问题讨论】:

  • 只是一个问题,你在使用 Doctrine 缓存吗?
  • 是的,但是这对我有什么帮助?
  • 嗯...这不是一个好的答案,但您只能做两件事:1) Reduce the complexity of your queries2) Use the entities only when REALLY needed3) Increase your MySQL limits
  • 由于我不知道您的数据库的结构是什么,也不知道您想要实现什么确切,所以我无法给出一个好的答案。
  • 另外,如果您博客的每个category 都有自己的表,那么就有问题了。你不应该做那样的事

标签: php mysql symfony doctrine


【解决方案1】:

如果我理解正确,您想要做的是有许多不同的实体类型可以评论。

要做的第一件事就是从 Doctrine 中退后一步,了解完成此任务所需的最简单的表结构。

这样的事情可能就足够了:

评论

 _______________________
| id | type | entity_id |
 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

在 Doctrine 中,为了方便起见,在基类中建立双向关系很好,但有时它们不是最佳选择。也许它会简化您的架构,直接按实体类型和 id 在 cmets 表上执行查询。

您可能还想考虑删除 Base 类并让每个实体独立。

由于博客文章可以存在于没有 cmets 的上下文中(例如,在不允许评论的博客上),那么 $blog->getComments() 没有多大意义。

进行此更改,您可以改为执行以下操作:

$comments = $commentsRepository->findCommentsForEntity($entity);
$commentsCount = count($comments);

并且存储库可以生成所需的查询,将实体作为entity_id 参数传递,并根据实体类型设置所需的注释类型。

【讨论】:

  • 是的,这也是一种解决方案,但这样我就失去了关系关系数据库和外键的优势。如果应用程序逻辑无法正常工作,则 DB 中将存在不需要的记录。一切都变得非常复杂,如果我删除实体,我必须删除他所有的 cmets 和其他东西。
  • 通常情况下,实体的删除应该只在应用程序的一个地方完成。在这种情况下,您只需添加删除该实体的相关 cmets。数据库主要只保存应该是应用程序工作以正确管理它的数据。此外,在数据库中保留一些剩余数据永远不会有问题。如果应用程序无法正常运行并留下一些东西,您始终可以创建可以运行的清理脚本。
  • 是的,这也可以通过事件监听器进行删除,但我仍然不正确,这是正确的方法。我想保留 FK 以保持数据完整性。
猜你喜欢
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多