Изменения

Перейти к: навигация, поиск

Vitaphoto: Облака тегов

2859 байтов добавлено, 00:26, 7 ноября 2009
Нет описания правки
'''[[rupedia:Облако тегов|Облака тегов]]''' — набор ссылок, расположенных кластерно или хаотически с размером каждой ссылки, зависящим от её «важности». Конкретнее, в случае «тегов» (меток), каждая ссылка ведёт на все элементы, имеющие данный тег, а размер ссылки зависит от количества таких элементов. Таким образом, наиболее популярные метки оказываются крупными, а непопулярные — мелкими.
Однако, классические, «тупые» облака тегов — обычно свалка в духе «фигпоймёшь», что и где, особенно, если тегов много. (в одном моём [[Vitaphoto]] их больше 250…) Но сама-то идея — замечательная! И в [[Vitaphoto]] хочется заменить облаками тегов навигацию по альбомам. Как это сделать?
Итак, идея: часто бывает, что какие-то Как же это сделать? Как оптимизировать облака тегов для удобства навигации? Какие теги являются «подтегами» других. Например, все фотографии с людьми помечены тегом «люди», одновременно некоторые исключить из них помечены тегом с именем конкретного человека. Или же: все фотографии с какой-нибудь тусовки-выезда помечены тегом «Тусовка-выезд 2009», при этом внутри неё тоже существовали «подмероприятия», например, «Экскурсия на Фиолетовые Холмы», и тегами с такими названиями помечены соответствующие множества фотографий. Зачем показывать эти «подтеги», к примеру, на главной страницеоблака? Не нужно это.
Правда, может быть ситуация, когда два тега А и Б встречаются на фотографиях только вместе (возникает, конечно, вопрос, нафига ж их тогда два, а не один?) — в этом случае, по-видимому, должны включаться оба.== Идеи ==
А при переходе «внутрь» какого-то тега — можно сужать множество тегов облака до '''Идея первая''': нужно показывать облако только из тегов, встречающихся вместе с нимхотя бы один раз в просматриваемом множестве фотографий (коим может быть, например, множество фотографий, имеющих заданный набор тегов).
== SQL =='''Идея вторая''': часто бывает, что какие-то теги являются «подтегами» других. Например, все фотографии с людьми помечены тегом ''«люди»'', а некоторые из них в то же время помечены именем конкретного человека. Другой пример: все фотографии с какой-нибудь тусовки-выезда помечены тегом ''«Тусовка-выезд 2009»'', при этом у поездки были «подмероприятия», например, ''«Экскурсия на Фиолетовые Холмы»'', и соответствующие подмножества фотографий помечены, кроме тега ''«Тусовка-выезд 2009»'', тегами подмероприятия.
«Подтеги» каких-либо из отображаемых тегов отображать не нужно, так как они скорее всего имеют смысл только в контексте своего родителя. Правда, возможна ситуация, когда два тега A и B являются «подтегами» друг друга, то есть — встречаются на фотографиях исключительно вместе. Возникает, конечно, вопрос, нафига ж их тогда действительно два, а не один? То есть эта ситуация находится за гранью разумного, и хотя встречаться, скорее всего, будет, но редко и в большинстве случаев — по ошибке или совпадению (что-то вроде: ''«ну да, ну получилось, что из фотографий людей в галерее только фотографии моей девушки… ну ревнивая она…»''). Так что в ситуации «тождественности» тегов A и B в облаке их нужно отображать оба. '''Идея третья''': разумно разбить одно большое облако на несколько меньших по различным диапазонам популярности тегов — скорее всего, трём: одно облако очень популярных тегов, второе — средних по популярности, третье — совсем разовых. Отображать по умолчанию, естественно, первое. '''Идея четвёртая''': все предыдущие идеи относились к облакам, сопутствующим каждому множеству фотографий и отображаемых на странице наряду с другими элементами управления. Однако можно создать отдельную страницу с большим облаком, содержащим '''все теги''' системы вообще — чтобы иметь «общий вид». == SQL для реализации идеи № 1 == А теперь вопрос: как это реализовать средствами MySQLидею № 1? :)
Есть таблица-отношение <tt>'''tag_image'''</tt> с двумя полями «ID тега» (<tt>'''ti_tag'''</tt>) и «ID изображения» (<tt>'''ti_image'''</tt>). Каждая строчка означает, что фотография с соответствующим ID имеет соответствующий тег.
<code-sql>SELECT DISTINCT t0.tp_tag1 FROM tag_pair t0
LEFT JOIN tag_image t1 ON t0.tp_tag2!=0 AND t1.ti_tag=tp_tag1LEFT JOIN tag_image t2 ON t0.tp_tag2!=0 AND t2.ti_image=t1.ti_image AND t2.ti_tag=tp_tag2WHERE t0.tp_tag2=0
OR t2.ti_tag IS NULL
OR NOT EXISTS (SELECT * FROM tag_pair t3
WHERE t3.tp_tag1=t0.tp_tag1 AND t3.tp_tag2!=t0.tp_tag2
OR t3.tp_tag1=t0.tp_tag2 AND t3.tp_tag2!=t0.tp_tag1)</code-sql>
 
Соответственно, чтобы ограничить отдаваемое множество набором тегов, встречающихся вместе с определённым тегом (например, с ID=123), нужно просто добавить ещё одно соединение с таблицей tag_pair:
 
<code-sql>SELECT DISTINCT t0.tp_tag1 FROM tag_pair t0
JOIN tag_pair t_123 ON t_123.tp_tag1=123 AND t_123.tp_tag2=t0.tp_tag1
LEFT JOIN tag_image t1 … и так далее</code-sql>
== 3D-облака тегов ==
Пример:
<html><object type="application/x-shockwave-flash" data="</html>{{localimage:tagcloud.swf}}<html>" « width="640" height="480"><param name="movie" value="</html>{{localimage:tagcloud.swf}}<html>" » />
<param name="bgcolor" value="#ffffff" />
<param name="AllowScriptAccess" value="always" />

Навигация