2

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

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

我最初的想法是每个标签都可以有一个“父”字段,其中包含它映射到的标签的 ID。但是,这可能会导致大量孤立标签,并且管理起来将是一场噩梦;我正在寻找速度和优雅。

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

4

2 回答 2

1

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

标签
标记ID,PK

ChildToParentTags
childTagId, pk, fk(此表的pk,fk进Tags表)
parentTagId, fk(fk 到 Tags 表中,有该列的索引)。

邮政
postId, PK

假设多对多帖子到标签关系
PostToTag
postId, PK
标记ID,PK

使用 childTagId 作为 ChildToParentTags 表的 pk 将标签限制为 0 或 1 个父级,但允许一个父级有多个子级。

按标签查询帖子:

选择
 post.postId,
 post.otherStuff
从
 邮政
  内部加入 postToTag
   post.postId = postToTag.postId
  内部连接标签
   postToTag.tagId = tag.tagId
在哪里
 tag.something = '想要的标签值'
于 2011-02-08T16:05:26.537 回答
0

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

创建一个称为组的表 -

id, name, groupid

作为同义词的每个元素都应该分配一个 groupId(可以是一个代码分配的数字)。每当元素移动,或将新元素分配给组,或从组中移动现有元素时,您所要做的就是更新 groupid。

这使得搜索速度更快,因为每当您必须搜索某些内容时,您所要做的就是搜索一个 groupid。可以搜索具有相同 groupid 的所有元素,而无需 IN 子句。

我假设该表将与其他表具有 FK 关系。无论您在哪里有 FK 关系,都可以将“groupid”作为 FK 关系,而不是将“id”与 PK-FK 关系。

于 2017-08-03T15:42:17.400 回答