2013-03-27 361 views
0

所以我是新來的主題範圍內的數據庫,並尋找一些建議,我相信是相當簡單的。首先我使用MySQL作爲我的數據庫我現在有一個用於存儲用戶賬戶和細節兩個表之一:用戶訂閱的數據庫設計

TABLE user 
id | username | password | email_address | user_devices | contact_method 

,另一個是由生產它看起來像存儲視頻內容:

TABLE series 
id | series_title | still_broadcasting | last_updated | 

我會喜歡實現一個功能,用戶可以選擇希望在新版本發佈時可以通知的系列,並選擇如何通知這些發佈(電子郵件或推送通知)以及通知多久(在抵達時,每小時,每日,每週)我想知道做什麼最好的方法是什麼?

我已經想到了這些想法的自己,但要尋找一個第二個意見/共更好的方法:(所有的想法零下4涉及到存儲如何與何時在用戶表一起通知用戶)

  1. 添加一個文本列到用戶表稱爲繼,只是有CSV的每個系列
  2. 添加多個布爾列的用戶表中的每個系列
  3. 添加文本列系列表與用戶的ID號的禾的以下一系列
  4. 創造一個完全是爲了通知新表,雖然我真的不明白這樣做的目的,其本身的冗餘

然後我計劃只是添加cron作業到我的服務器實際上去regulaurly將通知發送給用戶的

預先感謝您的幫助。

+0

什麼是**完全** **具體**問題或問題,您需要幫助? – Jocelyn 2013-03-27 10:57:33

+0

我正在設計一個我嘗試使用的Web服務的原型...我想剩下的是解釋性的 – brendosthoughts 2013-03-27 11:04:18

回答

1

首先,它可能值得一讀關於基礎數據庫設計的文章。快速谷歌打開了這個佔地確定關係

http://www.datanamic.com/support/lt-dez005-introduction-db-modeling.html

最好的辦法是使用一個鏈接表即

CREATE TABLE userHasSeries (
    userID INT, 
    seriesID INT 
); 

然後,這可以在內部使用JOIN查詢來獲取用戶選擇。你在這裏做的是兩個表之間的n:m鏈接。內部連接的一個例子是

SELECT 
    u.id AS userID, 
    u.username, 
    s.seriesID, 
    s.series_title, 
    s.still_broadcasting, 
    s.last_updated 
FROM users AS u 
INNER JOIN userHasSeries AS uhs 
    ON uhs.userID = u.id 
INNER JOIN series AS s 
    ON s.id = uhs.seriesID 

如果users.user_devices也是一個逗號分隔列表我勸重,你採取類似的N:M的做法,也有。

+0

非常感謝simon我會這樣做。我認爲你的強烈建議是不推薦在數據庫中使用csv(這確實會產生很多意義)。我也很喜歡你的回答很多我會留下這個問題,看看是否有其他的東西出現,但是你說的話對我來說是有意義的(減去所有不熟悉的db語言) – brendosthoughts 2013-03-27 11:06:58

+1

簡短的回答是,使用逗號分隔列表通常是一個壞主意,因爲它使得在查詢中做任何事情的效率都比連接到鏈接表上的效率低(就像這樣)。可能值得嘗試閱讀http://en.wikipedia.org/wiki/Database_normalization,當你在它的更多信息規範化(這是什麼) – 2013-03-27 11:17:08

+0

好吧...我已經結束了在過去的維基百科頁面,但它可能可能使用重新閱讀。你怎麼看待@dany回答它實現起來要簡單得多,因此我傾向於它 – brendosthoughts 2013-03-27 11:21:58

1

如果我是你,我想補充第三個表如下:

TABLE user 
id | username | password | email_address | user_devices | contact_method |notification_type 

TABLE series 
id | series_title | still_broadcasting | last_updated 

TABLE followings 
id | user_id | series_id 

在NOTIFICATION_TYPE我會把(在抵達時,每小時,每天或每週),現在在以下表中,我將存儲所有用戶的首選系列。

這樣做可以輕鬆添加,刪除,更新或選擇所有用戶的首選系列。所有將是簡單的SQL查詢。你也避免解析逗號分隔的字符串。

例如,如果你想獲得所有的首選系列的用戶:

SELECT * FROM followings AS f INNER JOIN series AS s ON f.series_id = s.id WHERE f.user_id = ? 

如果想獲取更喜歡意甲的所有用戶:

SELECT * FROM followings AS f INNER JOIN user AS u ON f.user_id = u.id WHERE f.series_id = ? 
1

它補充已被寫入在其他的答案的部分答案:

不要守在「user_devices」現場設備的清單 - 打破這一到一個單獨的表中。實際上,您需要兩個表:一個列出各種設備,一個連接表,其中包含兩個字段:user_id和device_id。這將使您可以跟蹤哪個用戶擁有哪個設備,還可以提供每個設備的用戶列表。

+0

感謝您輸入的問題,一定要實施這個 – brendosthoughts 2013-03-27 11:50:27