Casual
Освоившийся
Дата регистрации:
13.10.2012 17:58:28
Сообщений: 20
Как наиболее эффективно спроектировать базу под это дело? Какие таблицы создать? Что где хранить?
Я подумал и пришел к следующему результату. Хотелось бы услышать критику и советы по оптимизации.
Таблица users - информация о пользователях.
Поля:
id - уникальный ид
login - отображаемое имя
и другие.
Таблица sections - содержит информацию о разделах.
Поля:
id,
section_name - название раздела
и другие, если нужны.
Таблица threads - информация о темах.
Поля:
id,
thread_name - название темы
parent_id - id раздела из таблицы sections.
возможно еще какие-то поля.
Таблица messages - сами сообщения.
Поля:
id
parent_id - id темы из таблицы threads
user_id - id пользователя из таблицы users
message - сам текст сообщения.
Получается четыре таблицы: users, sections, threads и messages.
Пользователь заходит на главную страницу форума - ему надо показать список разделов. Легко! Просто отображаем содержимое таблицы sections.
Пользователь заходит в конкретный раздел - нужно показать список содержащихся в этом разделе тем.
Выбираем записи из таблицы threads у которых parent_id соответствует id нашего раздела. Всего один запрос к БД.
Пользователь заходит в конкретную тему - выбираем записи из таблицы messages с parent_id равным id данной темы и потом лезем в таблицу users за никами авторов сообщений. Таким образом два запроса получается в данном случае.
Создание новой темы - просто добавляем запись в threads и в messages. Можно легко переносить темы из раздела в раздел. Легко получить все сообщения конкретного пользователя. Также легко добавить еще уровень иерархии, который объединит в себе разделы, если понадобиться.
На практике еще возникнет ситуация, когда кол-во тем в разделе и сообщений в одной теме больше, чем мы хотим отображать на одной странице. Поэтому, вероятно, не лишним будет добавить в таблицы sections и threads счетчики кол-во тем\сообщений и обновлять их каждый раз когда добавляется\удаляется\переносится тема или сообщение. Это позволит избежать запроса COUNT.
Вообщем, можно ли здесь что-нибудь улучшить?