我正在为一个社交应用程序设计一个数据库,并试图确定我的方法是否为: 1)性能良好,2)适当标准化?
我对标签查询性能和数据库设计的研究得出的结论是,具有全文索引搜索的单个标签表可以产生最佳性能。
看看这个:http://tagging.pui.ch/post/37027746608/tagsystems-performance-tests
我知道我可以(也应该从纯规范化的角度)将标签放在一个单独的表中,每个标签有一个键,但随着db变大(根据链接的文章),性能会受到影响。标签搜索是我的应用程序的一个关键组件,必须有良好的表现。
下面的结构说明了我设计的一种使用桥元数据表的基本方法,我希望使用这个单独的表桥接更多的“对象表”,但我只提供了两个概念:
用户表: UserID主键、UserName等
博客表: BlogID PK、UserID FK、BlogTxt等
图片表: PhotoID PK、UserID FK、PhotoPath等
元数据表: MetadataID PK、UserID FK、ObjectTable (帖子或博客)、ObjectID FK (PostID或BlogID)、标签(tag1、tag2、tag3)
除了上面的问题,我还想知道是否有更好的替代方案。我是db设计的新手,所以请原谅我对正确的方式的严重的无知。非常感谢。
发布于 2011-06-16 04:36:04
我对标签查询性能和数据库设计的研究得出结论,带有全文索引搜索的单个标签表可以产生最好的性能。
这实际上是不正确的。
您可以获得的最佳性能是切换到具有数组类型和位图索引扫描的数据库引擎,使用触发器在int[] array列中维护标记的聚合,并在其上添加适当的索引(gin、gist、rtree)。
这允许编写查询(Postgres语法如下所示):
create index on posts using gin (tags);
-- bitmap AND/OR index scan on posts
-- has 1 or 2 or 3 or any of 4, 5, 6 without 7 or 8
select *
from posts
where tags && array[1,2,3]
or tags && array[4,5,6] and not tags && array[7,8]上面的内容将打消你使用MySQL所能想到的任何潜在的优化。
https://stackoverflow.com/questions/6362879
复制相似问题