用于多实体高性能标记的数据库
我正在为社交应用程序设计一个数据库,并试图确定我的方法是否 1) 表现良好,2) 是否正确标准化?
我对标签查询性能和数据库设计的研究得出的结论是,具有全文索引搜索的单个标签表可产生最佳性能。
请参阅:http://tagging.pui.ch/post/37027746608/ tagsystems-performance-tests
我知道我可以(并且应该从纯粹规范化的角度来看)将标签放在一个单独的表中,每个标签都有一个键,但是随着数据库变大,性能会受到影响(根据链接的文章)。标签搜索是我的应用程序的关键组件,必须表现良好。
下面的结构说明了我设计的使用桥接元数据表的基本方法,我希望使用这个单个表来桥接更多的“对象表”,但我只提供了几个来说明这一点:
Users Table: UserID PK、用户名等
博客表:BlogID PK、UserID FK、BlogTxt 等
照片表:PhotoID PK、UserID FK、PhotoPath 等
元数据表:MetadataID PK、UserID FK、ObjectTable(帖子或博客)、ObjectID FK(PostID 或 BlogID)、标签(tag1、tag2、tag3)
除了上述问题之外,我也有兴趣知道是否有更好的替代方案。我是数据库设计的新手,所以请原谅我对正确执行此操作的方法的严重无知。 非常感谢。
I'm designing a database for a social app and am trying to determine if my approach is 1) going to perform well, and 2) properly normalized?
My research on tag query performance and db design concluded that a single tags table with full text index search yields the best performance.
See this: http://tagging.pui.ch/post/37027746608/tagsystems-performance-tests
I know I could (and should from a pure normalization standpoint) put the tags in a separate table with a key per tag, but performance would suffer as the db grows large (according to the linked article). Tag searching is a key component to my app and must perform well.
The below structure illustrates a basic approach I've devised that uses a bridge metadata table, and I expect many more "object tables" to be bridged using this single table, but I provide only a couple to give the idea:
Users Table: UserID PK, UserName, Etc
Blogs Table: BlogID PK, UserID FK, BlogTxt, Etc
Photos Table: PhotoID PK, UserID FK, PhotoPath, Etc
Metadata Table: MetadataID PK, UserID FK, ObjectTable (Posts or Blogs), ObjectID FK (PostID or BlogID), Tags (tag1,tag2,tag3)
In addition to the above questions, I'm also interested to know if there are better alternatives. I'm new to db design so please excuse any serious ignorance on the proper way of doing this. Thanks much.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这实际上是不正确的...
您可以获得的最佳性能是切换到具有数组类型和位图索引扫描的数据库引擎,在 int[] array 使用触发器列,并在其上添加适当的索引(gin、gist、rtree)。
这允许编写查询(下面的 Postgres 语法),例如:
上面的内容将消除您可以想到的使用 MySQL 的任何潜在优化。
This is actually incorrect...
The best performance you can get is to switch to a database engine that has an array type and bitmap index scans, maintain an aggregate of your tags in an int[] array column using triggers, and add an appropriate index (gin, gist, rtree) on it.
This allows to write queries (Postgres syntax below) such as:
The above will blow away any potential optimization you can think of using MySQL.