2013-01-19 18 views
0

我需要設計一個類似於下載網站的數據庫。我想跟蹤用戶,每個用戶下載的程序,還允許用戶評價+評論說的程序。我需要從這個數據庫中得到的東西 - 獲得一個程序的平均評分,獲得一個程序的所有評論,確切地知道什麼程序(我不在意每個程序下載了多少次,但我想知道每個用戶都下載了哪些程序),也許還會計算每個程序的註釋數量以及它的相關內容(這是一個非常小的項目我想保持簡單的個人使用) 我拿出這些實體 -面向用戶的數據庫設計下載

用戶(UID,UNAME等)

計劃(PID ,PNAME)

和以下relationships-

UserDownloadedProgram(UID,PID,時間戳)

UserCommentedOnProgram(UID,PID,commentText,時間戳)

UserRatedProgram( uid,pid,rating)

爲什麼我選擇這種方式 - 關係船舶(用戶下載,用戶評論和費率)很多。用戶下載許多程序並且許多用戶下載程序。評論也一樣(用戶對很多程序發表評論,某個程序被許多用戶評論或評分)。據我所知,最好的做法是創建一個一對多的第三個表格(關係表)。 。我猜想在這個設計中,平均評分和評論檢索是通過連接查詢或類似的方法完成的。 我是數據庫設計總noob,但我試圖堅持最佳實踐,這個設計或多或少好,或者我忽略了什麼?

我可以肯定地想到其他的可能性 - 也許評論和\或評級可以是一個實體(表)本身和關係是3個實體之間。我不確定它的優點和缺點是什麼:我知道我並不關心評論或評分,我只是想在適當的時候展示它們並維護它們(在需要時刪除),所以如何我知道他們是否更好地成爲一個實體?

有什麼想法?

+0

Eww請不要在您的列前加上。每次看到這個,我都會哭泣。用戶表上的Id列顯然是用戶Id,你不需要稱它爲uid。在引用用戶表的其他表中 - 這些列應該被稱爲UserId – Milney

回答

0

您將創建新的實體,如rules of normalization所示。沒有特別的理由要製作一個額外的(單獨的)評論表,因爲你已經有了。誰發表評論以及評論適用於哪個程序是評論的全面屬性。代表這些關係的外鍵(從註釋表的角度來看,它們是多對一的)屬於您放置它們的位置。

您建議的表格爲第三範式根據最佳實踐可接受。我想補充一點,你似乎是在事務性的基礎上跟蹤數據(即記錄事件發生的時間)。這也是一種很好的做法,因爲您可以根據詳細信息隨時弄清楚您想要的任何內容。

計算下載次數或評論數量只需使用SQL Aggregate Functions並在適用於您的查詢的外鍵上使用過濾器即可 - 例如, where pid=1234

0

我會用自己的ID做一個實體下載。您可以擁有下載狀態,您可以爲一個用戶多次下載同一個程序。您可能需要將您的下載與訂單或其他內容相關聯。