LINUX.ORG.RU

SQL - пишем движок для форума


0

0

будет это связка perl+MySQL

Меня интересует такой вопрос - как в MySQL организовывать топики, говорят что делать для каждого таблицу будет медленно(IMHO для СУБД медленно не будет, возможны небольшие тормоза при обращении скрипта для считывания каждой таблици), ещё вроде есть некие виртуальные таблици(что такое не знаю), но MySQL их пока нет, есть Postgre...

вот собственно как MySQL сделать топики чтоб не очень тормозно

Я не профи в этом деле, могу сказать как делал я (мой пост недавний это как раз к этому форуму): таблица где хранятся информация о форумах (название, описание и т.п, а так же их id) таблица, где хранятся топики (тема, автор, их id, а также id форума, к которому они относятся) таблица, где хранятся посты (тема, автор, id и id топика).

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

roy ★★★★★
()
Ответ на: комментарий от roy

Я сделал так:

Есть таблица форумов - forums(id integer, name char(60));

Есть таблица сообщений - messages(id integer, parent integer, subject char(80), msg text, forum integer);

При этом каждое сообщение однозначно привязано к какому-либо форуму по полю ID, и может быть привязано к другому сообщению по полю PARENT.

Т.е. все сообщения с parent>0 являются ответами на другие сообщения, а сообщения с PARENT=0 являются инициирующими тред сообщениями :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

У меня сперва была крайне похожая схема. Но я подумал что впоследуюзем с этим трудно будет разгребаться, и переделал. Я наверное ошибался, но снова переделывать уже не буду :) Хотя у меня сообщения пока никак не привязываются :)

roy ★★★★★
()

2no-dashi:

таблица forum(id integer, name char(60)); - это есть таблица топиков?

то есть, как я понял, и no-dashi и roy, вы оба предлагаете делать одну таблицу где будут хранится сообщения со всех форумов и распозноваться по forum_id

тогда вохникает вопрос как сортировать сообщения внутри топика - IMHO должно быть, для постов, что-то типа PRIMARY KEY по топикам, как это сделать в одной табличе - ума не прилажу...

возможно подойдет вариант для каждого топика делать таблицу :

forums(id integer, $table_name char(60));

$table_name(PRIMARY KEY id integer, parent integer, subject char(80), msg text);

golodranez ★★★★
() автор топика

Советую глянуть в исходники инвижена.

Многое прояснит..

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

TLoD_Snake
()
Ответ на: комментарий от golodranez

> таблица forum(id integer, name char(60)); - это есть таблица топиков?

Не-е-е-ет... Это таблица форумов типа General/Desktop/Admin/etc на LOR.

А топики - это те messages, у которых parent<=0 :-)

Примеры:

1. список топиков для форума General

select messages.author,messages.date,messages.subject
from messages,forum
where forum.id=messages.forum and forum.name='General'

2. получить список постов для конкретного топика уже
сложнее (я это делал скриптом), вот примерный код на PHP:

$conn = connect_db();

function get_messages($id,$conn) {
   // Печатает рекурсивно все сообщения, для которых parent=$id
   $res = mysql_query(
      "select count(*) from messages where parent=".$id,
      $conn
   );
   $line = mysql_fetch_row($res);
   $cnt = $line[0];
   mysql_free_result($res);
   if ($cnt>0) {
      $res = mysql_query(
         "select m1.id,m1.subject,m1.author from messages where parent=".$id,
         $conn
      );
      print "<ul>";
      while ($line=mysql_fetch_row($res)) {
          print "<li>".$line[1]." by ".$line[2]."</li>";
          get_messages($line[o],$conn);
      }
      print "</ul>";
      mysql_free_result($res);
   }
}

get_messages(-1,$conn);

mysql_close($conn);

В принципе, если не нужна древовидность, то можно делать три
таблицы: форумы, топики и сообщения. Если нужна древовидность,
то лучше топики "выкинуть", чтобы упростить алгоритм (что я и
сделал).

Впрочем, даже если древовидность не нужна, имеет смысл все равно
выкинуть "топики" и заполнять поле parent ID'ом "верхнего" сообщения.

no-dashi ★★★★★
()
Ответ на: комментарий от golodranez

