2010-07-19 2 views
1

Я знаю, что материал тегов упоминался много раз, но я не могу видеть, что этот вопрос адресован этому вопросу.Как реализовать тегирование при обмене тегами с разными объектами?

Из этой нити Recommended SQL database design for tags or tagging

Я могу видеть, что лучший способ тегов установки, скорее всего,

Item (item_id, item_content) 

Tag (tag_id, tag_title) 

TagMapping(map_id, tag_id, item_id) 

Но что, если я хочу поделиться теги между двумя различными объектами элементов? Например, сообщения в блогах и статьи. (давайте не будем обсуждать, должны ли это быть отдельные сущности или нет :)) Вы делаете что-то подобное, что кажется очень неправильным?

Post (post_id, post_content) 
Article (article_id, article_content) 

Tag (tag_id, tag_title) 

TagMapping(map_id, tag_id, post_id(nullable), article_id(nullable)) 

ответ

3

Ортодоксальный ответ будет заключаться в использовании стратегии наследования таблицы между Почтой и статьей. Сделайте их обоими предметами. Поэтому (это SQL может быть полным бредом, но вы получите идею):

create table Item (integer item_id primary key) 
create table Post (integer item_id primary key references Item, varchar(2000) post_content) 
create table Article (integer item_id primary key references Item, varchar(2000) article_content) 
create table Tag (integer tag_id primary key) 
create table TagMapping (integer item_id references Item, integer tag_id references Tag, constraint primary key (item_id, tag_id)) 

Так как статьи и посты существуют в таблице элементов, и это то, что теги относятся.

Вы извлекаете сообщения и статьи так же, как и сейчас. Если вы хотите получить их по тегу, вы выполните соединение через элемент. Если вы хотите получить детали в этом соединении, вы должны выполнить внешнее соединение как с Post, так и с Article, а затем проигнорировать нулевые столбцы.

У вас очень часто также есть столбец в родительской таблице, здесь Item, который похож на «integer subtype_discriminator not null», который затем содержит, скажем, 1, если элемент является сообщением, 2, если это статья, и т. д. Это немного облегчает понимание того, какие столбцы игнорировать или где искать детали, если вы хотите сделать второй запрос для них после простого соединения.

+0

Вы предлагаете, чтобы каждая таблица объектов (столбец/статья) имела столбец item_id, который ссылается на таблицу элементов? –

+0

Да, и это также их первичный ключ.Столбы Post и Article являются в основном вспомогательными таблицами для Item, который является основной таблицей. –

+0

Итак, если вы хотите, чтобы все сообщения с тегами соответствовали заданному шаблону, это: select distinct p. * From post p, tagmapping tm, tag t где p.item_id = tm.item_id и tm.tag_id = t.tag_id и t.label например,% foo% –

0

Если вы хотите сохранить реляционное отображение для этой схемы (в отличие от использования документа на основе решения, как MongoDB, где ваши метки будут Денормализованным), то вы можете создать еще один уровень отображения.

Конвенция, которую я использую в этой ситуации, состоит в том, чтобы каждый элемент такого же типа назывался «ilktype», а каждый отдельный элемент назывался «рубрикой», поэтому в блоге ilktype есть много рубрик (сообщения).

Как это будет выглядеть в схеме является следующее:

Post(post_id,post_content) 
Article(.....) 
Foo(.....) 
Tag(tag_id,tag_title) 
TagMapping(map_id,tag_id,ilktype_id,rubric_id) 

Вы затем сохранить список ilktypes, либо в виде констант в конфигурационном файле или в таблице ilktype, а затем может получить деталь упомянутого в таблицу сопоставления меток, присоединив ilktype_id к соответствующей таблице (post/article/foo).

1

Вы можете прикрепить тэги к «Tag Board» лица и прикрепить один ко всем объектам, которые должны быть помечены:

TagBoard (tagboard_id) 

Post (post_id, tagboard_id, post_content) 
Article (article_id, tagboard_id, article_content) 

Tag (tag_id, tag_title) 
TagMapping (map_id, tag_id, tagboard_id) 

С другой стороны, вы можете использовать наследование, чтобы как сообщение и статьи наследуют от «Taggable "(или, чтобы обеспечить большую гибкость, из общего объекта" Item "). Drupal, в частности, делает это (с сообщениями и статьями и почти все остальное - узлами в базе данных Drupal).

Смежные вопросы