L̲̳*_*̲̳̳ 6 sql database tags performance scalability
编辑:建立标记系统的人.不读这个.这不是你想要的.当我不知道RDBMS都有自己的优化方法时,我问过这个,只需使用简单的多对多方案.
我有一个发布系统,有数百万的帖子.每个帖子都可以有无数个与之关联的标签.
用户可以创建具有注释,创建日期,所有者等的标签.标签几乎就像一个帖子本身,因为人们可以发布关于标签的注释.
每个标记关联都有一个所有者和日期,因此我们可以看到谁添加了标记以及何时添加.
我的问题是如何实现这一点?它必须通过标签快速搜索帖子,或通过邮寄标签.此外,用户可以通过在字段中键入名称来为帖子添加标签,有点像谷歌搜索栏,它必须为您填写标签名称的其余部分.
我目前有3个解决方案,但不确定哪个是最好的,或者是否有更好的方法.
请注意,我没有显示笔记的布局,因为一旦我得到适当的标签解决方案,这将是微不足道的.
方法1.链接列表
post中的tagId指向tag_assoc中的链表,应用程序必须遍历列表,直到flink = 0
post: id, content, ownerId, date, tagId, notesId
tag_assoc: id, tagId, ownerId, flink
tag: id, name, notesId
Run Code Online (Sandbox Code Playgroud)
方法2.非规范化
tags只是一个VARCHAR或TEXT字段,包含tagId:ownerId的制表符分隔数组.它不能是固定的大小.
post: id, content, ownerId, date, tags, notesId
tag: id, name, notesId
Run Code Online (Sandbox Code Playgroud)
方法3. Toxi
(来自:http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html,这里也是一样的:标签或标签的推荐SQL数据库设计)
post: id, content, ownerId, date, notesId
tag_assoc: ownerId, tagId, postId
tag: id, name, notesId
Run Code Online (Sandbox Code Playgroud)
方法3提出了一个问题,迭代tag_assoc中每一行的速度有多快?
方法1和2应该通过post快速返回标签,但对于按标签发布的帖子,必须另外创建一个查找表.
我不得不担心的最后一件事是按名称优化搜索标签,我还没有完成.
我在这里制作了一个ASCII图:http://pastebin.com/f1c4e0e53
比尔,我想我有点让你失望了,笔记就在另一张桌子上,还有一张单独的桌子,上面有不同人张贴的笔记。帖子有注释和标签,但标签也有注释,这就是为什么标签是唯一的。
乔纳森关于链表的看法是正确的,我根本不会使用它们。我决定以最简单的标准化方式来实现标签,以满足我的需求:
DROP TABLE IF EXISTS `tags`;
CREATE TABLE IF NOT EXISTS `tags` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`owner` int(10) unsigned NOT NULL,
`date` int(10) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
DROP TABLE IF EXISTS `posts`;
CREATE TABLE IF NOT EXISTS `posts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`owner` int(10) unsigned NOT NULL,
`date` int(10) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`content` TEXT NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
DROP TABLE IF EXISTS `posts_notes`;
CREATE TABLE IF NOT EXISTS `posts_notes` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`owner` int(10) unsigned NOT NULL,
`date` int(10) unsigned NOT NULL,
`postId` int(10) unsigned NOT NULL,
`note` TEXT NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`postId`) REFERENCES posts(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
DROP TABLE IF EXISTS `posts_tags`;
CREATE TABLE IF NOT EXISTS `posts_tags` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`owner` int(10) unsigned NOT NULL,
`tagId` int(10) unsigned NOT NULL,
`postId` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`postId`) REFERENCES posts(`id`) ON DELETE CASCADE,
FOREIGN KEY (`tagId`) REFERENCES tags(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Run Code Online (Sandbox Code Playgroud)
我不确定将来会多快,但在一段时间内应该没问题,因为只有几个人使用该数据库。
归档时间: |
|
查看次数: |
2845 次 |
最近记录: |