2011-04-06 228 views
1

夥計們如果有人能幫助我,我真的很感激它。我有一個與這個問題相關的4個表的架構圖書,組,ReadingList,評論。系統的用戶可以加入一個組,並將書籍添加到該組的閱讀列表中。 A組的書名單由表ReadingList表示:一對多數據庫關係

ReadingList 
------------- 
Id (auto_increment) 
ReadingListID 
BookID (pk) 
GroupID (pk) 

的BookID和組ID被設置爲複合主鍵,以確保沒有一本書可以在閱讀組列表中出現兩次。這兩個字段都有一個fk定義到相關表格Books/Groups。現在我的問題來了,當試圖建立一個評論表和ReadingList之間的關係。該理論認爲,在ReadingList每個獨特的條目可以有很多評論(1 .. *)在羣體閱讀清單所以基本上一本書可以在相關的許多意見建議表看起來像這樣:

Comments 
----------- 
Id (pk, auto_increment) 
ReadingListID 
UserName 
Comment 
TimeStamp 

我的邏輯是fk從Comments(ReadingListID)設置爲ReadingList(ReadingListID),但我明顯有缺陷,因爲我在'引用表'中找到'沒有主鍵或候選鍵'錯誤。

我已經嘗試了各種東西,如在Comments表中使ReadingListID & Id成爲一個組合鍵,並使ReadingListID成爲ReadingList表等中的一個pk,但我無法讓我的頭轉過來。如果我不清楚,請告訴我。

非常感謝!

+1

你如何創建ReadingList-> ReadingListID並且它是唯一的? – Mark 2011-04-06 16:23:16

回答

2

你可以做的是使用將ReadingList的主鍵從組合(BookID + GroupID)更改爲ReadingListID列,然後你的FK就可以工作。然後,您可以在BookID + GroupID列中創建唯一的約束或索引,以強制執行該數據完整性。

我很困惑,但是,爲什麼你的ReadingList(Id)與你的ReadingListID列是分開的自動增量。也許你應該放棄一個或另一個。在我看來,您的模式似乎設置的方式,也許ReadingList.Id是PK,並且Comments.ReadingListID是該列的FK。

+0

'ReadingList.ReadingListID'似乎是必需的,因爲'Comments'表用作FK。 – 2011-04-06 16:34:35

+1

感謝您的評論,我完全同意你,我需要刪除Id或ReadingListID我現在可以看到。我會試試這個,讓你知道我如何繼續。再次感謝您花時間回覆。 – Apollo 2011-04-06 16:37:10

+0

@Frosty - 對,但這是一個命名約定的事情。雖然我不這樣做,但有些人傾向於在每個表格「ID」中命名它們的PK,並且指向它的FK被命名爲 ID。我無法分辨出他要用這種方式,並且猜測它看到他的評論表的PK是Id列。 – Dane 2011-04-06 16:38:15

1

這是因爲ReadingList的主鍵實際上是一個組合鍵(BookID,GroupID)。您應該更新您的評論表並具有BookID和GroupID而不是ReadingListID。

爲什麼你有ReadingListID?您不需要它,因爲您已經定義了複合主鍵。

1

我建議:

ReadingList 
------------- 
ReadingListID (pk, auto_increment) 
BookID (fk) 
GroupID (fk) 
+ Unique index on (BookID, GroupID) 

Comments 
----------- 
CommentID (pk, auto_increment) 
ReadingListID 
UserName 
Comment (maybe "Content", "Value" or "Body" could help avoid typing comments.comment) 
TimeStamp 
3

enter image description here

BookInGroupCommentNointeger,序列號(1,2,3 ...)的每個GroupID, BookID組合。它可以創建一個使用

select 
    coalesce(max(BookInGroupCommentNo), 0) + 1 
from ReadingList 
where GroupID = some_group_id 
    and BookID = some_book_id ; 

得到ReadingListComment表擺脫那些自動遞增IDsReadingListID的新評論時很容易查到。

+0

+ 1爲ERD以及增加的標準化水平(即使用自然鍵而不是人爲鍵)......畢竟它被標記爲「標準化」。 – Dane 2011-04-06 17:59:06

+0

這是一個很好的例子Damir,謝謝。 – Apollo 2011-04-06 21:05:53

+0

這導致了有趣的辯論「代理鍵與組合鍵」http://stackoverflow.com/questions/977615/many-to-many-relation-design-intersection-table-design http://stackoverflow.com/問題/ 977615/many-to-many-relation-design-intersection-table-design =>沒有「絕對」的答案,取決於你需要什麼,但是海事組織很好地瞭解每種方法的優點和缺點。 – 2011-04-06 21:14:03