T-SQL标签数据库架构设计?

时间:2009-10-25 15:10:50

标签: sql database-design

方案

我正在构建一个包含一系列不同表的数据库。这些包括一张评论表,一张BLOGS表和一张表。一个文章表。我希望能够为每个表添加新项目,并使用0到5个标记对其进行标记,以帮助用户更轻松地搜索相关的特定信息。

架构的初步想法

我的第一个想法是有一个TAGS的集中表。该表将使用TagID字段&列出所有可用标签。 TagName字段。由于每个项目可以包含许多标记,并且每个标记可以包含许多项目,因此我需要在每个项目表和TAGS表之间建立MANY-TO-MANY关系。

例如:

许多评论可以有很多标签。 许多TAGS可以有很多评论。

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

等.....

当前理解

根据以前的经验,我了解在T-SQL中实现此结构的一种方法是在COMMENTS表和TAG表之间建立一个连接表。这个连接表将包含CommentID& TagID,以及它自己唯一的CommentTagID。此结构也适用于所有其他项目。

问题

首先,这是实现这种数据库架构的正确方法吗?如果没有,还有哪些方法可行?由于数据库最终将包含大量信息,因此我需要确保它是可扩展的。这是一个可扩展的实现吗? 如果我有很多这些表,这种架构会使CRUD操作变得非常慢吗? 我应该为ID字段使用GUID还是增加INT?

帮助&建议将受到很大的赞赏。

三江源。

3 个答案:

答案 0 :(得分:2)

您可能还需要查看WordPress schemadatabase description,了解其他人如何解决类似问题。

答案 1 :(得分:1)

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

  1. 构建所有标签的完整列表(即混合博客标签,评论标签和文章标签)
    • 更新代码,以便它们随处更新:这样当您将sqlserver更改为sql-server时,它就会随时随地更改:博客,文章和评论。
  2. 选项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
    

    ,因此您可以通过查询单个表来获取所有标记,而无需任何连接。

答案 2 :(得分:0)

通常多对多关系的实现与您描述的完全一致。

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

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