巢狀評論的資料庫表設計

Darren Ji發表於2014-10-22

設計巢狀評論資料庫表可仿效無限級分類,在表中加一個ParentId欄位。巢狀評論頁面大致這樣:

 

評論1
   回覆評論1
   恢復評論1
評論2
   回覆評論2  
評論3
......

 

但是, 在顯示評論的時候,如果使用ParentId會涉及到多表的聯結,巢狀層級越多意味著表之間的聯結增多,這樣會影響查詢效率。

 

於是,我們想到在表中增加一個欄位,用來顯示所有的層級:/1/2/5/

 

設計資料庫和表:

create database NestedCommnets
use NestedCommnets
Create table UserComments(
    Id int not null identity(1, 1),
    ParentId int not null,
    Content nvarchar(100) not null,
    Depth smallint not null,
    Thread nvarchar(max) not null
)

 

往資料庫表中新增如下資料:

1
以上,Thread欄位以"/"分隔,羅列了所有的父級Id,Depth欄位顯示的是層級。

 

查詢所有的評論:

  select SPACE(u.Depth*6) + u.Content as 評論 from UserComments as u

2

 

如果希望結合Thread和Depth欄位進行排序:

--STR(nExpression [, nLength [, nDecimalPlaces]])返回與指定表示式對應的字串
--nLength,返回的字串長度;nDecimalPlaces,返回字串的小數位數
select 
SPACE(u.Depth*6) + u.Content as 評論,
u.Thread + LTRIM(STR(u.Depth,100,0)) as 排序 
from UserComments as u
order by u.Thread + LTRIM(STR(u.Depth,100,0))

3

相關文章