让我们假设我们有三个关系表
所以关系很简单用户帖子Comemnt。这很常见,所以我不会解决它。
每当用户添加新帖子时,我们首先必须选择(不必要的查询btw!)用户(其实体)之后创建新帖子并插入用户实体(我们已经选择)。评论也一样。选择帖子 - >创建新评论 - >设置评论我们的帖子 - >坚持。 (是的,我们必须定义适当的关系,但这是一个问题)
所以最后我们有: 在每个表中,我们必须具有auto_increment属性的列'id'。第二列(在帖子和评论表中)带有父项的“id”(在我们的例子中是它的userID和postID)。
所以我们假设我们必须每30分钟做一次\ edit \ update \ delete评论(这只是一个例子)。我们有两个选择。
首先是选择所有注释(db中的当前注释)。删除db中的现有内容。在我们选择的实体的php端执行我们的更新\ delete \ create,之后再插入它们。所以基本意思是“删除所有然后插入”(使用新的和更新的)。
第二个是选择all并对每个进行操作,在php方面如果会像这样:这将通过所有注释使用foreach并在action更新之间切换,之后删除old,插入new。
在第一种情况下,我们遇到了麻烦。让我们假设我们将在每次调用更新时重新创建1000个条目。我知道类型'int'和'bigint'是很有价值但是它不是一个交易,真的。我应该怎么做才能在评论上有更多的关系?例如,使用类似这样的标签表...
在第二种情况下,auto_increment不会有问题,因为我们每次调用脚本时都不会重新创建条目。但是我们在EACH条目上做了很多不必要的查询。 (例如在本机mysql上删除一个条目数组是一个查询,它在Doctrine中会有多少?我会回答,最少两个,为什么?因为首先我们必须选择+然后通过manager删除它=两个db查询)
所以问题是如何在没有此列'id'和auto_increment的情况下避免表的关系?任何想法都将不胜感激。
WBR
答案 0 :(得分:1)
你肯定需要AI ID专栏,不仅仅是在学说中,而是一般。在某些情况下你没有,例如当你有复合主键时,但在你的情况下你所有的实体:User,Post,评论应该有AI ID。
第二件事,你不需要做SELECT + UPDATE / INSERT。下一个示例将仅投射 ONE 查询。 例如,如果要设置Comment的用户,则不必选择用户:
$comment = new MyCommentEntity();
$comment->setUser($entityManager->getReference('My\Namespaced\UserEntity', ['id' => $userId);
$entityManager->persist($comment);
$entityManager->flush();