mysql - Symfony2、Doctrine2、MySql 和 auto_increment 列问题

标签 mysql symfony doctrine-orm

假设我们有三个具有关系的表

  • 用户
  • 发帖
  • 评论

所以关系很简单用户帖子评论。这是常见的事情,所以我不会描述它。

每次用户添加新帖子时,我们必须首先选择(顺便说一句,不必要的查询!)用户(其实体),然后创建新帖子并插入用户实体(我们已经选择)。评论也是一样。选择帖子 -> 创建新评论 -> 设置评论我们的帖子 -> 坚持。 (是的,我们必须定义适当的关系,但这是一个问题)

所以最后我们有: 在每个表中,我们必须有具有 auto_increment 属性的列“id”。第二列(在帖子和评论表中)包含父项的“id”(在我们的例子中是 userID 和 postID)。

因此,假设我们必须每 30 分钟执行\编辑\更新\删除评论(这只是示例)。我们有两个选择。

第一个是选择所有评论(数据库中的当前评论)。删除数据库中现有的。在我们选择的实体的 php 端执行更新\删除\创建,然后再次插入它们。所以基本含义是“删除所有然后插入”(包括新的和更新的)。

第二个是选择全部并对每个进行操作,在 php 方面,如果是这样:我们将使用 foreach 遍历所有注释并在更新操作之间切换,之后删除旧的,插入新的。

在第一种情况下,我们遇到了麻烦。假设我们将在每次调用时重新创建 1000 个条目的更新。我知道类型“int”和“bigint”具有很大的值(value),但这不是一个交易,真的。如果我们在评论上有更多关系,我该怎么办?例如,使用类似这样的标签表...

在第二种情况下,auto_increment 不会成为问题,因为我们不会在每次调用脚本时重新创建条目。但是我们对每个条目做了很多不必要的查询。 (例如,在 native mysql上删除一组条目是一个查询,在Doctrine中会是多少?我会回答,至少两个,为什么?因为首先我们必须选择+然后通过管理器删除它=两个数据库查询)

所以问题是如何避免没有此列“id”和 auto_increment 的表之间的关系?任何想法将不胜感激。

WBR

最佳答案

你肯定需要 AI ID 列,不仅仅是在原则上,而且一般情况下。在某些情况下你不需要,例如当你有复合主键时,但在你的情况下你的所有实体:用户,帖子,评论应该有AI ID。

第二件事,您不需要执行 SELECT + UPDATE/INSERT。下一个示例将仅转换 ONE 查询。 例如,如果要设置Comment的用户,则不必选择用户:

$comment = new MyCommentEntity();
$comment->setUser($entityManager->getReference('My\Namespaced\UserEntity', ['id' => $userId);
$entityManager->persist($comment);
$entityManager->flush();

关于mysql - Symfony2、Doctrine2、MySql 和 auto_increment 列问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20445610/

相关文章:

c# - 使用文本框检查数据库中的重复值

MySQL - SQL_BIG_SELECTS

php - 高效设计和管理用户设置模块

php - Symfony 2 Doctrine 2 使用 inversedBy 和 mappedBy 进入多对多关系?

Doctrine Query Builder - 如何选择多对多关系?

php - 我的脚本和 hostgators 托管服务,以及一些附加信息

symfony - ResponseListener 改变 Assets 的内容类型

php - 在带有 Doctrine2 的 Symfony2 上,Object = Entity 吗?

php - QueryBuilder 查询数组值

forms - 表单集合上的 ZF2 对象绑定(bind)