выбор и отображение ранжированных предметов и голосов пользователей, в виде RedDit, Digg и др. - PullRequest
1 голос
/ 26 мая 2009

при выборе ранжированных объектов из базы данных (например, статей, за которые проголосовали пользователи), как лучше всего показать:

  • текущая страница товаров
  • рейтинг пользователя за единицу (если они проголосовали)

грубая схема:

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

лучше / идеально:

  1. выбрать текущую страницу товаров
  2. выбрать голос пользователя, ограничив его страницей пунктов с предложением 'IN'

или

  1. выбрать текущую страницу элементов и просто «ПРИСОЕДИНИТЬСЯ» к данным голосования из таблицы пользовательских голосов

или что-то совсем другое?

это теоретически в среде с большим трафиком и с использованием rdbms, таких как mysql. Между прочим, я вижу это на стороне «продумывания перед выполнением», а не «преждевременной оптимизации».

спасибо!

Ответы [ 2 ]

1 голос
/ 26 мая 2009

JOIN будет быстрее; это спасло бы поездку туда и обратно в базу данных.

Однако я бы не стал беспокоиться об этом, пока вы на самом деле не получите трафик. Многие высказались против преждевременной оптимизации , я приведу случайную:

Больше компьютерных грехов совершается в название эффективности (без обязательно достигну) чем для любого другая причина - в том числе слепой тупость.

0 голосов
/ 26 мая 2009

Если вам нужно сделать заказ на голоса, используйте это:

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) a PRIMARY KEY для голосов, что еще больше улучшит этот запрос.

...