0

我正在使用歌曲数据库系统在多对多关系数据库上使用 mysql 学习 php。下面显示了三个表的组织方式:

Songs       Link        Tags
=======     =====       =======
Sid          Sid        Tid
Songname     Tid        Tagname

现在我在想如果有标签同义词怎么办?因为我正在计算每首歌曲的匹配百分比,并结合输入的标签。我不想为一首歌曲输入 20 个标签,所以我涵盖了所有可能性,但因此破坏了匹配百分比,因为输入了 4 个标签,这导致 4/20 匹配,即 20%,而它可能必须是 4/8 (50%)。

有没有一种聪明的方法来为同义词创建一个表,确保标签是“分组的”,以便首先用这个表检查输入的标签,然后这个/这些“头标签”与链接表匹配导致歌曲名和输入标签的匹配百分比/“头部标签”的总数×100%?

最重要的是,您将如何创建一个查询,当输入一首新歌曲时,新标签会被输入到它们所属的组中,而现有的标签会被跳过。同时将这个头标签也链接到新歌?

我不确定这个想法是否现实,但我想知道其他系统如何做到这一点,以确保您获得准确的匹配,同时也考虑同义词。

4

2 回答 2

0

当然 - 你的部分答案只是更进一步:

tag_synonym
-----------
Tid
Tid2

然后您可以查询是否有任何同义词被链接以及原始标签

于 2012-06-13T20:13:08.243 回答
0

您可以在表标签中添加第三行:

Tags
--------------
Tid
Tagname
HeadTagId

所以每个标签都会引用一个 HeadTag,而 HeadTags 会引用它们自己。

关于查询,我想象两种情况。任何一个

- 标签是预定义的:当输入一首新歌曲时,您只需在歌曲中添加一行,在链接中添加与它所拥有的标签一样多的行。无需触摸表标签。

或者

- 用户可以定义新标签:输入新歌曲时,检查标签是否已经存在,如果不存在,用户应该能够输入新标签,并将它们定义为头标签或选择现有的“头标签” ' 对于他们(即第三行标签中引用的标签)。

无论如何,要检索给定歌曲的头部标签,您需要类似以下内容:

SELECT HeadTagId FROM Tags
JOIN Link ON Tags.Tid=Link.Tid
WHERE Link.Sid=12345

如果您想要直接使用 head_tag 的名称(而不是 Id):

SELECT Tagname FROM Tags AS TagParents
JOIN Tags AS TagChildren ON TagParents.Tid=TagChildren.HeadTagId
JOIN Link ON Link.Tid=TagChildren.Tid
WHERE Link.Sid=12345

编辑:在这种情况下,您不需要多对多关系,因为每个标签必须要么声明它是主标签,要么声明它是同义词,并指向主标签。这是由第三行完成的。对我来说,将它包含在同一个表中是有意义的,因为它是每个标签的必要属性,并且每个标签只有一个这样的属性。

所以主要标签是指自己,即:

Tid: 1
Tagname: 'Classical'
HeadTagId: 1

同义词指的是主要标签:

Tid: 2
Tagname: 'Classical music'
HeadTagId: 1

这种方法的唯一问题是您没有直接的主要标签列表,但您可以使用简单的方法生成它:

SELECT DISTINCT HeadTagId FROM Tags
于 2012-06-13T22:38:57.783 回答