Doctrine 继承和 MySQL 连接表限制
Posted
技术标签:
【中文标题】Doctrine 继承和 MySQL 连接表限制【英文标题】:Doctrine Inheritance and MySQL Join Table Limit 【发布时间】: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 queries
、2) Use the entities only when REALLY needed
、3) Increase your MySQL limits
由于我不知道您的数据库的结构是什么,也不知道您想要实现什么确切,所以我无法给出一个好的答案。
另外,如果您博客的每个category
都有自己的表,那么就有问题了。你不应该做那样的事
【参考方案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 以保持数据完整性。以上是关于Doctrine 继承和 MySQL 连接表限制的主要内容,如果未能解决你的问题,请参考以下文章
在 Doctrine ORM 2 中加入类表继承时出现“主键 elementId 的缺失值”