Схема для форума, которая отображает последнюю тему и пользователя в списке форумов - PullRequest
1 голос
/ 02 сентября 2011

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

Вот соответствующие модели, которые у меня есть:

Board
  name
  description
  subjects_count
  has_many Subjects

Subject
  title
  content
  user_id
  replies_count
  belongs_to Board
  belongs_to User
  has_many Replies

Reply
  content
  belongs_to Subject
  belongs_to User

User
  name
  has_many Subjects
  has_many Replies

В индексном представлении досок для каждой активной доски отображаются следующие поля (вероятно, будет 5-10 досок):

board.name
board.description
subjects_count
most_recent_subject_title
most_recent_subject_id
most_recent_subject_user_name

Чтобы отобразить эту информацию, сейчас я использую метод ниже:

 def get_boards_and_latest_subject
    Board.connection.select_all("SELECT boards.id, boards.name, boards.description, subjects.id as most_recent_subject_id, subjects.title as most_recent_subject_title, subjects.user_id, subjects.created_at, users.name as most_recent_subject_user_name, users.id as user_id, (select count(id) FROM subjects where board_id = boards.id) as subject_count
                                 FROM boards
                                 INNER JOIN (SELECT board_id, MAX(created_at) MaxDate FROM subjects s GROUP BY board_id) MAXDATES
                                 ON boards.id = MaxDates.board_id
                                 INNER JOIN subjects ON MaxDates.board_id = subjects.board_id AND MaxDates.MaxDate = subjects.created_at
                                 JOIN users ON subjects.user_id = users.id")
  end

Я перенес этот SQL с платформы, с которой я начал этот проект - CodeIgniter, - но сейчас мне это кажется немного нелепым. В то время целью было уменьшить количество запросов при перечислении досок.

Учитывая количество досок, которые у меня есть (5-10), не лучше ли было бы сделать что-то большее, например, вернуть все доски в хороший вызов AR и для каждой, получить последнюю тему и пользователя?

Или другой вариант - сохранить последнюю тему в таблице досок, например, кеш счетчика. Поскольку я уже обновляю таблицу, когда добавляю тему - из-за кэша счетчика, было бы разумно также обновить последнюю информацию о субъекте?

Страница досок на существующем сегодня сайте, которую мы перестраиваем, в среднем составляет около 20 тыс. Просмотров страниц в месяц - так что это не очень большой трафик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...