Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Создание форума. Принцип работы.
 
 автор: Job   (19.06.2007 в 15:16)   письмо автору
 
 

Как сделать форум?

Думаю так:
1) таблица форумов: id, название форума, просмотры, посты, последнее сообщение.
2) Таблица тем: Id форума, id темы, название темы, просмотры, посты, последнее сообщение.
3) Таблица сообщений: Id форума, id темы, автор, сообщение.


Всё верно? ничего не забыл?

Да и самое важное. каким образом id автоматом делать?

   
 
 автор: Unkind   (19.06.2007 в 15:44)   письмо автору
 
   для: Job   (19.06.2007 в 15:16)
 

1) таблица форумов: ... посты, последнее сообщение.
Что за посты еще? Да и последнее сообщение лучше доставать дополнительным SQL-запросом из таблицы с сообщениями.
1) Таблица тем: ... посты, последнее сообщение.
То же самое.

Да и самое важное. каким образом id автоматом делать?
Добавить "auto_increment".

   
 
 автор: Job   (19.06.2007 в 15:54)   письмо автору
 
   для: Unkind   (19.06.2007 в 15:44)
 

ага, auto_increment, а при добавлении в таблицу просто пустой оставлять? ''?

$query = ("INSERT INTO `forum` VALUES ('', 'Общий форум', '16', '23', 'Job');");
Так?


(id, название форума, количество просмотров, количество тем, последнее сообщение.)

   
 
 автор: Unkind   (19.06.2007 в 15:59)   письмо автору
 
   для: Job   (19.06.2007 в 15:54)
 

ага, auto_increment, а при добавлении в таблицу просто пустой оставлять?
auto_increment это свойство, а не поле. Да, заполнять id не надо.

количество тем
Зачем? Подсчитывать лучше заново каждый раз.

   
 
 автор: kasmanaft   (19.06.2007 в 16:01)   письмо автору
 
   для: Unkind   (19.06.2007 в 15:59)
 

> Подсчитывать лучше заново каждый раз.
серьезно?

   
 
 автор: Unkind   (19.06.2007 в 16:01)   письмо автору
 
   для: kasmanaft   (19.06.2007 в 16:01)
 

серьезно?
Более чем.

   
 
 автор: ZuArt   (19.06.2007 в 16:51)   письмо автору
 
   для: kasmanaft   (19.06.2007 в 16:01)
 

> Подсчитывать лучше заново каждый раз.
серьезно?

Я бы возразил, причем полностью обоснованно... Это касается и кол-ва тем и кол-ва постов в темах.

Для мааааленьких форумов - это не играет никакой роли... а теперь берем этот же форум через полгода... Когда кол-во постов суммарно будет нескольно сотен тысяч и тем неколько тысяч...

Для получения кол-ва тем запрос "select count(*) from thems" - терпимо, может быть... а вот для кол-ва постов уже другое (хотя и схоже) "select count(*) from posts where thems_id=456"

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

Если на то пошло - правильнее будет иметь маленькую служебную табличку, куда вносить кол-во тем (+1 при создании/разбивании, -1 при удалении/слиянии... ил тупо на все операции повесить пересчет оператором count(*))...
А в таблице тем добавить поле - кол-во сообщений (опять-же изменять только при создании/удалении/слиянии/разбитии/переносе постов... отслеживать или простым пересчетом)...

Для чтения форум ГОРАЗДО быстрее будет работать, а для внесения изменения в одну табличку - замедление операций будет не так заметно + привычнее для людей, т.к. любой посетитель больше времени занимается ЧТЕНИЕМ форума, а не писаниной...

   
 
 автор: Unkind   (19.06.2007 в 16:58)   письмо автору
 
   для: ZuArt   (19.06.2007 в 16:51)
 

Надо просто ставить индексы на столбцы, по которые учавствуют в условиях (WHERE). Тогда "гораздо" не будет...
А вот "ручной" подсчет создает массу проблем. Если что случилось, что начнет все разваливаться.

   
 
 автор: ZuArt   (19.06.2007 в 17:02)   письмо автору
 
   для: Unkind   (19.06.2007 в 16:58)
 

Разваливаться НИЧЕГО не начнет... т.к. эти поля по большей части просто информационные и не завязаны ни на что...

А их верификация - еще раз говорю... на любую операцию изменения темы повесить запрос update srvtbl set thcnt=(select count(*) from themes); (синтаксис ошибочен 100% - тут суть указана)... и так же для постов - это более чем легко....

   
 
 автор: Unkind   (19.06.2007 в 17:13)   письмо автору
 
   для: ZuArt   (19.06.2007 в 17:02)
 

Разваливаться НИЧЕГО не начнет
А как же подсчет сообщений в теме для постраничной навигации?

Не понятно о чем спор. Добавьте индексы и сравните скорости.

   
 
 автор: Trianon   (19.06.2007 в 17:36)   письмо автору
 
   для: ZuArt   (19.06.2007 в 17:02)
 

переставайте пороть чушь.
Такие решения провоцируют базу на логические противоречия.
А для ускорения нужно применять аккуратные запросы, оптимально построенные индексы, как указал Unkind.
Если и этого не хватает, можно разбить таблицу на частый-легкий и редкий-тяжелый контент, как по вертикали (вынеся тела сообщений в параллельную таблицу) так и по горизонтали (разделив таблицу на свежак и архив) . Это денормализация, конечно... но во благо.

   
 
 автор: Job   (19.06.2007 в 16:01)   письмо автору
 
   для: Unkind   (19.06.2007 в 15:59)
 

И ещё вопрос, как прибавлять к старым данным новые.

Делаю так:

$query = mysql_query("SELECT * FROM `for_you` WHERE `dot` = '123';");
$row = mysql_fetch_object($query);
$big = $row->big;
$big2 = ($big+5);
$query = mysql_query("UPDATE `for_you` SET ball='$big2' where `dot`='123'");

а как проще?

   
 
 автор: Unkind   (19.06.2007 в 16:05)   письмо автору
 
   для: Job   (19.06.2007 в 16:01)
 


UPDATE `for_you` SET `ball` = `ball` + 5 WHERE `dot` = 123;

   
 
 автор: Job   (19.06.2007 в 16:26)   письмо автору
 
   для: Unkind   (19.06.2007 в 16:05)
 

а тип для поля id какой? INT?

Вот мой запрос:

CREATE TABLE `forum` (

`id` INT( 1 ) NOT NULL AUTO_INCREMENT ,
`name` TEXT NOT NULL ,
`see` TEXT NOT NULL ,
`post` TEXT NOT NULL ,
`end` TEXT NOT NULL
)

Ответ MySQL:

#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

   
 
 автор: Unkind   (19.06.2007 в 16:34)   письмо автору
 
   для: Job   (19.06.2007 в 16:26)
 

Можете int. Максимальный id тогда не может быть больше 2147483647. Можете unsigned int. В два раза больше - 4294967295.

id должен быть либо PRIMARY KEY, либо UNIQUE KEY, либо просто INDEX.

   
 
 автор: Job   (19.06.2007 в 16:35)   письмо автору
 
   для: Unkind   (19.06.2007 в 16:34)
 

а почему ошибка? что не так?

   
 
 автор: Unkind   (19.06.2007 в 16:38)   письмо автору
 
   для: Job   (19.06.2007 в 16:35)
 

id должен быть либо PRIMARY KEY, либо UNIQUE KEY, либо просто INDEX.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования