Пометка объектов базы данных (строковые теги) и поиск тегов - PullRequest
1 голос
/ 09 февраля 2011

Несколько объектов в нашей базе данных должны быть помечены строковыми тегами (совершенно произвольно).Одним из решений является классическое представление отношения «многие ко многим»:


table Customer     CustomerId, CustomerName  
table Product      ProductId, ProductName
table Tags         TagId, TagName
table CustomerTags CustomerId, TagId
table ProductTags  ProductId, TagId

Другое решение - иметь столбец XML, представляющий теги с вторичным XML-индексом PATH 1005 * для улучшения последовательного поиска:


table Customer     CustomerId, CustomerName, Tags
table Product      ProductId, ProductName, Tags

Где теги - это столбец XML, в котором есть теги типа и индекс PATH, например / tags / tag

Первое решение ускоряет поиск, но добавляет больше таблиц.Второе решение медленнее, но чище.

Я новичок в SQL и, возможно, что-то упустил из виду, поэтому любая информация будет высоко оценена.

1 Ответ

2 голосов
/ 09 февраля 2011

Мой голос был бы за первое решение.

Прежде всего, XML обрабатывается медленнее в SQL Server 2008, чем эквивалентная прямая установка тега tbl-bridge.Если вы хотите найти все продукты с тегом X, обычный запрос SQL будет начинаться с тега-> product_tag-> product.Вы можете создать XML-индексы (как вы уже упоминали), но они даже больше, чем сами XML, и вам нужно как минимум два индекса на тег (один для основного и один для VALUE - вам нужен вторичный индекс VALUE вместо вторичного индекса PATH.

Во-вторых, если вы переименовываете / удаляете тег, вам придется пройти через структуру XML каждого связанного объекта (продукта / клиента) ииспользуйте xml.modify (который имеет очень ограниченную поддержку - например, только один узел может быть изменен за один раз).

...