用户订阅的数据库设计

问题描述:

所以我是新来的主题范围内的数据库,并寻找一些建议,我相信是相当简单的。首先我使用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

首先,它可能值得一读关于基础数据库设计的文章。快速谷歌打开了这个占地确定关系

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

如果我是你,我想补充第三个表如下:

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 = ? 

它补充已被写入在其他的答案的部分答案:

不要守在“user_devices”现场设备的清单 - 打破这一到一个单独的表中。实际上,您需要两个表:一个列出各种设备,一个连接表,其中包含两个字段:user_id和device_id。这将使您可以跟踪哪个用户拥有哪个设备,还可以提供每个设备的用户列表。

+0

感谢您输入的问题,一定要实施这个 – brendosthoughts 2013-03-27 11:50:27