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

Sql 标记模式提供类似于Stack Overflow的标记同义词的功能,sql,mysql,tags,schema,synonym,Sql,Mysql,Tags,Schema,Synonym,我目前正在使用MySQL为一个小型书签应用程序设计一个数据库,我想用标签系统做一些巧妙的事情。虽然一开始这不是一个问题,但我想实现一些类似于Stack Overflow的标记同义词的东西,其中每个标记可以有多个子标记映射到它。这将允许对“hi”的标记搜索返回标记为“hello”的书签 我熟悉构建一个多对多标记系统,其中有三个表:“tags”、“posts”和“posts\u tags”,我想让同义词与此相适应 我最初的想法是,每个标记都可以有一个“parent”字段,其中包含它映射到的标记的ID

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

我熟悉构建一个多对多标记系统,其中有三个表:“tags”、“posts”和“posts\u tags”,我想让同义词与此相适应

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


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

您可以使用子表到父表。比如说,

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表的主键将标记限制为0或1个父项,但允许父项具有多个子项

按标签查询post:

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

创建一个名为“组”的表-

id, name, groupid
应为同义词的每个元素分配一个groupId,该ID可以是代码分配的编号。每当有元素移动,或将新元素分配给组,或从组中移动现有元素时,您所要做的就是更新groupid

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


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

Ah ok。那么,若要按标签查看帖子,是否需要执行两个连接?是的,两个连接可以从标签到用该标签标记的帖子。另外,否。如果tagId是标记名,例如java或schema,那么您可以将连接放到标记表中。