我不会采用这两种解决方案。根据您的要求的一些细节,您可以使用超类型表:
CREATE TABLE Commentable_Items (
commentable_item_id INT NOT NULL,
CONSTRAINT PK_Commentable_Items PRIMARY KEY CLUSTERED (commentable_item_id))
GO
CREATE TABLE Projects (
commentable_item_id INT NOT NULL,
... (other project columns)
CONSTRAINT PK_Projects PRIMARY KEY CLUSTERED (commentable_item_id))
GO
CREATE TABLE Documents (
commentable_item_id INT NOT NULL,
... (other document columns)
CONSTRAINT PK_Documents PRIMARY KEY CLUSTERED (commentable_item_id))
GO
如果每个项目只能有一个评论并且评论不共享(即评论只能属于一个实体),那么您可以将评论放在 Commentable_Items 表中。否则,您可以使用外键链接该表中的注释。
不过,在您的具体情况下,我不太喜欢这种方法,因为“有评论”不足以在我的脑海中将这些项目放在一起。
我可能会使用单独的评论表(假设每个项目可以有多个评论 - 否则只需将它们放在您的基表中)。如果评论可以在多个实体类型之间共享(即,文档和项目可以共享相同的评论),则有一个中央评论表和多个实体评论关系表:
CREATE TABLE Comments (
comment_id INT NOT NULL,
comment_text NVARCHAR(MAX) NOT NULL,
CONSTRAINT PK_Comments PRIMARY KEY CLUSTERED (comment_id))
GO
CREATE TABLE Document_Comments (
document_id INT NOT NULL,
comment_id INT NOT NULL,
CONSTRAINT PK_Document_Comments PRIMARY KEY CLUSTERED (document_id, comment_id))
GO
CREATE TABLE Project_Comments (
project_id INT NOT NULL,
comment_id INT NOT NULL,
CONSTRAINT PK_Project_Comments PRIMARY KEY CLUSTERED (project_id, comment_id))
GO
如果您想将评论约束到单个文档(例如),那么您可以在该链接表中的 comment_id 上添加唯一索引(或更改主键)。
所有这些“小”决定都会影响特定的 PK 和 FK。我喜欢这种方法,因为每个表都清楚它是什么。在通常比拥有“通用”表/解决方案更好的数据库中。