2010-05-28 99 views
6

我想創建類似reddit的地方,他們有評論,然後回覆評論,然後回覆答覆。如何回覆評論? (PHP)

做什麼類型的數據庫結構,他們使用這樣:

1. they keep track of all the comments to a posting 
2. a reply to a comment 
3. a reply to a reply 

所有我右邊是僅僅是一個發佈和一堆關於它像評論..

POSTING TABLE 
posting_id | title | author 

COMMENTS TABLE 
comment_id | posting_id | comment 

REPLIES TABLE 
???? 

怎麼辦我將評論與答覆聯繫起來? 他們用什麼類型的css來回復縮進空間?

編輯: 感謝您的答案!現在我唯一的問題是如何縮進回覆? 如..

you like food 
    yes I love italian 
     Yes i do like it too 
    chinese is best 

回答

6

您可以另一列添加到您的意見表中指定,您與用戶正在回覆到註釋(或回覆)的ID來填充它parent_comment_id。在評論是對帖子的直接回復(而不是對評論的回覆)的情況下,該欄將是空的。

+3

確切地說:評論是評論,無論他們是否對其他評論做出回覆。 – 2010-05-28 23:20:34

+0

對不起,我太慢了。我知道了!謝謝。現在我的問題是如何縮進回覆?我需要知道某種類型的關係嗎?比如這個回覆是第一個,這個回覆是第二個縮進x2,這個回覆是第三個,所以identx3 – jpjp 2010-05-28 23:27:58

+0

@jpjp:我會在應用程序級別執行此操作。當你構建評論樹時,你知道很多東西要縮進它們。只是一個作爲父母的一個。 – 2010-05-28 23:37:03

0

另一個字段添加到您的意見表,該表「REPLY_TO」或類似,並且儲存它是在回答有註釋的ID。

0

你可以把comments表一般像這樣:

COMMENTS TABLE 
comment_id | posting_type | posting_id | comment 

其中posting_type是某種鑑別,例如串「POST」或「註釋」,或爲更高的效率(1 = POST整數,2 =評論等)。

編輯:無可否認,這是比較複雜的,但這意味着您可以對任何內容使用相同的評論表進行評論,而不僅僅是帖子和其他評論。

+0

您錯過了與「父母」評論的關係。 – 2010-05-28 23:24:07

+0

不,因爲然後posting_type是COMMENT,而posting_id是父註釋ID。 – oedo 2010-05-28 23:24:54

+0

這打破了僞FK慣例。同樣在這種情況下,您無法將表FK添加到表中,因爲此時,posts_id也會引用自身。 – 2010-05-28 23:28:19

0

你不需要的答覆表。正如其他人已經正確指出的那樣,遞歸是RDBMS的一種方式。您始終可以考慮使用nosql樣式的DBMS,以避免必須處理遞歸。

1

我會做一個交叉引用表。

實施例:

表:帖子

Columns: pstkey | userid | postMessage | etc...

pstkey是爲後體的關鍵。用戶標識是創建帖子的人。 postMessage是實際的帖子條目。

表:評論

Columns: comkey | pstkey | userid | commentMessage | etc...

comkey是提出的意見的關鍵。引用到使用pstkey的帖子。 userid是發表評論的人。然後commentMessage是實際評論的文本主體。

表:xref_postComm

Columns: xrefkey | pstkey | comkey | comkey2 |

現在最有趣的部分。所有帖子都進入帖子列表。所有評論進入評論表。這些關係全部在交叉參考表中定義。

我用這種方式完成了我的所有編程。我很榮幸與一位退休的世界級數據庫工程師合作,他教會了我一些技巧。

如何使用交叉引用表:

xrefkey | pstkey | comkey | comkey2 
All that you look for is the population of a given field. 

xref (Auto Incremented) 
pstkey (Contains the pstkey for the post) 
comkey (Contains the comkey for the comment post) 
comkey2 (Contains the comkey for the comment post) 
     (but only populate comkey2 if comkey already has a value) 
and of course you populate comkey2 with the key of the comment. 

SEE, no reason for a 3rd tabel! 

With this method you can add as many relationships as you want. 
Now or in the future! 

comkey2是回覆您的回覆。該單行所包含的位置......帖子的關鍵字,評論的關鍵字以及回覆評論的回覆關鍵字。全部由外部參照的人口完成。

 
EXAMPLE: 
PAGES.... Page table 

