评论表到帖子和产品表

时间:2017-04-21 14:12:04

标签: sql sql-server tsql

在数据库中,我有帖子,产品和其他表格 帖子和产品都可以有相同结构的评论。

create table dbo.Posts ( 
  Id int not null
  Title nvarchar (120) not null
)

create table dbo.Products ( 
  Id int not null
  Name nvarchar (120) not null
)

create table dbo.Comments ( 
  Id int not null
  Content nvarchar (2000) not null,
  Created datetime not null
)

create table dbo.PostComment ( 
  PostId int not null,
  CommentId int not null
)

create table dbo.ProductComment ( 
  ProductId int not null,
  CommentId int not null
)

我正在使用一个公共的评论表,因为它们都有相同的列。

这有意义吗?另一种方法是拥有以下内容:

create table dbo.PostComments ( 
  Id int not null,
  PostId int not null,
  Content nvarchar (2000) not null,
  Created datetime not null
)

create table dbo.ProductComments ( 
  Id int not null,
  ProductId int not null,
  Content nvarchar (2000) not null,
  Created datetime not null
)

我有几个问题:

  1. 哪种方法更有意义?
  2. 在第一种方法中,如何保证一个评论仅用于一个帖子......更好的是,只能在一个帖子或一个产品中使用?

1 个答案:

答案 0 :(得分:1)

为了保证一个评论仅由一个帖子使用,您可以在表格上创建唯一索引。所以,解决方案是使用索引。另一方面,它是一对一的关系。

CREATE TABLE dbo.Post ( 
  Id INT NOT NULL IDENTITY(1, 1),
  Title NVARCHAR(120) NOT NULL
);

CREATE TABLE dbo.Product ( 
  Id INT NOT NULL,
  Name NVARCHAR(120) NOT NULL
);

CREATE TABLE dbo.Comment ( 
  Id INT NOT NULL IDENTITY(1, 1),
  Content NVARCHAR(2000) NOT NULL,
  Created DATETIME NOT NULL
);

CREATE TABLE dbo.PostComment ( 
  PostId INT NOT NULL,
  CommentId INT NOT NULL
);

CREATE TABLE dbo.ProductComment ( 
  ProductId INT NOT NULL,
  CommentId INT NOT NULL
);

CREATE UNIQUE INDEX IX_PostComment_CommentId ON dbo.PostComment(CommentId);

CREATE UNIQUE INDEX IX_ProductComment_CommentId ON dbo.ProductComment(CommentId);

另外,请使用单数作为表名。

希望,它是heelps。我们也可能对Post和Product之间的关系感兴趣。

使用单个Comment表和PostId和ProductId +两个可为空的列的解决方案是一个非常棘手的解决方案。我不建议你这样做。

修改: 帖子或产品可以有零个或多个评论。