Как бы вы структурировали схему БД форума?

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

Почему? Почему бы не хранить все это в одной таблице?

Что-то вроде: thread_id, thread_date, thread_text, thread_author

Почему это делается именно так? Как бы вы это сделали?


person Community    schedule 20.02.2009    source источник
comment
Я не согласен, эта тема широко обсуждалась здесь и на других сайтах. stackoverflow.com/questions/548793/   -  person barfoon    schedule 21.02.2009
comment
@barfoon, речь идет не о создании форума, он хочет знать, почему phpBB делает то, что делает. Я думаю, это хороший вопрос. Вот если бы он спросил, как лучше построить форум, я бы с вами согласился.   -  person Malfist    schedule 21.02.2009
comment
Как вы думаете, что является лучшим способом? не звучит специфично для phpBB.   -  person barfoon    schedule 21.02.2009


Ответы (7)



На самом деле я не знаю, почему это делается, но одна из причин, которую я могу себе представить, — это оптимизация поиска и извлечения метаданных сообщения (дата, автор и т. д.).

Согласно Джоэлу (а Джоэл всегда прав! ;-) базы данных хранят свои данные в поля фиксированной длины, составляющие записи фиксированной длины, поэтому легко переходить от одной строки к другой, просто увеличивая указатель на длину записи в байтах. Но большие текстовые поля, используемые для хранения текста сообщения, не могут иметь фиксированный размер, потому что длина сообщения варьируется в широком диапазоне, и создание хранилища фиксированной длины, достаточно большого для хранения всех сообщений, приведет к потере огромного количества места. Это означает, что хранение текста сообщения в той же таблице, что и другая информация, значительно замедлит работу, когда вы хотите получить метаданные для большого количества сообщений, как это делается каждый раз, когда кто-то просматривает главную страницу форума.

Чтобы получить лучшее из обоих миров, нужно поместить поля фиксированной длины (т. е. все, кроме текста поста) в одну таблицу, а поля переменной длины (т. е. текст поста) — в другую.

person David Z    schedule 20.02.2009
comment
Это может быть верно для некоторых (скажем, «устаревших» или «примитивных») СУБД, но едва ли для большинства современных — postgresql.org/docs/current/static/storage-toast.html. - person Milen A. Radev; 21.02.2009

Никогда не заглядывал внутрь phpBB, но, возможно, это из-за полнотекстовой индексации. Механизм Inno-db для основной таблицы, чтобы разрешить транзакции, а что нет. MyIsam для полнотекстового индексирования.

person Mario    schedule 20.02.2009
comment
Что ж... phpBB, по крайней мере, в версиях до 3.0, использовал MyISAM для всех таблиц. - person Brian Neal; 21.02.2009

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

Во-вторых, размещение всего в одной таблице значительно усложняет добавление в модель данных позже, если вам, например, нужно больше данных для каждого thread_id.

Для правильного проектирования схем баз данных требуется определенное образование. Вы должны начать с http://en.wikipedia.org/wiki/Database_normalization. Убедитесь, что понимаете третью нормальную форму.

person auspicacious    schedule 20.02.2009

InnoDB не поддерживает FULLTEXT индексирование, а MyISAM не поддерживает транзакции.

Не знаю phpBB, но, наверное, поэтому они разделяют столы.

person Quassnoi    schedule 20.02.2009

Они не хранят текст в одной таблице из-за размера таблицы.

Таким образом, даже при очень большом количестве записей таблица списка потоков будет небольшой, хорошо проиндексирована и ее можно будет быстро просмотреть. Доступ к тексту осуществляется только при необходимости с использованием первичного ключа, который также является быстрым.

Думаю, для небольших форумов в этом нет необходимости, так как есть небольшие накладные расходы на кодирование.

person Julien    schedule 20.02.2009
comment
Столбцы TEXT хранятся вне строки в обоих движках, это вряд ли влияет на размер таблицы. - person Quassnoi; 21.02.2009
comment
Я согласен - я думаю, что объяснение Марио правильное. - person Jeff Atwood; 21.02.2009

В дополнение к отличному ответу Жюльена, довольно часто сообщения перемещаются в другие темы (скажем, администратором или модератором). Наличие текста в «таблице сообщений» помогает поддерживать это.

person Brian Neal    schedule 20.02.2009