|
|
|
| Как сделать форум?
Думаю так:
1) таблица форумов: id, название форума, просмотры, посты, последнее сообщение.
2) Таблица тем: Id форума, id темы, название темы, просмотры, посты, последнее сообщение.
3) Таблица сообщений: Id форума, id темы, автор, сообщение.
Всё верно? ничего не забыл?
Да и самое важное. каким образом id автоматом делать? | |
|
|
|
|
|
|
|
для: Job
(19.06.2007 в 15:16)
| | 1) таблица форумов: ... посты, последнее сообщение.
Что за посты еще? Да и последнее сообщение лучше доставать дополнительным SQL-запросом из таблицы с сообщениями.
1) Таблица тем: ... посты, последнее сообщение.
То же самое.
Да и самое важное. каким образом id автоматом делать?
Добавить "auto_increment". | |
|
|
|
|
|
|
|
для: Unkind
(19.06.2007 в 15:44)
| | ага, auto_increment, а при добавлении в таблицу просто пустой оставлять? ''?
$query = ("INSERT INTO `forum` VALUES ('', 'Общий форум', '16', '23', 'Job');");
Так?
(id, название форума, количество просмотров, количество тем, последнее сообщение.) | |
|
|
|
|
|
|
|
для: Job
(19.06.2007 в 15:54)
| | ага, auto_increment, а при добавлении в таблицу просто пустой оставлять?
auto_increment это свойство, а не поле. Да, заполнять id не надо.
количество тем
Зачем? Подсчитывать лучше заново каждый раз. | |
|
|
|
|
|
|
|
для: Unkind
(19.06.2007 в 15:59)
| | > Подсчитывать лучше заново каждый раз.
серьезно? | |
|
|
|
|
|
|
|
для: kasmanaft
(19.06.2007 в 16:01)
| | серьезно?
Более чем. | |
|
|
|
|
|
|
|
для: kasmanaft
(19.06.2007 в 16:01)
| | > Подсчитывать лучше заново каждый раз.
серьезно?
Я бы возразил, причем полностью обоснованно... Это касается и кол-ва тем и кол-ва постов в темах.
Для мааааленьких форумов - это не играет никакой роли... а теперь берем этот же форум через полгода... Когда кол-во постов суммарно будет нескольно сотен тысяч и тем неколько тысяч...
Для получения кол-ва тем запрос "select count(*) from thems" - терпимо, может быть... а вот для кол-ва постов уже другое (хотя и схоже) "select count(*) from posts where thems_id=456"
Такие запросы на больших таблицах займут мало того, что время, но и добавят нагрузки на сервак, что повлечет замедление выполнения запросов - итог - форум подтормаживать начинает...
Если на то пошло - правильнее будет иметь маленькую служебную табличку, куда вносить кол-во тем (+1 при создании/разбивании, -1 при удалении/слиянии... ил тупо на все операции повесить пересчет оператором count(*))...
А в таблице тем добавить поле - кол-во сообщений (опять-же изменять только при создании/удалении/слиянии/разбитии/переносе постов... отслеживать или простым пересчетом)...
Для чтения форум ГОРАЗДО быстрее будет работать, а для внесения изменения в одну табличку - замедление операций будет не так заметно + привычнее для людей, т.к. любой посетитель больше времени занимается ЧТЕНИЕМ форума, а не писаниной... | |
|
|
|
|
|
|
|
для: ZuArt
(19.06.2007 в 16:51)
| | Надо просто ставить индексы на столбцы, по которые учавствуют в условиях (WHERE). Тогда "гораздо" не будет...
А вот "ручной" подсчет создает массу проблем. Если что случилось, что начнет все разваливаться. | |
|
|
|
|
|
|
|
для: Unkind
(19.06.2007 в 16:58)
| | Разваливаться НИЧЕГО не начнет... т.к. эти поля по большей части просто информационные и не завязаны ни на что...
А их верификация - еще раз говорю... на любую операцию изменения темы повесить запрос update srvtbl set thcnt=(select count(*) from themes); (синтаксис ошибочен 100% - тут суть указана)... и так же для постов - это более чем легко.... | |
|
|
|
|
|
|
|
для: ZuArt
(19.06.2007 в 17:02)
| | Разваливаться НИЧЕГО не начнет
А как же подсчет сообщений в теме для постраничной навигации?
Не понятно о чем спор. Добавьте индексы и сравните скорости. | |
|
|
|
|
|
|
|
для: ZuArt
(19.06.2007 в 17:02)
| | переставайте пороть чушь.
Такие решения провоцируют базу на логические противоречия.
А для ускорения нужно применять аккуратные запросы, оптимально построенные индексы, как указал Unkind.
Если и этого не хватает, можно разбить таблицу на частый-легкий и редкий-тяжелый контент, как по вертикали (вынеся тела сообщений в параллельную таблицу) так и по горизонтали (разделив таблицу на свежак и архив) . Это денормализация, конечно... но во благо. | |
|
|
|
|
|
|
|
для: 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'");
а как проще? | |
|
|
|
|
|
|
|
для: Job
(19.06.2007 в 16:01)
| |
UPDATE `for_you` SET `ball` = `ball` + 5 WHERE `dot` = 123;
|
| |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Job
(19.06.2007 в 16:26)
| | Можете int. Максимальный id тогда не может быть больше 2147483647. Можете unsigned int. В два раза больше - 4294967295.
id должен быть либо PRIMARY KEY, либо UNIQUE KEY, либо просто INDEX. | |
|
|
|
|
|
|
|
для: Unkind
(19.06.2007 в 16:34)
| | а почему ошибка? что не так? | |
|
|
|
|
|
|
|
для: Job
(19.06.2007 в 16:35)
| | id должен быть либо PRIMARY KEY, либо UNIQUE KEY, либо просто INDEX. | |
|
|
|