类似Google Reader的应用程序的数据库架构和查询

时间:2011-10-26 12:06:55

标签: mysql sql database-design many-to-many

为简单起见,我们假设我们为所有用户提供单一Feed

Feed只是文章列表 每个用户都可以免费收藏某个文章,或将其从个人视图中删除。

用户删除文章不会影响其他用户;每个用户都有自己的Feed视图。

简单方法

我设计的一个天真的计划如下:

user - article

(当然,在实际应用中,用户 - 文章关系不仅仅是隐藏或主演。)

问题

看起来在第一次更改选项后,应该懒洋洋地创建链接表条目。否则,当新用户注册或弹出新文章时,我们必须创建大量空链接记录,并处理并发。

这意味着为特定用户选择文章列表是一个结合了以下内容的查询:

  • 选择ArticleUserLink不存在的所有文章;
  • 选择ArticleUserLink存在且is_hidden = 0的所有文章。
  

这里是OR的答案,还是有更有效的数据库设计/查询来解决问题?

2 个答案:

答案 0 :(得分:3)

如何使用内部查询?

SELECT * 
FROM Article a
WHERE NOT EXISTS(SELECT * FROM ArticleUserLink WHERE article_id = a.id AND (is_hidden IS NULL OR is_hidden != 0))

答案 1 :(得分:1)

只需使用LEFT JOIN

即可
SELECT * 
FROM   Article a
LEFT   JOIN ArticleUserLink ua ON (ua.article_id = a.id)
WHERE  a.user_id = insert_user_id_here
AND    (ua.is_hidden = 0) IS NOT FALSE
...

这样你就得到了

  • 文章没有 ArticleUserLink
  • 中的相关条目
  • 文章确实 ArticleUserLink中的关联条目 ua.is_hidden = 0