Как разработать схему для чего-то вроде тегов вопросов StackOverflow? - PullRequest
9 голосов
/ 17 сентября 2010

У меня 3 плана:

1, в таблице вопросов:

question
------------------------------------
id title   content  ...       tags
------------------------------------
1  aaa     bbb      ...       tag1,tag2,tag3 (use , to split more tags)  

2, в таблице тегов и разделении:

tags
------------------------------------
id tag 
------------------------------------
1  tag1,tag2,tag3  (use , to split more tags)

3, в таблице тегов:

tags
------------------------------------
id tag 
------------------------------------
1  tag1
2  tag2
3  tag3 

Я думаю, что план 3 лучше, но каково ваше мнение?

Есть еще какие-нибудь хорошие идеи для этой реализации?

Спасибо за помощь:)

Ответы [ 4 ]

12 голосов
/ 17 сентября 2010

Эти шаблоны называются mysqlicious, scuttle и toxi (от наименьшего к наиболее нормализованному).

Все они имеют свои преимущества и недостатки. Вы можете прочитать довольно хороший анализ здесь:

http://forge.mysql.com/wiki/TagSchema (версия WayBackMachine)

Обратите внимание, что mysqlicious сильно зависит от способности вашей базы данных эффективно выполнять FULLTEXT поиск.

Это означает, что для MySQL с InnoDB и для некоторых других систем это очень непрактично.

6 голосов
/ 17 сентября 2010

Соотношение между тегами и контентом составляет многие ко многим .Это означает, что один тег может быть связан с несколькими единицами контента, а одна единица контента может быть связана с несколькими тегами.

Для реализации этого в базе данных вы можете использовать вспомогательную таблицу с именем ContentTags.Отношение Content к ContentTags является отношением один ко многим;отношение Tags к ContentTags является отношением один ко многим.

#Tags Table
Id   Text
 1  'Tag1'
 2  'Tag2'
 3  'Tag3'


#Content Table
Id   Content
 1   "some content"
 2   "other content"
 3   "more content"

#ContenTags Table
ContentId TagId
1         1
1         2
2         1
2         2
2         3
3         1

Как видите, отношение четко отражено (контент 1 связан с тегами 1 и 2; контент 2 - этосвязан с тегами 1, 2 и 3, контент 3 связан только с тегом 1)

1 голос
/ 17 сентября 2010

Правильный подход - создать отношения «один-много», то есть у вас есть один комментарий и несколько тегов.Из WIKI

В технологии баз данных отношения один ко многим (также известные как ко многим) возникают, когда один объект связан со многими вхождениями в другом объекте.Например, в одном клубе много членов.

И основной концепцией в дизайне базы данных является Нормализация базы данных .

Так что я бы сделал это такэто.

comments
------------------------------------
id_comment title  content 
------------------------------------
12         aaa     bbb

tags
------------------------------------
id_tag comment_id tag 
------------------------------------
1      12         tag1
2      12         tag2
3      12         tag3 
1 голос
/ 17 сентября 2010

Зависит от того, насколько нормализованы ваши данные.

Во-первых, я смущаюсь, когда вижу столбец «id» в таблице, которая не уникальна.По крайней мере, переименуйте столбец в «question_id».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...