2010-05-28 33 views
6

Tôi muốn tạo một cái gì đó như reddit nơi họ có nhận xét, sau đó trả lời nhận xét, sau đó trả lời câu trả lời.Tôi làm cách nào để trả lời nhận xét? (PHP)

loại cấu trúc cơ sở dữ liệu làm họ sử dụng như vậy:

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

Tất cả tôi có phải là chỉ là một bài viết và một loạt các ý kiến ​​liên quan đến nó như ..

POSTING TABLE 
posting_id | title | author 

COMMENTS TABLE 
comment_id | posting_id | comment 

REPLIES TABLE 
???? 

thế nào Tôi liên quan đến các ý kiến ​​để trả lời? Loại css nào họ sử dụng để trả lời thụt lề không gian?

EDIT: Cảm ơn câu trả lời! Bây giờ câu hỏi duy nhất của tôi làm thế nào để tôi thụt lề các câu trả lời? Chẳng hạn như ..

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

Trả lời

6

Bạn có thể thêm cột khác để bàn bình luận của bạn xác định parent_comment_id nơi bạn cư nó với ID của bình luận (hoặc trả lời) người dùng sẽ được trả lời. Trong trường hợp nhận xét là trả lời trực tiếp cho bài đăng (không phải trả lời nhận xét), cột này sẽ là rỗng.

+3

Chính xác: nhận xét là nhận xét, cho dù họ có trả lời các nhận xét khác hay không. –

+0

Xin lỗi, tôi rất chậm. Tôi đạt được rồi! Cảm ơn. Bây giờ câu hỏi của tôi là làm thế nào để tôi thụt lề các câu trả lời? Tôi có cần phải biết một số loại quan hệ? Chẳng hạn như câu trả lời này là câu trả lời đầu tiên, câu trả lời này là thứ hai để thụt lề x2, câu trả lời này là thứ 3, vì vậy identx3 – jpjp

+0

@jpjp: Tôi sẽ làm điều này ở cấp ứng dụng. Khi bạn xây dựng cây nhận xét, bạn biết nhiều để thụt lề chúng. Chỉ một lần nữa là phụ huynh. –

0

Thêm một trường khác vào bảng nhận xét của bạn có "reply_to" hoặc một số trường như vậy và lưu id của nhận xét được trả lời ở đó.

0

bạn có thể làm bảng bình luận chung chung như vậy:

COMMENTS TABLE 
comment_id | posting_type | posting_id | comment 

nơi posting_type là một số loại phân biệt, ví dụ như một chuỗi 'POST' hoặc 'COMMENT', hay một số nguyên cho hiệu quả cao hơn (1 = POST , 2 = COMMENT, v.v.).

chỉnh sửa: thừa nhận điều này phức tạp hơn nhưng điều đó có nghĩa là bạn có thể sử dụng cùng một bảng nhận xét cho nhận xét về mọi thứ chứ không chỉ các bài đăng và nhận xét khác.

+0

Bạn đang thiếu quan hệ với nhận xét "cha mẹ". –

+0

không, bởi vì sau đó posting_type là COMMENT và posting_id là id nhận xét gốc. – oedo

+0

Điều này phá vỡ một quy ước FK giả. Cũng trong trường hợp này, bạn không thể thêm FK vào bảng khi post_id bây giờ cũng sẽ tự quay lại. –

0

Bạn không cần bảng trả lời. Như những người khác đã chính xác đã chỉ ra, đệ quy là con đường để đi với một RDBMS. Bạn luôn có thể xem xét sử dụng một DBMS kiểu nosql, để tránh phải đối phó với đệ quy.

1

Tôi sẽ làm điều đó bằng cách tạo bảng tham chiếu chéo.

Ví dụ:

Bảng: Bài viết

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

pstkey là chìa khóa cho bài cơ thể. userid là người đã tạo bài đăng. postMessage là bài viết thực tế.

Bảng: Bình luận

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

comkey là chìa khóa cho bình luận thực hiện. được tham chiếu đến bài đăng bằng cách sử dụng phím pstkey. userid là người đưa ra nhận xét. và sau đó chú thíchMessage là phần văn bản của nhận xét thực tế.

Bảng: xref_postComm

Columns: xrefkey | pstkey | comkey | comkey2 |

Bây giờ cho các phần thú vị. TẤT CẢ bài đăng đi vào bảng bài. TẤT CẢ nhận xét vào bảng bình luận. Các mối quan hệ được định nghĩa trong Bảng tham chiếu chéo.

