РЕДАКТИРОВАТЬ : Для людей, создающих системы маркировки. Не читай это. Это не то, что вы ищете. Я спросил об этом, когда не знал, что все СУБД имеют свои собственные методы оптимизации, просто используйте простую схему «многие ко многим».
У меня есть система сообщений, которая имеет миллионы сообщений. С каждым сообщением может быть связано бесконечное количество тегов.
Пользователи могут создавать теги, в которых есть заметки, дата создания, владелец и т. Д. Тег почти похож на само сообщение, поскольку люди могут публиковать заметки о теге.
У каждой ассоциации тегов есть владелец и дата, поэтому мы можем видеть, кто и когда добавил тег.
Мой вопрос: как я могу это реализовать? Это должен быть быстрый поиск сообщений по тегу или тегов по почте. Кроме того, пользователи могут добавлять теги к сообщениям, вводя имя в поле, наподобие строки поиска в Google, оно должно заполнить оставшуюся часть имени тега.
В данный момент у меня есть 3 решения, но я не уверен, какое из них лучшее или есть лучший способ.
Обратите внимание, что я не показываю расположение заметок, так как это будет тривиально, как только я найду правильное решение для тегов.
Способ 1. Связанный список
tagId в записи указывает на связанный список в tag_assoc, приложение должно просматривать список до тех пор, пока flink = 0
post: id, content, ownerId, date, tagId, notesId
tag_assoc: id, tagId, ownerId, flink
tag: id, name, notesId
Метод 2. Денормализация
tags - это просто поле VARCHAR или TEXT, содержащее массив тегов с разделителями табуляции tagId: ownerId. Это не может быть фиксированный размер.
post: id, content, ownerId, date, tags, notesId
tag: id, name, notesId
Метод 3. Токси
(от: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html,
также то же самое здесь: Рекомендуемый дизайн базы данных SQL для тегов или тегов )
post: id, content, ownerId, date, notesId
tag_assoc: ownerId, tagId, postId
tag: id, name, notesId
Метод 3 поднимает вопрос, как быстро будет проходить итерация по каждой строке в tag_assoc?
Методы 1 и 2 должны быть быстрыми для возврата тегов по почте, но для сообщений по тегу должна быть создана другая таблица поиска.
Последнее, о чем я должен беспокоиться, это оптимизация поиска тегов по имени, я еще не решил это.
Я сделал диаграмму ASCII здесь: http://pastebin.com/f1c4e0e53