【问题标题】:What benefits of design the tags table as SO did, and when it is good to do the same?像 SO 那样设计标签表有什么好处,什么时候做同样的事情好?
【发布时间】:2011-12-20 16:42:37
【问题描述】:
我正在阅读这篇文章:http://sqlserverpedia.com/wiki/Understanding_the_StackOverflow_Database_Schema,作者写了一些关于标签和帖子标签表的特别内容:
标签 - 好吧,是时候把要点吹出来了。
StackOverflow 将每个问题限制为五个标签(答案不是
标记),并且所有五个都存储在此字段中。例如,对于
问题 305223,标签字段是
“<offtopic><fun><not-programming-related><jon-skeet>”。由你决定
使这些正常化。 Sam Saffron 的 SoSlow 实用程序会自动创建
标签和 PostsTags 表来规范这些。接下来,检查内容
仔细检查标签字段。 StackOverflow 允许在标签中使用句点,
比如 .NET 标签和 ASP.NET 标签。但是,在数据库中,这些是
存储为“aspûnet”。只是需要注意的事情。
我想了解的是,我们可以从这种制作标签表并将其绑定到帖子的方式中获得哪些真正的好处?
更新:我问的是标签作为字符串保存在同一 Post 记录中的功能,然后是 Posts 上的外部工具循环并将标签复制到 Tags 和 PostsTags 表。
【问题讨论】:
标签:
database
database-design
normalization
【解决方案1】:
他们这样做是为了同时获得非规范化表和规范化表的好处。
他们将标签保存在带有问题的列中,因此在显示问题时它们很容易显示。他们不需要加入标签或 PostTags 表。从 1 个问题表中获取所有必要信息。速度。
同样的方法更适合事务处理,当添加新问题时。使用标准化方法时,您需要将信息保存到如下三个表中。
Transaction Begin
Insert Into Question
Insert or Update Tags
Insert or Update PostTags
Transaction Commit.
这将花费更多时间(可能需要锁定标签、PostsTags)而不是简单地插入问题表。您再次获得速度,但要插入。用户感知的网站速度增加。执行相同操作的后台进程对用户是不可见的,因此不会影响他。
另一方面,他们正在解析同一列并将其内容复制到标签和 PostsTags。它带来了什么?第一个定期创建的新标签,从问题表中找到这个新标签会很慢。 Second PostsTags 将为您提供哪些问题与哪些标签相关的标准化视图。很多人只浏览他们感兴趣的标签。因此,提供这些信息是必不可少的。你又获得了什么速度。
【解决方案2】:
这称为denormalizing 表 - 这意味着您不需要加入标签表,所有标签都可以在帖子中一次性检索。
这样做是出于性能原因 - 由于 SO 在其数据库中的数据量,连接成为真正的瓶颈。让标签以这种方式违反 1NF 可确保在获取帖子时不需要加入。