【发布时间】:2011-02-22 13:19:44
【问题描述】:
以 SO 为例,如果您预计标签会经常更改,那么管理标签最明智的方法是什么?
方式1:严重非规范化(逗号分隔)
表帖子 +--------+-----------------+ |邮编 |标签 | +--------+-----------------+ | 1 | c++,搜索,代码 |这里的标签是逗号分隔的。
优点:使用单个 select 查询即可立即检索标签。更新标签很简单。 更新简单且便宜。
缺点:标签检索需要额外解析,很难统计有多少帖子使用了哪些标签。
(或者,如果限制为 5 个标签)
表帖子 +--------+-------+-------+-------+-------+-------+ |邮编 |标签_1 |标签_2 |标签_3 |标签_4 |标签_5 | +--------+-------+-------+-------+-------+-------+ | 1 | c++ |搜索 |代码 | | |方式2:“稍微规范化”(单独的表,没有交集)
桌柱 +--------+-------------------+ |邮编 |标题 | +--------+-------------------+ | 1 |你如何标记? | 表标签 +--------+---------+ |邮编 |标记名 | +--------+---------+ | 1 | C++ | | 1 |搜索 |优点:易于查看标签计数 (count(*) from taggings where tagName='C++')。
缺点:tagName 可能会重复很多很多次。
方式 3:酷孩子的(用交集表标准化)
表帖子 +--------+---------------------------------------------------+ |邮编 |标题 | +--------+---------------------------------------------------+ | 1 |为什么乌鸦像写字台? | 表标签 +--------+---------+ |标签标识 |标记名 | +--------+---------+ | 1 | C++ | | 2 |搜索 | | 3 |傻瓜| 表标记 +--------+---------+ |邮编 |标签标识 | +--------+---------+ | 1 | 1 | | 1 | 2 | | 1 | 3 |优点:
- 没有重复的标签名称。
- 会有更多女孩喜欢你。
缺点:更改标签的成本比方法 1 高。
【问题讨论】:
-
我会向在您之前必须管理标签的人发送电子邮件/推特。喜欢 Jeff Atwood 或其他 SO 开发人员之一。他们或许能够提供一些见解。
-
听起来你刚刚回答了这个问题。因此,只需选择最符合您要求的那个。如果您希望女孩喜欢您,请选择#3。
-
更多女孩会喜欢你的,嗯?我喜欢这个选择!
-
我不是 sql 专家。您能否告诉我是否应该在
taggings表中添加一个包含postId和tagId的主键?这样可以防止多次将相同的标签添加到帖子中。