Tôi làm tất cả các chương trình của mình theo cách này. Tôi đã được đặc quyền làm việc với một trong những kỹ sư cơ sở dữ liệu của thế giới bests đã nghỉ hưu và ông đã dạy tôi một vài thủ thuật.

Làm thế nào để sử dụng Cross bảng tham khảo:

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 là trả lời của bạn để trả lời. Trong đó hàng đơn lẻ này chứa .... khóa của bài đăng, khóa của nhận xét và khóa của câu trả lời cho nhận xét trả lời. Tất cả được thực hiện bởi dân số của xref.

 
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 

Nếu bạn biết gì về tham gia, còn lại tham gia, phải tham gia, bên trong/bên ngoài join tạo CHỌN của để có được những mảng dữ liệu sử dụng các mối quan hệ, công việc của bạn trở nên dễ dàng hơn nhiều.

Tôi tin rằng cuộc gọi của kỹ sư này về cơ bản là "bản đồ dữ liệu" của các mối quan hệ được xác định. Bí quyết bây giờ là cách bạn truy cập chúng bằng cách sử dụng các mối quan hệ này. Lúc đầu nó cứng đầu, nhưng biết những gì tôi biết, tôi từ chối làm theo cách khác.

Điều gì xảy ra cuối cùng là bạn kết thúc bằng văn bản 1 tập lệnh nói, ok, đi làm uhh, mọi thứ và quay lại. Bạn sẽ kết thúc với 1 cuộc gọi chức năng yêu cầu trang 1. Nó trả về với page1, post 1, comment1 3 và trả lời cho trả lời trong 1 mảng. echo để đầu ra và thực hiện.

CẬP NHẬT CHO BÌNH LUẬN Tôi đã nói chính xác điều tương tự lần đầu tiên nó được hiển thị cho tôi. Trên thực tế nó thực sự khiến tôi phát điên vì lập trình viên cơ sở dữ liệu đã buộc tôi phải làm theo cách này. Nhưng bây giờ tôi nhận được nó. Những lợi thế rất nhiều.

Advantage 1) 1 truy vấn có thể được viết để kéo tất cả trong 1 lần chụp.

2) Câu trả lời trong nhiều truy vấn có thể điền các mảng trong cấu trúc khi in trang vòng lặp trong vòng lặp có thể hiển thị trang.

3) Nâng cấp phần mềm sử dụng phần mềm của bạn có thể hỗ trợ mọi thay đổi thiết kế có thể bạn từng nghĩ đến. Khả năng mở rộng hoàn hảo.

Người đã dạy nó cho tôi là khẩu súng thuê đã thiết kế lại các cơ sở dữ liệu sears và jcpenny. Quay lại khi họ có 9 cuốn sách đi đến cùng một ngôi nhà vì các vấn đề bản ghi trùng lặp.

Bảng tham chiếu chéo ngăn chặn nhiều vấn đề trong thiết kế.

Trái tim của lý thuyết này là, một cột không chỉ có thể chứa dữ liệu mà còn là một câu lệnh đúng hoặc sai cùng một lúc. Đó là tự nó tiết kiệm không gian. Tại sao tìm kiếm 20 bảng khi bạn có thể tìm kiếm một bảng? 1 bảng tham chiếu chéo được lập chỉ mục có thể cho bạn biết mọi thứ bạn cần biết về 20 bảng khác, nội dung, thứ bạn cần, những gì bạn không cần và thậm chí bạn có cần phải mở bảng khác không.

IN NGẮN: 1 Tham chiếu chéo không chứa gì ngoài INT (2/11) cho bạn biết mọi thứ bạn cần biết trước khi mở bảng khác, không chỉ có kết quả tốc độ ánh sáng. Chưa kể đến khả năng ít bản ghi trùng lặp. Đối với bạn và tôi bản ghi trùng lặp có thể không phải là một vấn đề. Nhưng với Sears với 4 tỷ bản ghi ở mức $ 11 một cuốn sách, những sai lầm đã tăng lên.

+0

Bạn có thể nói lợi thế của điều này là gì? Tất cả những gì tôi thấy là tôi phải tham gia nhiều hơn ... –

2

Để hiển thị câu trả lời trong thư trả lời, bạn sẽ phải thực hiện cuộc gọi đệ quy để tiếp tục tạo các câu trả lời phụ.

Something như

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>'; 
} 

Để bình luận thụt tuy nhiên, sử dụng css.

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

Cách trả lời phụ này được thụt lề nhiều hơn phụ huynh và người đăng ký của họ được thụt lề nhiều hơn, v.v.

Các vấn đề liên quan