2013-12-07 50 views
0

讓我們想象一下,我們有關係Symfony2中,Doctrine2,MySQL和AUTO_INCREMENT列困擾

  • 用戶
  • 評論

所以關係三個表是簡單的用戶帖子Comemnt。這是常見的事情,所以我不會放棄它。每當用戶添加新帖子時,我們首先必須選擇(不相關的查詢btw!)用戶(其實體),然後創建新帖子並插入用戶實體(我們已經選擇了)。與評論相同的東西。選擇後 - >創建新評論 - >設置評論我們的帖子 - >堅持。 (是的,我們必須定義適當的關係,但它是一個問題)

所以最後我們有: 在每個表中,我們必須具有auto_increment屬性的列'id'。第二列(在發表和評論表中)與父項的「id」(在我們的例子中是userID和postID)。

因此,讓我們想象一下,我們必須每30分鐘進行一次\編輯\更新\刪除評論(這僅僅是例子)。我們有兩個選擇。

首先是選擇所有評論(當前在db)。刪除現有的數據庫。在我們選擇的實體中執行我們的更新\刪除\在PHP中創建,然後再插入它們。所以基本含義是「刪除所有然後插入」(與新的和更新)。

第二個是選擇所有,並在每一個做操作,在PHP方面如果會這樣sometyhing:我們將使用foreach通過所有評論和操作之間切換更新,之後,刪除舊的,插入新的。

在第一種情況下,我們遇到了麻煩。讓我們想象一下,我們將在每次更新時重新創建1000個條目。我知道類型'int'和'bigint'是很大的價值,但它不是一個交易,真的。我該怎麼做,我們有更多關於評論的關係?例如對於類似這樣的標籤表...

第二種情況auto_increment不會是一個麻煩,因爲我們不是每次我們調用腳本時重新創建條目。但是我們對每個條目做了大量不必要的查詢。 (例如在本機mysql上刪除一個條目的數組是一個查詢,它會在Doctrine中多少?我會回答,至少兩個,爲什麼?因爲首先我們必須選擇+然後通過管理器刪除它=兩個db查詢)

所以問題是如何避免沒有這個列'id'和auto_increment關係的表?任何想法將不勝感激。

WBR

回答

1

你絕對需要AI ID列,而不僅僅是在教義,但generally.There一些情況下,當你有複合主鍵,你不這樣做,例如,但在你的情況下,所有的你實體:用戶,發佈,評論應該有AI ID。

第二件事,你不需要做SELECT + UPDATE/INSERT。下一個示例將只會輸出ONE查詢。 例如,如果你想設置評論的用戶,你沒有選擇的用戶:

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

呀DQL足夠強大,但它是如何解決問題的AI ID的數量?而你的例子只在數據庫條目中顯示'存在'。它只創建'空'實體以避免選擇用戶。 – user1954544

+1

@ user1954544 Bigint的最大值是18446744073709551615.讓我們想象每秒發送10000條評論的發言量,您將需要58494241.73 ** YEARS **才能達到上限。 –