编辑:对于构建标记系统的人。不要读这个。这不是你要找的。当我不知道RDBMS都有自己的优化方法时,我问了这个问题,只需使用简单的多对多方案即可。
我有一个拥有数百万个帖子的发布系统。每个帖子可以有无数个与之关联的标签。
用户可以创建包含注释、创建日期、所有者等的标签。标签几乎就像帖子本身,因为人们可以发布关于标签的注释。
每个标签关联都有一个所有者和日期,因此我们可以看到谁添加了标签以及何时添加。
我的问题是如何实现这一点?它必须通过标签或标签快速搜索帖子。此外,用户可以通过在字段中输入名称来为帖子添加标签,有点像谷歌搜索栏,它必须为您填写标签名称的其余部分。
我目前有 3 个解决方案,但不确定哪个是最好的,或者是否有更好的方法。
请注意,我没有显示笔记的布局,因为一旦我获得了适当的标签解决方案,这将是微不足道的。
方法一、链表
post中的tagId指向tag_assoc中的一个链表,应用程序必须遍历链表直到flink=0
post: id, content, ownerId, date, tagId, notesId
tag_assoc: id, tagId, ownerId, flink
tag: id, name, notesId
方法 2. 非规范化
tags 只是一个 VARCHAR 或 TEXT 字段,其中包含一个制表符分隔的 tagId:ownerId 数组。它不能是固定大小。
post: id, content, ownerId, date, tags, notesId
tag: id, name, notesId
方法 3. 毒物
(来自: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
方法 3 提出了一个问题,遍历 tag_assoc 中的每一行的速度有多快?
方法 1 和 2 对于按帖子返回标签应该很快,但是对于按标签的帖子,必须制作另一个查找表。
我要担心的最后一件事是按名称优化搜索标签,我还没有解决这个问题。
我在这里做了一个ASCII图:http: //pastebin.com/f1c4e0e53