Как бы вы создать базу данных для поддержки следующих функций мечения:Проектирования баз данных для Tagging
- элементы могут иметь большое количество тегов
- поиска по всем пунктам, которые помечены с заданным набором тегов должен быть быстрым (детали должны иметь все теги, так что это и поиска данных, а не OR-поиск)
- создания/написания элементов может быть медленнее, чтобы обеспечить быстрый поиск/чтение
в идеале, поиск из все элементы, помеченные (по крайней мере) набором n заданных тегов, должны выполняться с использованием одного оператора SQL. Поскольку количество тегов для поиска, а также количество тегов для любого элемента неизвестны и могут быть высокими, использование JOIN непрактично.
Любые идеи?
Спасибо за все ответы.
Если я не ошибаюсь, данные ответы показывают, как делать OR-поиск по тегам. (Выберите все элементы, имеющие одну или несколько тегов n). Я ищу эффективный И-поиск. (Выберите все элементы, которые имеют все п теги - и, возможно, больше.)
Я должен сказать, что ответ немного близорук, потому что использование типа битового поля базы данных ограничивает вас определенным количеством бит. Это не означает, что каждый элемент ограничен определенным количеством тегов, но может быть только определенное количество уникальных тегов во всей системе (обычно до 32 или 64). – 2009-06-29 21:02:06
Предполагая реализацию 3nf (Question, Tag, Question_has_Tag) и растровый индекс в Tag_id в Question_has_Tag, индекс растрового изображения должен быть перестроен каждый раз, когда вопрос добавляет или удаляет тег. Запрос типа `select * from question q inner join question_has_tag qt где tag_id in (выберите tag_id из тегов, где (что мы хотим), минус select tag_id из тегов, где (что мы не делаем)` должно быть хорошо и масштабироваться, предполагая право индексы b-tree существуют на среднем столе – 2010-02-24 16:41:00
Ссылка «Эта статья» мертва. Мне бы хотелось прочитать :( – mpen 2010-10-21 00:19:25