|
|
|
| помогите реализовать работу с тегами (как на http://www.habr.ru) малой кровью...
опишу задачу подробней:
в системе управления контентом есть понятие "пост" у этого поста есть теги, по которым этот пост классифицируется, это дело храним в таблице
posts
id - первичный ключ
header - заголовок поста
post - тело поста
tags - теги перечисленные через запятую
|
также есть т.н. облако тегов, с помощью которого осуществляется навигация по контенту, для того чтобы отобразить это облако необходимо знать сколько постов было зарегестрировано на каждый тег. храним все это дело в следующей таблице:
cloud
id - первичный ключ
tag - тег
count - сколько постов на этом теге
|
существует несколько действий с постами:
1.добавление
2.редактирование
3.удаление
при добавлении необходимо добавить сам пост, добавить новые теги в облако и добавить по единице на каждый тег облака, который был перечислен в посте
при редактировании необходимо изменить пост и удалить из облака уделенные теги из поста и добавить новый или добавить по единице на каждый тег который был заново перечислен в посте
при удалении необходимо удалить пост и удалить или вычесть лишние теги из облака.
Помогите справиться с задачей с как можно меньшим обращением из пхп к базе | |
|
|
|
|
|
|
|
для: dagmor
(01.02.2007 в 14:42)
| | ` | |
|
|
|
|
|
|
|
для: dagmor
(02.02.2007 в 00:50)
| | неужели никто не может мне помочь? | |
|
|
|
|
|
|
|
для: dagmor
(02.02.2007 в 16:57)
| | Большинство вероятно смущает термин "фолксономия", я например, не знаю, что это такое, боюсь, что многих это тоже заставляет проходить мимо темы. | |
|
|
|
|
|
|
|
для: cheops
(02.02.2007 в 20:45)
| | хехе (:
фолксономия - это будущее веба
лучше чем здесь описан этот термин я не нашел
http://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D0%BB%D0%BA%D1%81%D0%BE%D0%BD%D0%BE%D0%BC%D0%B8%D1%8F
думаю достаточно интересная тема, чтобы ее разобрать и реализовать | |
|
|
|
|
|
|
|
для: dagmor
(03.02.2007 в 01:15)
| | Фолксономия (англ. folksonomy, от folk — народный + taxonomy — таксономия) — неологизм, обозначающий практику совместной категоризации посредством произвольно выбираемых ключевых слов. Другими словами, это понятие относится к спонтанному сотрудничеству группы людей с целью организации информации в категории, которое обращает на себя внимание, благодаря тому, что оно полностью отличается от традиционных формальных методов фасетной классификации. Как правило, это явление возникает только в неиерархических сообществах, таких как общедоступные веб-сайты, а не в многоуровневых коллективах. Так как организаторы информации обычно являются её же основными пользователями, фолксономия производит результаты, более точно отражающие совокупную концептуальную модель информации всей группы.
Облако тегов
Примером фолксономической организации контента можно считать "облако тегов": представленные в произвольном порядке ключевые слова записей или страниц, где размер шрифта ключевого слова тем выше, чем больше раз оно встречается. Одними из первых "облако тагов" стали применять зарубежные сайты, построенные по принципу Веб 2.0. Это служба закладок del.icio.us, фотоблог Flickr. Среди отечественных сайтов, первыми внедривших "облако тагов" в качестве рубрикатора, можно назвать Мой Круг и Habrahabr.
По материалам википедии | |
|
|
|
|
|
|
|
для: dagmor
(04.02.2007 в 18:37)
| | ` | |
|
|
|
|
|
|
|
для: cheops
(02.02.2007 в 20:45)
| | давайте попробуем поменять заголовок топика, а то что-то никто не заходит сюда | |
|
|
|
|
|
|
|
для: dagmor
(05.02.2007 в 15:27)
| | Лучше новую тему завести с более конкретной поставновкой задачи - есть то-то на входе, на выходе должно получиться то-то и то-то... | |
|
|
|
|
|
|
|
для: cheops
(05.02.2007 в 16:00)
| | а чем моя постановка задачи не устраивает? вроде все понятно обьяснил, даже ссылок надавал с примерами.... спрашивайте, что может быть непонятно, я поясню...
ps: 2cheops мне по большей части интересно ваше мнение (т.к. считаю вас наиболее компетентным специалистом на данном форуме). как бы вы решили поставленную задачу? | |
|
|
|
|
|
|
|
для: dagmor
(05.02.2007 в 17:10)
| | Вот это поле бы
tags - теги перечисленные через запятую
|
100% нужно бы в отдельную таблицу - на каждый пост столько записей, сколько в нём тэгов, иначе медленно и не удобно будет. | |
|
|
|
|
|
|
|
для: cheops
(06.02.2007 в 00:21)
| | т.е. сделать в таблице posts поле id_tags которое будет указывать на другую таблицу? что это может дать?
у меня есть решение этой задачи, но оно может положить базу при одновременном добавлении или редактировании нескольких постов с большим количеством тегов | |
|
|
|
|
|
|
|
для: dagmor
(06.02.2007 в 02:41)
| | Сделать таблицу tags, в которую заносить строки, описывающие теги.
и таблицу hits, в которую заносить строки, описывающие попадания тегов в посты. | |
|
|
|
|
|
|
|
для: Trianon
(06.02.2007 в 10:12)
| | разъясните пожалуйста, что это дает и как этим пользоваться при добавлении, редактировании и удалении поста | |
|
|
|
|
|
|
|
для: 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 в 16:56)
| | существует ли какой-нибудь метод проще и оптимизированней предложенного мной | |
|
|
|
|
|
|
|
для: dagmor
(07.02.2007 в 17:50)
| | я разочарован вашим форумом | |
|
|
|