标签表的优化表结构

Sha*_*awn 4 sql

考虑这3个表结构.哪个会最好地执行这些查询.

结构1 - TagID为带有连接表的int

Article
-------
ArticleID int

Article_Tag
------------
ArticleTagID int
ArticleID int
TagID int

Tag
---
TagID int
TagText varchar(50)
Run Code Online (Sandbox Code Playgroud)

结构2 - 仅作为字符串在Join表中标记

Article
-------
articleID int

Article_Tag
-----------
articleTagID int
articleID int
tag varchar(50)
Run Code Online (Sandbox Code Playgroud)

结构3 - 标记为PK的文本

Article
-------
ArticleID int

Article_Tag
------------
ArticleTagID int
ArticleID int
Tag varchar(50)

Tag
---
Tag varchar(50)
Run Code Online (Sandbox Code Playgroud)

示例查询:

Select articleID from Article a inner join Article_tag at on a.articleID = at.articleID and tag = 'apple'
Select tag from Tags -- or, for structure 2
Select distinct tag from article_tag
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

这取决于您是否希望能够全局更改标记文本.当然,您可以发布广泛的UPDATE内容Article_Tag,但如果您需要能够执行此操作,那么只需更新值Tag就会更简单.有些服务器提供自动更新(例如ON UPDATE CASCADE在SQL Server中),但这些更新并不一定便宜(它仍然需要UPDATE很多行和任何索引定义).

但是,如果你不做需要这个,那么它应该是有点快,在字面Article_Tag,因为它可以删除加入-很多次.显然,索引它等

重复文字所需的额外空间是一个因素,但磁盘空间通常比更快的服务器便宜.

至于作为主键; 除非你有其他数据需要存储,为什么你甚至需要这个表呢?你可以使用DISTINCTArticle_Tag很容易,尤其是Tag应该被索引(所以这应该是相当便宜).(编辑 Bill Karwin正确地指出了能够保留合格标签的优点,而不仅仅是当前标签).