场景
我正在构建一个包含一系列不同表的数据库。它们由一个评论表格、一个博客表格和一个文章表格组成。我希望能够将新项目添加到每个表中,并用0到5个标签对它们进行标记,以帮助用户更容易地搜索相关的特定信息。
关于架构的初步想法
我的第一个想法是建立一个集中的标签表。此表将列出使用TagID字段和TagName字段的所有可用标记。因为每个项目可以有多个标签,每个标签可以有多个项目,所以我需要在每个项目表和标签表之间建立多对多关系。
例如:
许多评论可以有许多标签。许多标签可以有许多注释。
许多文章可以有许多标签。许多标签可以有许多文章。
等等……
当前的理解
根据以前的经验,我知道在T-SQL中实现这种结构的一种方法是在注释表和标记表之间有一个邻接表。这个相邻表将包含CommentID和TagID,以及它自己的惟一CommentTagID。这种结构也适用于所有其他项目。
问题
首先,这是实现这样的数据库架构的正确方式吗?如果不是,还有其他可行的方法吗?由于数据库最终将包含大量信息,因此我需要确保它是可伸缩的。这是一个可伸缩的实现吗?如果我有很多这样的表,这种架构会使CRUD操作变得非常慢吗?我应该对ID字段使用GUID还是递增INTs?
我们将非常感谢您的帮助和建议。
谢谢你。
发布于 2009-10-27 05:31:35
您可能还想看看WordPress schema和database description,看看其他人是如何解决类似问题的。
发布于 2009-10-26 19:57:12
如果您需要执行以下操作之一,则保留一个集中的标签表是个好主意:
sqlserver更改为sql-server时,它可以在任何地方更改:在博客、文章和博客中
选项1对于构建标签云非常有用,所以我建议构建一个标签表,并从表中引用它。
如果您不需要像选项2中描述的那样更新标记,那么您就不需要为它们使用代理键。
无论如何,您很可能需要对它们进行UNIQUE约束,如果您不打算更新它们,那么不将其设置为PRIMARY KEY是没有意义的。
这也将为您节省大量的连接:您不需要连接标记表来显示标记。
GUIDs更易于管理,但是у使索引和链接表变得非常大。
您可以为每个表和链接分配一个数字标识符,如下所示:
tTag (tag VARCHAR(30) NOT NULL PRIMARY KEY)
tTaggable (type INT NOT NULL, id INT NOT NULL, PRIMARY KEY (type, id))
tTagLink (
tag VARCHAR(30) NOT NULL FOREIGN KEY REFERENCES tTag,
type INT NOT NULL, id INT NOT NULL,
PRIMARY KEY (tag, type, id),
FOREIGN KEY (type, id) REFERENCES tTaggable
)
tBlog (
id INT NOT NULL PRIMARY KEY,
type INT NOT NULL, CHECK(type = 1),
FOREIGN KEY (type, id) REFERENCES tTaggable,
…)
tArticle (
id INT NOT NULL,
blog INT NOT NULL FOREIGN KEY REFERENCES tBlog,
type INT NOT NULL, CHECK(type = 2),
FOREIGN KEY (type, id) REFERENCES tTaggable,
…)
tComment (
id INT NOT NULL PRIMARY KEY,
article INT NOT NULL FOREIGN KEY REFERENCES tArticle,
type INT NOT NULL, CHECK(type = 3),
FOREIGN KEY (type, id) REFERENCES tTaggable,
…)请注意,如果您想删除博客、文章或评论,也应该从tTaggable中删除。
这样,tTaggable仅用于确保引用完整性。要查询一篇文章的所有标记,只需发出以下查询:
SELECT tag
FROM tTagLink
WHERE type = 2
AND id = 1234567,所以您可以通过查询单个表来获得所有标签,而不需要任何连接。
发布于 2009-10-25 23:25:31
通常,多对多关系完全按照您所描述的方式实现。
自动递增it这是个好主意,因为它可以保证它们是唯一的。
如果你想用相同的标签标记评论和文章,你可以使用guids (而不是6个表,你只需要5个)。但使用guids进行搜索可能会更慢。
https://stackoverflow.com/questions/1621131
复制相似问题