回答
由於您使用的是Doctrine,請儘量不要在RDBMS級別上考慮太多(至少在大多數情況下)。
如果您有兩個具有ManyToMany關係的實體,則應該忘記代理鍵。事實上,你幾乎應該忽略關係表存在的事實。你只需要有兩個相關的實體類型。
現在,如果您需要存儲有關關係本身的元數據(例如徽章頒發給用戶的日期),那麼您將超越一個簡單的ManyToMany,並且您需要自己爲該關係建模 - 通過創建一種新的實體(例如UserBadge)。那個實體當然會有一個id。
您正在使用ORM,請考慮實體,而不是關於表(大部分時間)!
我更喜歡在每個表上使用單列自動更新密鑰。它使刪除和更新更簡單。
大部分時間在這樣的一個joinn表中,只是將它們設置爲一個組合PK就沒有問題。
您不需要添加代理鍵。我不會。
您嚴格不需要需要它,但它在SQL控制檯上播放時可能非常方便,特別是如果兩個標識符都很長並且很難打字。
另一方面,它打破3NF。如果您不小心,最終可能會得到兩個包含不同代理鍵和(book_id, author_id)
值的記錄。您將有兩個索引來確保兩個唯一性約束;這會減慢插入和更新。
另外你可能想避免額外的列來提高效率。如果你的表有很多記錄,有一個額外的列會使它在內存中的緩存效率降低,並且使用它的連接會更頻繁地被磁盤I/O放慢。
這裏有兩個問題。
您需要對書籍/列組合進行唯一約束以避免重複。即使您使用auto-inc代理鍵,也必須這樣做。第二,現在很多框架不知道如何處理除整數鍵之外的任何東西,所以你可能還想把它放在整數列上。但在這種情況下,你會需要兩者。
你從來沒有需要一個代理鍵,因爲你總是可以原則上總是使用一些其他的鍵代替。
在你的問題中,我不認爲你的意思是「關係表」,更不用說「關係」。我認爲你的意思是「一張帶有多個外鍵的桌子」。具有多個外鍵的表與其他表並不不同,並且它們的設計原則也不需要不同。選擇與其他表格相同的密鑰。
- 1. 我是否需要爲has_many:through關聯創建一個關聯表?
- 2. 當我們創建表時,我們是否需要指定關係的基數?
- 3. 我是否需要在一對多關係中使用代理鍵?
- 4. 我是否需要爲關係數據庫表的主鍵創建單獨的索引
- 5. 我是否需要爲get/post ActionResult創建相同的列表?
- 6. 我是否需要爲我的應用程序創建線程?
- 7. 我是否需要手動爲HABTM連接表創建遷移?
- 8. 我是否需要ARC關鍵字來處理我沒有合成的屬性?
- 9. WCF代理:我是否需要爲每個綁定創建一個新的和不同的代理?
- 10. 爲什麼我們需要SvcUtil.exe來創建/生成代理類
- 11. 我是否需要使用關鍵字關閉SQL Server連接?
- 12. 我是否需要調用Form.Close(),還是爲我處理?
- 13. 是否總是需要創建Dim表?
- 14. 我們是否總是需要使用async關鍵字?
- 15. 我是否需要將nginx設置爲我的MongoDB實例的反向代理?
- 16. 我是否需要填寫外鍵值?
- 17. 我是否需要爲UITextField創建一個控制器?
- 18. 我是否需要爲MySQL創建索引?
- 19. 我是否需要爲每個頁面創建路線? (node.js中)
- 20. 我是否需要爲WinRT應用程序創建縮略圖
- 21. 我們是否需要爲gcnew創建指針驗證
- 22. 我們是否需要爲每個ViewModel創建induvidual ViewModelLocators?
- 23. 我的關係代數是否正確?
- 24. 我是否需要包含hibernate.jar的所有Maven依賴關係?
- 25. 我是否需要創建2個表單來集成付款處理API?
- 26. 我是否需要一個完整的內容管理系統?
- 27. 我是否需要爲每個測試重新創建我的驅動程序?
- 28. 我們是否需要關閉file_get_contents?
- 29. 我是否需要關閉()FileReader和BufferedReader?
- 30. 我是否需要爲EF中的每個表創建一個類
是嗎?如果你想刪除或更新記錄,說明作者A寫了書B,代理人將如何提供幫助?如果沒有首先使用author_id和book_id選擇代理,您甚至會知道代理的價值是什麼? – 2011-04-27 11:42:32
而不是從表中刪除where column1 ='abc'AND column2 ='xyz'你從表中刪除id = 123. – 2011-04-27 14:03:59
是的,我知道。我的問題是,你怎麼知道你想要刪除的ID是123,而不是通過你知道的東西 - 作者和書籍來查找該行? – 2011-04-27 14:06:58