2011-04-26 61 views

回答

2

由於您使用的是Doctrine,請儘量不要在RDBMS級別上考慮太多(至少在大多數情況下)。

如果您有兩個具有ManyToMany關係的實體,則應該忘記代理鍵。事實上,你幾乎應該忽略關係表存在的事實。你只需要有兩個相關的實體類型。

現在,如果您需要存儲有關關係本身的元數據(例如徽章頒發給用戶的日期),那麼您將超越一個簡單的ManyToMany,並且您需要自己爲該關係建模 - 通過創建一種新的實體(例如UserBadge)。那個實體當然會有一個id。

您正在使用ORM,請考慮實體,而不是關於表(大部分時間)!

3

我更喜歡在每個表上使用單列自動更新密鑰。它使刪除和更新更簡單。

+0

是嗎?如果你想刪除或更新記錄,說明作者A寫了書B,代理人將如何提供幫助?如果沒有首先使用author_id和book_id選擇代理,您甚至會知道代理的價值是什麼? – 2011-04-27 11:42:32

+0

而不是從表中刪除where column1 ='abc'AND column2 ='xyz'你從表中刪除id = 123. – 2011-04-27 14:03:59

+0

是的,我知道。我的問題是,你怎麼知道你想要刪除的ID是123,而不是通過你知道的東西 - 作者和書籍來查找該行? – 2011-04-27 14:06:58

5

大部分時間在這樣的一個joinn表中,只是將它們設置爲一個組合PK就沒有問題。

3

您不需要添加代理鍵。我不會。

1

您嚴格不需要需要它,但它在SQL控制檯上播放時可能非常方便,特別是如果兩個標識符都很長並且很難打字。

另一方面,它打破3NF。如果您不小心,最終可能會得到兩個包含不同代理鍵和(book_id, author_id)值的記錄。您將有兩個索引來確保兩個唯一性約束;這會減慢插入和更新。

另外你可能想避免額外的列來提高效率。如果你的表有很多記錄,有一個額外的列會使它在內存中的緩存效率降低,並且使用它的連接會更頻繁地被磁盤I/O放慢。

+0

嗨,謝謝你的準確答案,我使用Doctrine 2,我不確定我能夠使用這些鍵,但我可能需要添加一個auto-inc鍵,但是,我已經很多記錄(超過2,000,000) – JohnT 2011-04-26 18:02:01

+0

你應該在你的問題中更加突出地提及Doctrine2的使用(也就是說,不僅在標籤中),否則你會繼續接收錯過這個點的答案,就像這樣。 – 9000 2011-04-26 18:09:24

+1

添加代理鍵不違反3NF。無法在(book_id,author_id)上強制執行複合鍵。 – sqlvogel 2011-04-26 18:34:27

2

這裏有兩個問題。

您需要對書籍/列組合進行唯一約束以避免重複。即使您使用auto-inc代理鍵,也必須這樣做。第二,現在很多框架不知道如何處理除整數鍵之外的任何東西,所以你可能還想把它放在整數列上。但在這種情況下,你會需要兩者。

4

你從來沒有需要一個代理鍵,因爲你總是可以原則上總是使用一些其他的鍵代替。

在你的問題中,我不認爲你的意思是「關係表」,更不用說「關係」。我認爲你的意思是「一張帶有多個外鍵的桌子」。具有多個外鍵的表與其他表並不不同,並且它們的設計原則也不需要不同。選擇與其他表格相同的密鑰。

相關問題