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

标签 database performance tags metadata normalization

我正在为社交应用设计数据库,并试图确定我的方法是否 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)

除了上述问题,我也很想知道是否有更好的选择。我是数据库设计的新手,所以请原谅我对正确执行此操作的任何严重无知。非常感谢。

最佳答案

My research on tag query performance and db design concluded that a single tags table with full text index search yields the best performance.

这实际上是不正确的...

您可以获得的最佳性能是切换到具有数组类型和位图索引扫描的数据库引擎,在 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 的任何潜在优化。

关于database - 用于多实体高性能标记的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6362879/

相关文章:

php - Mysql仅在未达到限制时插入

删除反向重复行

c# - 在文本文件中搜索关键字,直到遇到字符串

c - 在 C 中传输隐藏数据

javascript - 你如何让标题停留在页面底部,然后在它经过时滚动?

java - 如何使用 JSoup 在包含特定属性值的 div 之后添加 <br>

ios - 为 iOS 应用程序创建简单的数据库

c# - 从 SQL Server 数据库更新前端 WPF 应用程序

java - 错误 : column "id" is of type uuid but expression is of type bytea

javascript - 使用HTML标签和innerHTML、setAttribute()等传递数据。编辑和更新存储在数据库中的新闻文章