Symfony2、Doctrine2、MySql和auto_increment列出现问题



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

  • 用户
  • Post
  • 注释

所以关系就是简单的用户后通信。这是很常见的事情,所以我不会去讨论它。

每次用户添加新帖子时,我们必须首先选择(unaccesary query btw!)用户(其实体),然后创建新帖子并插入用户实体(我们已经选择)。评论也是如此。选择post->create new comment->set to comment our post->persistent。(是的,我们必须定义适当的关系,但这是一个问题)

因此,最后我们有:在每个表中,我们必须具有具有auto_increment属性的列"id"。第二列(在post和comment表中)是父项的"id"(在我们的例子中是userID和postID)。

所以,让我们想象一下,我们必须每30分钟做一次编辑更新删除评论(这只是一个例子)。我们有两个选择。

第一个是选择所有注释(当前数据库中)。删除数据库中现有的。在我们选择的实体的php端进行更新\delete\create,然后再次插入它们。因此,基本含义是"删除所有然后插入"(带有新的和更新的)。

第二种方法是选择所有内容并对每个内容执行操作,在php端,如果是这样的话:我们将在所有注释中使用foreach,并在更新操作之间切换,之后删除旧操作,插入新操作。

在第一种情况下,我们有麻烦。让我们想象一下,我们将在每次调用时重新创建更新到1000个条目。我知道类型"int"one_answers"bigint"很有价值,但实际上这没什么大不了的。如果我们在评论上有更多的关系,我该怎么办?例如,有这样的标签表。。。

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

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

WBR

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

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

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

相关内容

  • 没有找到相关文章

最新更新