2010-09-29 13 views
7

Được rồi, một vấn đề thú vị khác tại Tuyến đường 50.Cách hiệu quả nhất để tạo hệ thống bóng đèn diễn đàn (chưa đọc) là gì?

Chúng tôi muốn triển khai hệ thống bóng đèn diễn đàn đúng nơi bài đăng chưa đọc bởi người dùng (sau khi tài khoản của người dùng được tạo) hiển thị là chưa đọc cho đến khi trạng thái đó bị xóa hoặc cho đến khi người dùng đọc chúng.

Chúng tôi đã tìm ra cách tốt nhất và dễ nhất để thực hiện việc này là triển khai bảng tin chưa đọc.

Các Cột là: user_id, board_id, thread_id, post_id, timestamphidden

này đang làm việc rất tốt và rất nhanh chóng cho nhìn thấy mà ủi/chủ đề/bài viết là chưa đọc (và liên kết với họ) cho mỗi người dùng tuy nhiên nó là vô cùng chậm đối với một người dùng đăng lên diễn đàn thậm chí dù chỉ một truy vấn SQL đơn đang được chạy:

INSERT IGNORE INTO `forums_lightbulb` SELECT `id`,'x','x','x',UNIX_TIMESTAMP(),0 FROM `users` 

tôi chắc chắn rằng đây là kết quả của việc có 3065 tài khoản người dùng. Làm thế nào tôi có thể tăng tốc quá trình này? Tôi muốn giữ cho hệ thống như thời gian thực càng tốt.

Lưu ý quan trọng: Vui lòng giới hạn câu trả lời của bạn cho môi trường lưu trữ được chia sẻ mà không cần thêm ngân sách. Chúng tôi được giới hạn cho PHP và MySQL 5.1.53-log

+0

Nếu bạn có thể muốn sử dụng bộ lọc hoa – amirouche

Trả lời

9

PHPBB là cách rất nhanh để thực hiện điều đó. Nó giữ một bảng đánh dấu cho mỗi chủ đề và mỗi diễn đàn khi lần cuối cùng người dùng đã mở nó. Và sử dụng điều đó để xác định xem có tin nhắn chưa đọc hay không.Nó cho phép một người dùng * Chủ đề * Người dùng * Diễn đàn sử dụng lưu trữ chương trình trong khi cho phép một kiểm tra với các truy vấn khá đơn giản và nhanh chóng.

Bạn có thể xem cách hoạt động từ cấu trúc cơ sở dữ liệu.

# Table: 'phpbb_forums_track' 
CREATE TABLE phpbb_forums_track (
    user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, 
    forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, 
    mark_time int(11) UNSIGNED DEFAULT '0' NOT NULL, 
    PRIMARY KEY (user_id, forum_id) 
) CHARACTER SET `utf8` COLLATE `utf8_bin`; 

# Table: 'phpbb_topics_track' 
CREATE TABLE phpbb_topics_track (
    user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, 
    topic_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, 
    forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, 
    mark_time int(11) UNSIGNED DEFAULT '0' NOT NULL, 
    PRIMARY KEY (user_id, topic_id), 
    KEY topic_id (topic_id), 
    KEY forum_id (forum_id) 
) CHARACTER SET `utf8` COLLATE `utf8_bin`; 
+0

Đây có thể là những gì tôi đang tìm kiếm! Cảm ơn bạn! Tôi sẽ giải thưởng tiền thưởng trừ khi ai đó đến cùng với một câu trả lời tốt hơn, nhưng tôi khá chắc chắn đây là những gì tôi đã cố gắng tìm ra! – Navarr

+1

Đó là những gì phần mềm nguồn mở là đúng? Học hỏi lẫn nhau: D – Beanow

1

On đọc:

insert into read_articles(user_id, article_id); 

Triển lãm trưng bày:

SELECT a.*, r.user_id FROM articles a 
LEFT OUTER JOIN read_articles r ON (a.article_id = r.article_id and r.user_id = $user_id) 
WHERE (article_filter, like forum or thread id, or whatever) 

Mở tập kết quả của bạn, nếu user_id không phải là null, sau đó họ đã đọc bài báo. Nếu không, họ đã không.

Chỉ mục khi thích hợp. Server ấm áp với bánh quy và mứt.

+0

Đây thực sự là một cách đối diện tôi muốn xử lý điều này .. – Navarr

4

Xin lỗi để nói, nhưng giải pháp được đề xuất trong câu hỏi là thiết kế không thể đánh giá được.

Tôi đã xem xét vấn đề này qua số here, đã có một cuộc thảo luận tốt về nó (trước khi tôi xuất hiện). Hãy nhìn ở đó.

Trong trường hợp của bạn, lưu trữ bản ghi U * M để theo dõi bài đăng "chưa đọc", trong đó U là số lượng người dùng và M là số lượng tin nhắn, sẽ mất kiểm soát rất nhanh. Điều này là do hiệu quả trường hợp tốt nhất của nó yêu cầu tất cả người dùng phải đọc mọi thư (và hầu hết người dùng không quan tâm đến mọi thứ, vì hầu hết mọi thứ trên diễn đàn đều là tiếng ồn). Trường hợp trung bình, có thể 20% người dùng đã đọc 100% bài đăng, nhưng 80% đã đọc gần 0% bài đăng và sẽ không bao giờ đọc phần còn lại. Điều này có nghĩa rằng bạn đang bị buộc phải lưu trữ 0.8 * U * M, với U và M chỉ ngày càng tăng, hình học. Không có số lượng lập chỉ mục nào sẽ sửa lỗi này.

Câu trả lời trước @-hartung trước đây có cách tiếp cận hiệu quả hơn.

Tôi thấy rằng điều này khá cũ và tôi hy vọng bạn đã tìm thấy giải pháp tốt hơn trong thời gian chờ đợi.

+0

Tôi đưa ra một giải pháp tốt hơn, đó là một hỗn hợp của dấu thời gian và lưu trữ tin nhắn đọc, hoặc một cái gì đó như cái đó. Tôi đã không hoàn toàn lên kế hoạch cho nó. Trong khi đó, mặc dù, tôi chỉ vô hiệu hóa hệ thống bóng đèn. – Navarr

2

Dưới đây là cách hiệu quả nhất:

  1. có một bảng gọi là read_threads mà các cửa hàng thread_id, và user_id
  2. có một cột trong bảng users gọi mark_read_date mà các cửa hàng ngày cho người sử dụng đã nhấp vào liên kết mark all threads read trong diễn đàn
  3. của bạn để xác định xem một chuỗi có được đọc hay không, truy vấn của bạn sẽ kiểm tra xem nó có nằm tronghay không bảng, hoặc nếu last_post_date của nó (ngày bài cuối cùng đã được thực hiện với nó) là lớn tuổi hơn usersmark_read_date

Điều quan trọng là bạn cũng loại bỏ tất cả các hàng từ bảng read_threads khi người dùng nhấp vào liên kết mark all threads read trong diễn đàn của bạn.