1

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

  • 项目的当前页面
  • 用户对每个项目的评分(如果他们已投票)

粗略的架构:

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

是否更好/更理想:

  1. 选择当前页面的项目
  2. 选择用户的投票,将他们限制在带有“IN”子句的项目页面

或者

  1. 选择当前页面的项目,然后从用户投票表中“加入”投票数据

或者,完全不同的东西?

理论上这是在高流量环境中,并使用像mysql这样的rdbms。fwiw,我看到这一点是“在做之前想清楚”而不是“过早的优化”。

谢谢!

4

2 回答 2

1

JOIN 会更快;它将节省到数据库的往返行程。

但是,在您真正获得一些流量之前,我根本不会担心这一点。很多人都反对过早优化,我会随机引用一个:

以效率的名义(不一定实现)比任何其他单一原因(包括盲目愚蠢)犯下的计算罪更多。

于 2009-05-25T20:14:09.837 回答
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)将大大改善此查询。

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

于 2009-05-25T20:15:38.227 回答