我有一个带有两个表的数据库:页面和标签,其结构如下:
每个页面都与许多标签相关联(使用page_tags列)。我的问题是关于pages.page_tags,特别是哪种方式最有效地存储上述关联?
一种方法是全文索引page.page_tags并在那里存储相关标签的文本,例如:apple orange fruit marmalade
第二种方式也是全文索引page.page_tags,但存储相关标签的ID,例如:132 14 24192 14
第三种方法是制作第三个表:tag_assoc,结构如下:
tag_assoc:page_id,tag_id
(对于页面中存在的每个标记,将存在包含页面和标记的ID的记录)
您认为哪种方式最有效? 特别是关于:
如果没有,你会建议什么?
答案 0 :(得分:0)
如果您使用全文索引,我会做这样的事情
表1 - 页
pageid
name
date
category
... etc etc other page meta data here
表2 - page_fulltext
pageid
page_title_fulltext
page_body_fulltext
以p为例
第1页有page_body_fulltext“懒狗的快速棕色狐狸跳”
第2页有page_body_fulltext“懒熊的快速红狐狸跳跃”
进行全文搜索,您可以找到单个标记词,但也可以找到确切的字符串
即你可以找到关键词“快速”或“棕色”或“狐狸”
但如果有人搜索“快速棕色狐狸”,你也可以这样做。
在您的示例中,您可能会查找所有3个单词并将两个页面都恢复,这将是错误的。同样mysql在处理全文搜索方面做得很好,你建议的基本上是mysql自己做得很好的类似版本
所以在上面列出的2个实例中 A)搜索速度会非常好,因为它本身非常好的mysql B)我的方式更快,因为你不必检查你插入的每个关键字的存在。只需执行标准的更新/插入,让mysql为您处理文本搜索的痛苦。
我的公司正在使用我描述的方法,它运作良好......
我的页面文本和页面标题也在单独的全文列中,您可以获得额外的好处,即能够为包含您的关键字的标题的页面打分高于包含相同关键字的正文的页面。
答案 1 :(得分:0)
这个页面虽然有点陈旧,却包含有关标记模式的各种方法以及每种效果如何表现的正确信息。您如何处理问题在很大程度上取决于您当前的记录数量以及您预计此金额将如何变化。
模式: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html
他们的表现: http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html