用于多实体高性能标记的数据库

| 我正在为社交应用程序设计数据库,并试图确定我的方法是否是1)表现良好,以及2)规范化? 我对标记查询性能和数据库设计的研究得出的结论是,具有全文索引搜索的单个标记表可产生最佳性能。 参见此内容:http://tagging.pui.ch/post/37027746608/tagsystems-performance-tests 我知道我可以(并且应该从纯粹的规范化角度出发)将标签放置在单独的表中,每个标签都有一个键,但是随着数据库的增大,性能会受到影响(根据链接的文章)。标记搜索是我的应用程序的关键组成部分,必须表现出色。 下面的结构说明了我设计的一种使用桥接元数据表的基本方法,并且我希望使用此单个表来桥接更多的“对象表”,但是我仅提供了几个例子: 用户表:UserID PK,UserName等 博客表:BlogID PK,UserID FK,BlogTxt等 相片表:PhotoID PK,UserID FK,PhotoPath等 元数据表:MetadataID PK,UserID FK,ObjectTable(帖子或博客),ObjectID FK(PostID或BlogID),标签(tag1,tag2,tag3) 除了上述问题,我还想知道是否还有更好的选择。我是数据库设计的新手,所以请原谅任何对执行此操作的正确方法的无知。非常感谢。     
已邀请:
           我对标记查询性能和数据库设计的研究得出的结论是,具有全文索引搜索的单个标记表可产生最佳性能。 这实际上是不正确的... 您可以获得的最佳性能是切换到具有数组类型和位图索引扫描的数据库引擎,使用触发器在int []数组列中维护标签的集合,并添加适当的索引(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可能进行的任何优化。     

要回复问题请先登录注册