我正在构建一个包含一系列不同表的数据库。这些包括一张评论表,一张BLOGS表和一张表。一个文章表。我希望能够为每个表添加新项目,并使用0到5个标记对其进行标记,以帮助用户更轻松地搜索相关的特定信息。
我的第一个想法是有一个TAGS的集中表。该表将使用TagID字段&列出所有可用标签。 TagName字段。由于每个项目可以包含许多标记,并且每个标记可以包含许多项目,因此我需要在每个项目表和TAGS表之间建立MANY-TO-MANY关系。
许多评论可以有很多标签。 许多TAGS可以有很多评论。
许多文章可以有很多标签。 许多TAGS可以有很多文章。
等.....
根据以前的经验,我了解在T-SQL中实现此结构的一种方法是在COMMENTS表和TAG表之间建立一个连接表。这个连接表将包含CommentID& TagID,以及它自己唯一的CommentTagID。此结构也适用于所有其他项目。
首先,这是实现这种数据库架构的正确方法吗?如果没有,还有哪些方法可行?由于数据库最终将包含大量信息,因此我需要确保它是可扩展的。这是一个可扩展的实现吗? 如果我有很多这些表,这种架构会使CRUD操作变得非常慢吗? 我应该为ID字段使用GUID还是增加INT?
帮助&建议将受到很大的赞赏。
三江源。
答案 0 :(得分:2)
您可能还需要查看WordPress schema和database description,了解其他人如何解决类似问题。
答案 1 :(得分:1)
如果您需要执行以下操作之一,保留一个集中的标签表是个好主意:
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
,因此您可以通过查询单个表来获取所有标记,而无需任何连接。
答案 2 :(得分:0)
通常多对多关系的实现与您描述的完全一致。
自动递增ID是个好主意,因为它可以保证它们是唯一的。
如果你想标记带有相同标签的评论和文章(而不是6个表,你只需要5个),你就可以使用guid。但使用guid搜索可能会更慢。