Схема тегов для обеспечения функциональности, аналогичной синонимам тегов Stack Overflow - PullRequest
2 голосов
/ 08 февраля 2011

В настоящее время я проектирую базу данных для небольшого приложения для закладок (использующего MySQL), и я хотел бы сделать что-то умное с системой тегов.Хотя изначально это не проблема, я хочу реализовать нечто похожее на синонимы тегов Stack Overflow, где каждый тег может иметь несколько вложенных тегов, которые соответствуют ему.Это позволило бы при поиске тегов «hi» возвращать закладки, помеченные, например, «hello».

Я знаком с созданием системы тегов «многие ко многим», в которой у вас есть три таблицы: «теги», 'posts' и 'posts_tags', и я хотел бы, чтобы синонимы соответствовали этому.

Сначала я думал, что у каждого тега может быть поле 'parent', которое содержит идентификатор тега, который он отображаетк.Тем не менее, это может привести к большому количеству потерянных тегов и станет кошмаром для управления;Я ищу скорость и элегантность.

Если у кого-то есть какие-либо идеи / рекомендации, это будет высоко оценено!Спасибо

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

Вы можете использовать дочернюю для родительской таблицы. Например,

<b>Tags</b>
tagId, pk

<b>ChildToParentTags</b>
childTagId, pk, fk (pk of this table, fk into Tags table)
parentTagId, fk (fk into Tags table, have an index for this column).

<b>Post</b>
postId, pk

<i>assume many-to-many post to tag relationship</i>
<b>PostToTag</b>
postId, pk
tagId, pk

Использование childTagId в качестве pk таблицы ChildToParentTags ограничивает тег 0 или 1 родителем, но позволяет родителю иметь несколько дочерних элементов.

Запрос на пост по тегу:

select
 post.postId,
 post.otherStuff
from
 post 
  inner join postToTag on
   post.postId = postToTag.postId
  inner join tag on
   postToTag.tagId = tag.tagId
where
 tag.something = 'desired tag value'
0 голосов
/ 03 августа 2017

Вы можете использовать систему, которая назначает группы. Создание отношений родитель-потомок, как упоминалось выше, не очень помогает. Принимая во внимание, что создание групповых отношений помогает ускорить поиск.

Создать таблицу, которая называется группой -

id, name, groupid

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

Это ускоряет поиск, потому что всякий раз, когда вам нужно что-то искать, все, что вам нужно сделать, это найти groupid. Все элементы с одинаковым groupid могут быть найдены без предложения IN.

Я предполагаю, что эта таблица будет иметь отношение FK с некоторой другой таблицей. Везде, где у вас есть отношение FK, вместо «id» с отношением PK-FK вы можете иметь «groupid» как отношение FK.

...