考虑这3个表结构.哪个会最好地执行这些查询.
Article
-------
ArticleID int
Article_Tag
------------
ArticleTagID int
ArticleID int
TagID int
Tag
---
TagID int
TagText varchar(50)
Run Code Online (Sandbox Code Playgroud)
Article
-------
articleID int
Article_Tag
-----------
articleTagID int
articleID int
tag varchar(50)
Run Code Online (Sandbox Code Playgroud)
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)
这取决于您是否希望能够全局更改标记文本.当然,您可以发布广泛的UPDATE
内容Article_Tag
,但如果您需要能够执行此操作,那么只需更新值Tag
就会更简单.有些服务器提供自动更新(例如ON UPDATE CASCADE
在SQL Server中),但这些更新并不一定便宜(它仍然需要UPDATE
很多行和任何索引定义).
但是,如果你不做需要这个,那么它应该是有点快,在字面Article_Tag
,因为它可以删除加入-很多次.显然,索引它等
重复文字所需的额外空间是一个因素,但磁盘空间通常比更快的服务器便宜.
至于作为主键; 除非你有其他数据需要存储,为什么你甚至需要这个表呢?你可以使用DISTINCT
上Article_Tag
很容易,尤其是Tag
应该被索引(所以这应该是相当便宜).(编辑 Bill Karwin正确地指出了能够保留合格标签的优点,而不仅仅是当前标签).