【问题标题】:Symfony2, Doctrine2, MySql and auto_increment column troublesSymfony2、Doctrine2、MySql 和 auto_increment 列的麻烦
【发布时间】:2013-12-07 19:29:25
【问题描述】:

假设我们有三个关系表

  • 用户
  • 发布
  • 评论

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

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

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

假设我们必须每 30 分钟执行一次\edit\update\delete cmets(这只是示例)。我们有两个选择。

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

第二个是全选并在每一个上执行操作,在 php 端,如果会是这样的:我们将在所有 cmets 中使用 foreach 并在操作更新之间切换,之后删除旧的,插入新的。

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

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

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

WBR

【问题讨论】:

    标签: mysql symfony doctrine-orm


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,DQL 足够强大,但它如何解决 AI id 计数的问题?您的示例仅显示数据库条目中的“现有”。它只是创建“空”实体以避免选择用户。
    • @user1954544 Bigint 最大值为 18446744073709551615。让我们想象一下每秒 10000 cmets 的惊人数量,您将需要 58494241.73 YEARS 才能达到极限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2013-03-14
    • 2010-09-26
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多