首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >T-SQL标签数据库体系结构设计?

T-SQL标签数据库体系结构设计?
EN

Stack Overflow用户
提问于 2009-10-25 23:10:50
回答 3查看 1.5K关注 0票数 2

场景

我正在构建一个包含一系列不同表的数据库。它们由一个评论表格、一个博客表格和一个文章表格组成。我希望能够将新项目添加到每个表中,并用0到5个标签对它们进行标记,以帮助用户更容易地搜索相关的特定信息。

关于架构的初步想法

我的第一个想法是建立一个集中的标签表。此表将列出使用TagID字段和TagName字段的所有可用标记。因为每个项目可以有多个标签,每个标签可以有多个项目,所以我需要在每个项目表和标签表之间建立多对多关系。

例如:

许多评论可以有许多标签。许多标签可以有许多注释。

许多文章可以有许多标签。许多标签可以有许多文章。

等等……

当前的理解

根据以前的经验,我知道在T-SQL中实现这种结构的一种方法是在注释表和标记表之间有一个邻接表。这个相邻表将包含CommentID和TagID,以及它自己的惟一CommentTagID。这种结构也适用于所有其他项目。

问题

首先,这是实现这样的数据库架构的正确方式吗?如果不是,还有其他可行的方法吗?由于数据库最终将包含大量信息,因此我需要确保它是可伸缩的。这是一个可伸缩的实现吗?如果我有很多这样的表,这种架构会使CRUD操作变得非常慢吗?我应该对ID字段使用GUID还是递增INTs?

我们将非常感谢您的帮助和建议。

谢谢你。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-27 05:31:35

您可能还想看看WordPress schemadatabase description,看看其他人是如何解决类似问题的。

票数 2
EN

Stack Overflow用户

发布于 2009-10-26 19:57:12

如果您需要执行以下操作之一,则保留一个集中的标签表是个好主意:

  1. 构建所有标签(即混合博客标签、评论标签和文章标签)的完整列表
    • 更新标签,以便它们在任何地方都可以更新:因此,当您将sqlserver更改为sql-server时,它可以在任何地方更改:在博客、文章和博客中

选项1对于构建标签云非常有用,所以我建议构建一个标签表,并从表中引用它。

如果您不需要像选项2中描述的那样更新标记,那么您就不需要为它们使用代理键。

无论如何,您很可能需要对它们进行UNIQUE约束,如果您不打算更新它们,那么不将其设置为PRIMARY KEY是没有意义的。

这也将为您节省大量的连接:您不需要连接标记表来显示标记。

GUIDs更易于管理,但是у使索引和链接表变得非常大。

您可以为每个表和链接分配一个数字标识符,如下所示:

代码语言:javascript
运行
复制
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仅用于确保引用完整性。要查询一篇文章的所有标记,只需发出以下查询:

代码语言:javascript
运行
复制
SELECT  tag
FROM    tTagLink
WHERE   type = 2
        AND id = 1234567

,所以您可以通过查询单个表来获得所有标签,而不需要任何连接。

票数 1
EN

Stack Overflow用户

发布于 2009-10-25 23:25:31

通常,多对多关系完全按照您所描述的方式实现。

自动递增it这是个好主意,因为它可以保证它们是唯一的。

如果你想用相同的标签标记评论和文章,你可以使用guids (而不是6个表,你只需要5个)。但使用guids进行搜索可能会更慢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1621131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档