2017-04-21 46 views
0

在數據庫中,我有帖子,產品和其他表。
帖子和產品都可以具有相同結構的註釋。對帖子和產品表的評論表

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. 關於第一種方法,我如何保證一個評論僅用於一個帖子...甚至更好,僅用於一個帖子或一個產品?
+0

如果你沒有創建FK的計劃,你可以用'id'和'tableName'列創建一個'Comment'表 –

+0

你可以用'ProductId'和'PostId'列創建一個'Comments'表,然後使用觸發器確保每行中確切地有一個非NULL。在這些情況下,我通常會思考隨着系統的發展會發生什麼,例如評論和評論評論?將它們組合成一張桌子會變得笨拙。每種類型評論的單獨表格將更容易維護並且更加高效。使用'union'搜索所有評論仍然很容易。 – HABO

回答

1

爲了保證一條評論只被一篇文章使用,您可以在表格上創建唯一的索引。所以,解決方案是使用索引。另一方面,它是1對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 +觸發器的解決方案是一個非常棘手的解決方案。我不建議你遵循這種方式。

編輯: 帖子或產品可以有零個或多個評論。

+0

更好的方法是將CommentID作爲列添加到Product和Post表中。由於Post和Comment之間的關係是1:1,PostComment和ProductComment表格實際上是毫無意義的。 –

+0

OP希望評論適用於單個帖子或產品,但並不表示帖子或產品只能有一條評論。 – HABO

+0

爲什麼建議使用單數名稱?業內大多數人推薦複數名稱。沒有一個評論,這代表了評論的集合。因此,複數名稱是有意義的。 :) –