Я не знаю, соответствуют ли они оптимальным, но DotNetKicks и Kigg являются реализациями клонов Digg с открытым исходным кодом. Вы можете посмотреть, как они делают теги и поиск.
Мои лучшие догадки без долгих размышлений :) 1003 *
- Мне никогда не нравилась идея сериализации нескольких значений в одно поле, поэтому строки с разделителями, хранящиеся в одном поле, не привлекают меня ... могут работать для путей смежности с деревьями, но они всегда упорядочены, а теги не нужны быть. Похоже, это обременит работу оператора LIKE, которую вы могли бы сделать, чтобы найти их.
Так что мой первоначальный дубль - это, вероятно, Entity -> EntityTag <- Tag. </p>
Этот подход облегчает поиск предметов через тег, присоединяется через EntityTag, называет это днем.
Вам нужна дополнительная операция, чтобы выбрать отдельные теги для набора результатов. Итак, а.) Вытащить результирующий набор, б.) Нормализовать пространство тегов. Я думаю, что вы делаете это независимо от того, какой ответ на # 1 - даже вставка тегов в одно поле все равно приведет к дублированию тегов (и вы должны десериализовать их для выполнения этой операции - так что больше работы, еще один аргумент для полностью реляционного подход).
Все еще легко. Вот одна из областей, где сериализованный подход работает лучше. Не нужно присоединяться к дочерним тегам, это прямо в сущности. Тем не менее, извлечение тегов 0..n через соединение двух таблиц не кажется мне слишком сложным. Если вы говорите о соображениях, сначала создайте его нормализованным, а затем оптимизируйте через кеш или денорм.
Другой вариант - «сделать оба». Это похоже на преждевременную оптимизацию, но вы могли бы сделать полностью нормализованный подход для поддержки любых операций, ориентированных на теги, и сериализовать при сохранении, чтобы иметь денормализованную версию прямо там, в сущности. Немного больше работы, некоторый потенциал, чтобы потерять рассогласование, если не полностью охвачено, но лучше всего из обоих миров, если есть реальные ограничения для полностью нормализованного способа в ваших случаях использования.
Lucene также интересен, вы можете объявлять определенные метаданные в индексах IIRC, так что вы можете потенциально использовать поиск тегов и в этом случае. Я подозреваю, что если вы зайдете слишком далеко по этому пути, то в итоге у вас возникнут некоторые разногласия между тем, что вы храните в базе данных, и индексом. Я могу положительно говорить о Lucene, он очень функциональный и простой в использовании - я полагаю .Text использовал его для своих возможностей поиска и поддерживал все weblogs.asp.net до его переключения на Community Server. Я бы придерживался его для полнотекстового поиска, если MSSQL не на картинке / недостаточно, решить проблемы с тегами в базе данных imo.