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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: реализация фолксономии

Сообщения:  [1-10]   [11-17] 

 
 автор: dagmor   (08.02.2007 в 14:57)   письмо автору
 
   для: dagmor   (07.02.2007 в 17:50)
 

я разочарован вашим форумом

   
 
 автор: dagmor   (07.02.2007 в 17:50)   письмо автору
 
   для: dagmor   (06.02.2007 в 16:56)
 

существует ли какой-нибудь метод проще и оптимизированней предложенного мной

   
 
 автор: 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 запроса

так вот таким способом можно повесить базу при одновременном добавлении\редактировании\удалении постов большим количеством юзверов и длинным списком тегов...

так вот я спрашивал как можно оптимизировать БД и логику операций и запросов

   
 
 автор: dagmor   (06.02.2007 в 12:56)   письмо автору
 
   для: Trianon   (06.02.2007 в 10:12)
 

разъясните пожалуйста, что это дает и как этим пользоваться при добавлении, редактировании и удалении поста

   
 
 автор: Trianon   (06.02.2007 в 10:12)   письмо автору
 
   для: dagmor   (06.02.2007 в 02:41)
 

Сделать таблицу tags, в которую заносить строки, описывающие теги.
и таблицу hits, в которую заносить строки, описывающие попадания тегов в посты.

   
 
 автор: dagmor   (06.02.2007 в 02:41)   письмо автору
 
   для: cheops   (06.02.2007 в 00:21)
 

т.е. сделать в таблице posts поле id_tags которое будет указывать на другую таблицу? что это может дать?

у меня есть решение этой задачи, но оно может положить базу при одновременном добавлении или редактировании нескольких постов с большим количеством тегов

   
 
 автор: cheops   (06.02.2007 в 00:21)   письмо автору
 
   для: dagmor   (05.02.2007 в 17:10)
 

Вот это поле бы
tags - теги перечисленные через запятую

100% нужно бы в отдельную таблицу - на каждый пост столько записей, сколько в нём тэгов, иначе медленно и не удобно будет.

   
 
 автор: dagmor   (05.02.2007 в 17:10)   письмо автору
 
   для: cheops   (05.02.2007 в 16:00)
 

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

ps: 2cheops мне по большей части интересно ваше мнение (т.к. считаю вас наиболее компетентным специалистом на данном форуме). как бы вы решили поставленную задачу?

   
 
 автор: cheops   (05.02.2007 в 16:00)   письмо автору
 
   для: dagmor   (05.02.2007 в 15:27)
 

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

   
 
 автор: dagmor   (05.02.2007 в 15:27)   письмо автору
 
   для: cheops   (02.02.2007 в 20:45)
 

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

   

Сообщения:  [1-10]   [11-17] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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