Я создаю небольшой форум для практики. Я вижу, что такие форумы, как phpBB, сохраняют текст потока в отдельной таблице.
Зачем? Почему бы не сохранить все это в одной таблице?
Что-то вроде: thread_id, thread_date, thread_text, thread_author
Почему так делается? Как бы вы это сделали?
Я нашел эту классную схему онлайн.
схема http://img.ruphp.com/php/schemaFull.jpg
кажется довольно хорошим стартером для схемы базы данных любого базового форума.
Я знаю, что это старо, но подумал, что я опубликую это для всех, кто снова найдет этот вопрос.
Я действительно не знаю, почему это сделано, но одна из причин, почему я могу себе представить, – оптимизировать поиск и поиск метаданных сообщения (дата, автор и т. Д.).
Согласно Joel (и Joel всегда правильные! 😉 базы данных хранят свои данные в полях фиксированной длины, составляющих записи фиксированной длины, поэтому легко перейти от одной строки к следующей, просто увеличив указатель на длину байта запись. Но большие текстовые поля, используемые для хранения текстовых сообщений, не могут иметь фиксированный размер, поскольку длина сообщения варьируется в широком диапазоне, а создание хранилища фиксированной длины, достаточно большое для хранения всех сообщений, будет тратить огромные объемы пространства. Это означает сохранение текстового сообщения в той же таблице, что и другая информация, что сделает его намного медленнее, если вы хотите получить метаданные для большого количества сообщений, как это делается каждый раз, когда кто-то просматривает главную страницу форума.
Способ получить лучшее из обоих миров состоит в том, чтобы поместить поля фиксированной длины (т.е. все, кроме текстового) в одну таблицу, и поля переменной длины (то есть текст сообщения) в другой.
Никогда не заглядывал в кишки phpBB, но сделал это из-за полнотекстового индексирования. Двигатель Inno-db для основного стола, чтобы разрешить транзакцию, а что нет. MyIsam для полнотекстового индексирования.
Во-первых, расположение файловой системы большинства реляционных баз данных таково, что хранение больших блоков произвольного текста или данных может замедлить работу системы. Поскольку данные обычно хранятся по строкам, при выполнении поиска база данных теперь пропускает текстовые поля переменной длины даже при поиске несвязанных полей.
Во-вторых, все, что помещается в одну таблицу, значительно сложнее добавить к модели данных позже, если вам нужно больше данных для каждого потока_ид, например.
Для разработки схем баз данных требуется некоторое образование. Вы должны начать с http://en.wikipedia.org/wiki/Database_normalization . Не забудьте понять третью нормальную форму.
InnoDB
не поддерживает индексацию FULLTEXT
а MyISAM
не поддерживает транзакции.
Не знаю phpBB
, но, вероятно, именно поэтому они разделяют таблицы.
Они не сохраняют текст в одной таблице из-за размера, который может достигнуть таблица.
Таким образом, даже при очень большом количестве записей таблица списка нитей небольшая, хорошо проиндексирована и быстро ее сканировать. Доступ к тексту осуществляется только при необходимости, используя первичный ключ, который также очень быстрый.
Для небольших форумов я считаю, что это не обязательно, поскольку накладные расходы немного.
В дополнение к отличному ответу Жюльена, довольно часто перемещаются сообщения в другие потоки (например, администратор или модератор). Наличие текста в «почтовой таблице» помогает поддержать это.