而试图找出如何标记一个博客帖子有一个SQL语句这里,下面的念头闪过我的脑海:使用关系表tag2post通过ID引用标记,如下恰恰是没有必要的:
tags +-------+-----------+ | tagid | tag | +-------+-----------+ | 1 | news | | 2 | top-story | +-------+-----------+ tag2post +----+--------+-------+ | id | postid | tagid | +----+--------+-------+ | 0 | 322 | 1 | +----+--------+-------+
为什么不使用以下模型,您可以在其中索引标记本身如下?认为标签永远不会被重命名,但是添加和删除,这可能有意义,对吗?你怎么看?
tag2post +----+--------+-------+ | id | postid | tag | +----+--------+-------+ | 1 | 322 | sun | +----+--------+-------+ | 2 | 322 | moon | +----+--------+-------+ | 3 | 4443 | sun | +----+--------+-------+ | 4 | 2567 | love | +----+--------+-------+
PS:我保留了一个id,我为了轻松显示添加的最后n个标签...
它可以工作,但它没有标准化,因为标签中有冗余.你也失去了使用"相同"标签来标记除帖子之外的东西的能力.对于小N,优化并不重要,所以如果你运行它我没有问题.
实际上,您的索引会更大(假设您要对标记进行索引以进行搜索,您现在正在索引重复项和索引字符串).在规范化版本中,标签表上的索引将更小,不会有重复,并且tagid上tag2post表上的索引将更小.此外,固定大小的int列对索引非常有效,您也可以根据群集选择避免一些碎片.
我知道你说过没有重命名,但总的来说,在这两种情况下,你可能仍然需要考虑重命名(甚至删除)标签的语义 - 是否需要更改所有条目,或者是否需要更改标签以某种方式分裂.因为在最坏的情况下这是事务中的批处理操作(所有tag2post都必须重命名),所以从设计的角度来看,我并没有真正将其归类为重要的.