Ты немного не так понял :) В принципе у нас с nj-dashi похоже, только у него древовидная структура, а у меня есть. Похожесть в том, что у нас всего 2 (3) таблицы, где хранятся данные форумы. Т.е. у нас у обоих есть табица форумов, соедержащих id форума, его название, у меня: таблица топиков, содержащих к какому id форума относятся, и имеющих свой id. таблица постов, содержащих, к какому id топика они относятся.

у no-dashi: тлько таблица постов, каждый пост содержит пле, указывающее к какому id форума он относится, и поле, указывающее, к какому другому посту он привязан.

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

roy ★★★★★
()
Ответ на: комментарий от roy

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

это я согласен, просто как ты сказал - я не так понял

2roy: т.е. у тебя все посты,со всех топиков, хранятся в одной таблице и при запросе(кликанью юзера по топику), выбираются из этой таблицы по id топика, а сортировать посты в топике, я так понял, остаётся только по дате и времени...

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

у no-dashi: есть две таблицы - 1-форумов, 2-постов...

>поле, указывающее, к какому другому посту он привязан.

это понятно, но должен быть какой-то id у главного поста(который топик), по которому привязываются остальные, и этот id должен быть уникален...

древовидный форум это что-ли как на linux.ru.net?

P.S. если я опять что не понял, ногоми не бейте, и если можно поправьте :)

golodranez ★★★★
() автор топика
Ответ на: комментарий от golodranez

> это понятно, но должен быть какой-то id у главного поста(который топик)

А нет нужды его держать :-) Каждый пост привязан на один из вышестоящих через поле PARENT, каждый пост имеет свой ID. А тот, у которого PARENT=-1, является топиком :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

>А нет нужды его держать :-)

но ведь, все посты и все топики в одной таблице, т.е. будет куча топиков и у всех PARENT=-1

как разобраться, какой пост привязан к какому топику?

golodranez ★★★★
() автор топика
Ответ на: комментарий от golodranez

> как разобраться, какой пост привязан к какому топику?

Через последовательность запросов :-) Нужда восстановить топик по посту возникает достаточно редко. В крайнем случае всегда можно добавить поле, которое будет ссылаться на основание треада (дерева постов), т.е. "топика" в твоей терминологии :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

>Нужда восстановить топик по посту возникает достаточно редко

да нет...не надо мне восстанавливать топик по посту...

Посмотрим на процесс:

1)Мы подаём запрос показать нам все топики,т.е. все записи в таблице где PARENT=-1

2)Выбираем нужный топик(типа мышкой кликаем)

3)и каким фигом, спрашивается, нам надо составить запрос, чтоб СУБД вытащила из таблицы все посты, которые относятся к этому топику ?

IMHO, так как ты говоришь, все записи в таблице с PARENT=-1 неотличимы друг от друга, несчитая 'темы'

golodranez ★★★★
() автор топика
Ответ на: комментарий от golodranez

> и каким фигом, спрашивается, нам надо составить запрос, чтоб СУБД
> вытащила из таблицы все посты, которые относятся к этому топику ?

Я уже писал пример кода... Если не знаешь, как это может выглядеть, посмотри сюда: http://www.chelsot.ru/forum_l2.php?div=9&threadid=1 :-)

> все записи в таблице с PARENT=-1 неотличимы друг от друга

Я такого не говорил :-)

У КАЖДОГО поста есть свой уникальный ID - он же первичный ключ записи. Каждая запись может через поле PARENT ссылаться на ID вышестоящей записи (вышестоящего поста).

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

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

2no-dashi и roy

Спасибо за помощь - вроде вехал!

golodranez ★★★★
() автор топика
Ответ на: комментарий от Waso

> точилось только под *nix-based браузеры?

Известная бага Internet Explorer'а, описанная вот тут: http://www.linux.org.ru/view-message.jsp?msgid=752527#754638

Ну и еще можно посмотреть вот здесь:http://www.linux.org.ru/view-message.jsp?msgid=753945 :-)

Понятно, что я это поправил - но пока лень выкладывать, это все только тестируется пока

no-dashi ★★★★★
()
Ответ на: комментарий от golodranez

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

roy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.