POSTS 
pstkey | pageid | user| Post 
------------------------------------- 
| 1 | 1 | 45 | Went to the store the....| 
| 2 | 2 | 18 | Saw an apple on tv..... 

COMMENTS 
comkey | pstkey | user | Comment 
----------------------------------------------- 
| 1 | 1 | 9 | Wanted to say thanks... 
| 2 | 1 | 7 | Cool I like tha..... 
| 3 | 2 | 3 | Great seeing ya.... 
| 4 | 2 | 6 | Had a great.... 
| 5 | 2 | 2 | Don't sweat it man... 

xref_PostCom 
xrefkey | pageid | pstkey | comkey | comkey2 | 
---------------------------------------------- 
| 1 | 1 | 1 | NULL | NULL | Post1 on Page1 
| 2 | 1 | 1 | 1 | NULL | Comment1 under Post1 
| 3 | 1 | 1 | 2 | NULL | Comment2 under Post1 
| 4 | 2 | 2 | NULL | NULL | Post2 on Page2 
| 5 | 2 | 2 | 3 | NULL | Comment3 under Post2 on Page2 
| 6 | 2 | 2 | 4 | NULL | Comment4 under Post2 on Page2 (a second Comment) 
| 7 | 2 | 2 | 4 | 5 | Explained below.... 
Comment key 5 is matched with comment key 4....under post2 on Page 2 

如果你知道什麼加盟,左連接,右連接,內/外連接創建選擇的利用這些關係來獲得數據數組,你的工作變得輕鬆許多。

我相信這位工程師稱這基本上是定義關係的「數據圖」。現在的訣竅是你如何使用這些關係訪問它們。它一開始很難接近,但知道我所知道的,我拒絕以其他方式去做。

最後會發生什麼?你最終會寫出一個腳本說,好吧,去做呃,一切,然後回來。您將以1個函數調用請求第1頁。它將返回第1頁,第1頁,第1條評論,第&和& 3,並回復1個數組中的答覆。回聲輸出並完成。

更新評論 我在第一次向我展示時說了同樣的事情。事實上,數據庫程序員迫使我這樣做,真的讓我發瘋。但現在我明白了。好處很多。

優點1)可以寫入1個查詢,將其全部抽出。

2)在多個查詢的答案可以在一個結構中填充數組,在打印頁面時,循環中的循環可以顯示頁面。

3)升級使用它的軟件可以支持任何您可能想到的可能的設計更改。無懈可擊的可擴展性。

教給我的那個人是重新設計了sears和jcpenny數據庫的僱傭槍手。回到他們有9本書因爲重複記錄問題而去同一棟房子的時候。

交叉引用表避免了設計中的很多問題。

這個理論的核心是,一個列不僅可以包含數據,而且可以同時用作真或假陳述。這是自我節省空間。爲什麼要搜索20個表格? 1索引交叉引用表可以告訴你關於其他20個表的所有信息,它的內容,你需要什麼,什麼你不需要,甚至你甚至需要打開另一個表。

簡稱: 1含什麼,但INT(2/11)交叉引用,告訴你,你需要知道你曾經打開另一個表之前的一切東西,不僅包含了完美無瑕的可擴展性,但照明效果的速度。更不用說重複記錄的可能性很小。對你和我來說重複記錄可能不是問題。但是,對於西爾斯有40億美元的記錄,每本11美元,就會增加錯誤。

+0

你能說這有什麼好處嗎?我所看到的是我必須做更多的連接...... – 2010-05-29 00:41:38

2

要在回覆中顯示回覆,您必須進行遞歸調用才能繼續生成子回覆。

喜歡的東西

function get_comments($comment_id) { 
    print '<div class="comment_body">'; 

    // print comment body or something? 

    if (comment_has_reply($comment_id)) { 
     foreach(comment_comments($comment_id) as $comment) { 
      get_comments($comment->id); 
     } 
    } 

    print '</div>'; 
} 

要然而縮進註釋,使用CSS。

<style type="text/css"> 
.comment_body { 
    margin-left:10px; 
} 
</style> 

這樣子回覆縮進比父母更多,他們的潛艇被縮進甚至更多,等等。