|
|
|
|
|
для: dagmor
(07.02.2007 в 17:50)
| | я разочарован вашим форумом | |
|
|
|
|
|
|
|
для: dagmor
(06.02.2007 в 16:56)
| | существует ли какой-нибудь метод проще и оптимизированней предложенного мной | |
|
|
|
|
|
|
|
для: dagmor
(01.02.2007 в 14:42)
| | попытаюсь описать свое решение, чтобы было понятно какие слабые стороны я хочу оптимизировать:
у меня есть страница на которой выводятся посты и облако тегов
<html>
...
<!-- примерно так выглядит облако -->
<div id="cloud">
<a class ="{weight[{tag[1]}}" href="http://myhost/search/{tag[1]}">{tag}</a>
..
<a class ="{weight[{tag[N]}}" href="http://myhost/search/{tag[N]}">{tag}</a>
</div>
<!-- конец облака -->
...
<!-- примерно так выглядит пост -->
<div class="post">{post[1]}<span class="tags">
<a href="http://myhost/search/{ptag[1][{post[1]}]}">{ptag[1][{post[1]}]}</a>
..
<a href="http://myhost/search/{ptag[N][{post[1]}]}">{ptag[N][{post[1]}]}</a>
</span></div>
..
<div class="post">{post[N]}<span class="tags">
<a href="http://myhost/search/{ptag[1][{post[N]}]}">{ptag[1][{post[N]}]}</a>
..
<a href="http://myhost/search/{ptag[N][{post[N]}]}">{ptag[N][{post[N]}]}</a>
</span></div>
<!-- конец постов -->
...
</html>
|
чтобы вывести эту страницу мне необходимы
{tag} - массив тегов в облаке
{weight} - массив веса тегов, соответствует массиву {tag}
{post} - массив постов
{ptag} - массив тегов поста, соответствует массиву {post}
все эти данные я беру из таблиц БД:
posts - Результат выборки помещаю в массив $posts, который преобразую для отображения.
id - первичный ключ
post - тело поста
tags - теги перечисленные через запятую
cloud - Результат выборки помещаю в массив $cloud, который преобразую для отображения.
id - первичный ключ
tag - тег (UNIQUE)
count - сколько постов на этом теге (этот параметр преобразую в weight либо 1:1 к одному либо в любой другой пропорции)
|
с отображением проблем не возникает, всего два простых запроса к БД... (и отображение всех тегов `count` которых не равен нулю)
проблемы возникают при добавлении, редактировании и удалении поста:
т.к. облако тегов должно отражать актуальное состояние информационной системы, то в ней должны храниться уникальные теги и если тег не перечислен ни в одном посте, то его не должно быть в облаке...
для добавления и редактирования поста у меня есть следующая форма
<html>
...
<form action="index.php?{action}={post_number}" method="post"> <!-- {action} = add или edit -->
<textarea name="post">{post}</textarea>
<input name="tags" type="text" value="{tags}" />
<input name="ok" type="submit" />
</form>
...
</html>
|
для удаления используется ссылка <a href="http://myhost/index.php?del={post_number}">Удалить</a>
добавление, редактирование, удаление поста из таблицы posts происходит с помощью одного запроса к БД...
а для того чтобы поддерживать актуальность облака тегов необходимо делать следующие запросы:
1. при добавлении
делаю
INSERT INTO `posts` (`post`,`tags`) VALUES ('{post}','{tags}'); (+1 запрос)
разделяю строку с принятыми тегами и выполняю следующий запрос:
INSERT INTO `tags` (`tag`, `count`) VALUES ('{tag[1]}',1),(...,1),('{tag[n]}',1)
ON DUPLICATE KEY UPDATE `count`=`count`+1; (+1 запрос)
в итоге 2 запроса
2. при редактировании
получаю номер поста и достаю из поля `posts`.`tags` старое значение. (+1 запрос)
разделяю результат по запятым и формирую запрос:
UPDATE `tags` SET `count`=`count`-1 WHERE `tag`='{prev_tag[1]}' OR ... OR `tag`='{prev_tag[N]}'; (+1 запрос)
затем делаю:
UPDATE `posts` SET `post`='{new_post}', `tags`='{new_tags}' WHERE `id`='{post_id}';(+1 запрос)
разделяю {new_tags} по запятым и формирую следующий запрос:
INSERT INTO `tags` (`tag`, `count`) VALUES ('{new_tag[1]}',1),(...,1),('{new_tag[n]}',1)
ON DUPLICATE KEY UPDATE `count`=`count`+1; (+1 запрос)
в итоге 4 запроса
3. при удалении
получаю номер поста и достаю из поля `posts`.`tags` старое значение. (+1 запрос)
разделяю результат по запятым и формирую запрос:
UPDATE `tags` SET `count`=`count`-1 WHERE `tag`='{prev_tag[1]}' OR ... OR `tag`='{prev_tag[N]}'; (+1 запрос)
затем делаю:
DELETE этого поста;(+1 запрос)
в итоге 3 запроса
так вот таким способом можно повесить базу при одновременном добавлении\редактировании\удалении постов большим количеством юзверов и длинным списком тегов...
так вот я спрашивал как можно оптимизировать БД и логику операций и запросов | |
|
|
|
|
|
|
|
для: Trianon
(06.02.2007 в 10:12)
| | разъясните пожалуйста, что это дает и как этим пользоваться при добавлении, редактировании и удалении поста | |
|
|
|
|
|
|
|
для: dagmor
(06.02.2007 в 02:41)
| | Сделать таблицу tags, в которую заносить строки, описывающие теги.
и таблицу hits, в которую заносить строки, описывающие попадания тегов в посты. | |
|
|
|
|
|
|
|
для: cheops
(06.02.2007 в 00:21)
| | т.е. сделать в таблице posts поле id_tags которое будет указывать на другую таблицу? что это может дать?
у меня есть решение этой задачи, но оно может положить базу при одновременном добавлении или редактировании нескольких постов с большим количеством тегов | |
|
|
|
|
|
|
|
для: dagmor
(05.02.2007 в 17:10)
| | Вот это поле бы
tags - теги перечисленные через запятую
|
100% нужно бы в отдельную таблицу - на каждый пост столько записей, сколько в нём тэгов, иначе медленно и не удобно будет. | |
|
|
|
|
|
|
|
для: cheops
(05.02.2007 в 16:00)
| | а чем моя постановка задачи не устраивает? вроде все понятно обьяснил, даже ссылок надавал с примерами.... спрашивайте, что может быть непонятно, я поясню...
ps: 2cheops мне по большей части интересно ваше мнение (т.к. считаю вас наиболее компетентным специалистом на данном форуме). как бы вы решили поставленную задачу? | |
|
|
|
|
|
|
|
для: dagmor
(05.02.2007 в 15:27)
| | Лучше новую тему завести с более конкретной поставновкой задачи - есть то-то на входе, на выходе должно получиться то-то и то-то... | |
|
|
|
|
|
|
|
для: cheops
(02.02.2007 в 20:45)
| | давайте попробуем поменять заголовок топика, а то что-то никто не заходит сюда | |
|
|
|
|