首页 文章

选择和显示排名的项目和用户的投票,la reddit,digg等

提问于
浏览
1

当从数据库中选择排名对象时(例如,用户投票的文章),显示的最佳方式是什么:

  • 当前页面的项目

  • 用户's rating, per item (if they'已投票)

粗略的架构:

articles: id, title, content, ...
user: id, username, ...
votes: id, user_id, article_id, vote_value

它是更好/理想的:

  • 选择当前页面的项目

  • 选择用户's vote, limiting them to the page of items with an ' IN'子句

要么

  • 选择当前页面的项目,只需从用户投票表中输入'JOIN'投票数据

或者,完全不同的东西?

这在理论上是在高流量环境中,并使用像mysql这样的rdbms . fwiw,我认为这是“在做之前先思考”而不是“过早优化” .

谢谢!

2 回答

  • 1

    JOIN会更快;它可以节省数据库的往返 .

    但是,在你真正获得一些流量之前,我不会担心这一点 . 很多人都反对premature optimization,我会随机引用一句:

    更多的计算罪是以效率的名义(不一定实现它)而不是任何其他单一原因 - 包括盲目的愚蠢 .

  • 0

    如果您需要订购,请使用此:

    SELECT  *
    FROM    (
            SELECT  a.*, (
                    SELECT  SUM(vote_value)
                    FROM    votes v
                    WHERE   v.article_id = a.id
                    ) AS votes
            FROM    article a
            )
    ORDER BY
            votes DESC
    LIMIT 100, 110
    

    这将计算单个查询中的投票和分页 .

    如果您只想显示用户自己的投票,请使用 LEFT JOIN

    SELECT  a.*, vote_value
    FROM    articles a
    LEFT JOIN
            votes v
    ON      v.user_id = @current_user
            AND v.article_id = a.id
    ORDER BY
            a.timestamp DESC
    LIMIT 100, 110
    

    (vote_user, vote_item) 上 Build 索引将大大改善此查询 .

    请注意,您可以使 (vote_user, vote_item) a PRIMARY KEY 进行投票,这将进一步改善此查询 .

相关问题