标记模式以提供与Stack Overflow的标记同义词类似的功能

时间:2011-02-08 15:53:07

标签: sql mysql tags schema synonym

我目前正在为一个小书签应用程序(使用MySQL)设计一个数据库,我想用标签系统做一些聪明的事情。虽然最初不是问题,但我希望实现类似于Stack Overflow的标签同义词,其中每个标签可以有多个映射到它的子标签。这将允许标签搜索'hi'以返回标记为'hello'的书签。

我熟悉构建一个多对多标签系统,其中有三个表:'tags','posts'和'posts_tags',我想让同义词适合这个。

我最初的想法是每个标记都有一个“父”字段,其中包含它映射到的标记的ID。然而,这可能会导致许多孤立的标签,并且将成为管理的噩梦;我正在寻找速度和优雅。

如果有人有任何想法/指导,我们将不胜感激!感谢

2 个答案:

答案 0 :(得分:1)

您可以将子项用于父表。例如,

Tags
tagId, pk

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

Post
postId, pk

assume many-to-many post to tag relationship
PostToTag
postId, pk
tagId, pk

使用childTagId作为ChildToParentTags表的pk将标记限制为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'

答案 1 :(得分:0)

您可以使用分配组的系统。如上所述创建父子关系并没有多大帮助。而创建群组关系有助于加快搜索速度。

创建一个名为groups的表 -

id, name, groupid

应该为同义词的每个元素分配一个groupId(可以是代码分配的编号)。只要元素移动,或者为组分配了新元素,或者从组移动了现有元素,您只需更新groupid。

这使搜索速度更快,因为每当您需要搜索某些内容时,您所要做的就是搜索groupid。具有相同groupid的所有元素都可以在不需要IN子句的情况下进行搜索。

我假设这个表与其他一些表有FK关系。无论你有FK关系,不是拥有PK-FK关系的“id”,你可以将“groupid”作为FK关系。