2012-06-08 13 views
7

私は一般的なデータベース理論の質問があります。私は、ユーザーが閲覧した投稿/アイテム(フォーラムなど)や未読のメールメッセージを表示するのと同様のものを作成する必要があります。私が持っているのは、複数のユーザーが閲覧できる投稿がありますが、実際に閲覧したユーザーによって分けられる必要があるということです。したがって、ユーザーAがポスト1を閲覧した場合、ポスト1は新しいアイテムであるとは表示されなくなりますが、ユーザーBには、ポスト1が新しいアイテムとして表示されます。ユーザーごとに未読アイテムアラートのデータベースを構成する方法

私は他のアイデアを探しています。そのうちの1つは、ユーザーが最後にログインしたときのタイムスタンプを取得することですが、実際に投稿した投稿を追跡する必要があります彼らは最後にログインしました。

可能であれば、私はMySQLデータベースソリューションを希望しますが、それが必須であれば私はクッキーを開いています。私は自分でこれを行うことができ、それを理解することができましたが、これを最も効率的にするためにテーブルを適切に構成する方法についてアドバイスをいただければ幸いです。また、帯域幅とストレージに問題はありません。

+1

あなたは、vBulletinと他のフォーラムシステムがそれをどのように処理してアイデアを得るかを見ることができます。または、おそらく[phpBB](http://www.phpbb.com/)、私はvBulletinを買わなければならないと思います。 –

答えて

6

relevant schema for phpBBを見直している間、私は以下のが見つかりました:

# 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`; 

そして:

# 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`; 

それから私look here in their wiki

このテーブルには、するために訪問したトピックのための記録を保持しますそれらに「 」というマークを付けます。トピックxが読み込まれたかどうかを知るために、topic_xのタイムスタンプの最後のポスト と一緒にmark_timeタイムスタンプを使用します。

トピックが読まれているかどうかを正確に伝えるには、 phpbb_forums_trackもチェックする必要があります。

だから、基本的に、彼らは、トピック(スレッド)のユーザの視聴に関連するデータを格納し、その後、フォーラムのビューテーブルにタイムスタンプに対してそれをチェックし、トピックが視聴されたかどうかを判断するためにルックアップテーブルを持っていますユーザーによって。

+0

これは私が必要としたものです。私はちょうどphpbb_forums_trackテーブルを作成し、それは私が必要とする仕事を得る必要があります。ああ、ありがとう – n0nag0n

+1

問題ありません。私もデータにアクセスするクエリの場所を投稿しようとしていました。私が見つけたら教えてあげましょう。 –

+1

また、サーバー上のユーザーのセッションでデータをキャッシュしたいと考えているので、常にそのクエリを呼び出すことになります(これはおそらく遅いでしょう)。次に、DBに記録されると同時にビューデータをキャッシュにプッシュする機能を組み込みます。 –

2

は、単純なクロスリファレンス表(read_postsか何か)を作成します。

user_id|post_id 
---------------- 
2  | 132 
53  | 43 
.... 

は((user_idのインデックスを作成することが特に重要)これらの列の両方がインデックス化されていることを確認した後、参加を使用しますか、サブクエリ)を使用して、ログインしたユーザーの未読の投稿を選択します。あなただけの未読記事の一覧を表示しようとしている場合、たとえば、あなただけ実行します。この説明に基づいて

SELECT * FROM `posts` WHERE `post_id` NOT IN (
    SELECT `post_id` FROM `read_posts` WHERE `user_id`='[$USER ID]') 
ORDER BY [your ordering clause] 
+1

サブセレクトと 'IN'節のパフォーマンスがページビューをチェックするのに問題があるとは思わないでしょうか?当然のことながら、ユーザーセッションでそのデータを前方視覚的にキャッシングしていない限り、 –

+1

サブクエリは結合よりも潜在的に非常に効率的ではありませんが、この場合、サブクエリでパフォーマンスが低下するとは思わないでしょう...複雑なサブクエリは時には最も効率的な実行順序を「選択」しませんが、あいまい性がなく、多数の行で、特に索引付けを適切に使用すれば、パフォーマンスは良好でなければなりません。この場合、結合がより速くなることを示唆するベンチマークがあれば、私は非常に興味があります。 –

+0

あなたは正しいと思います。私はおそらく 'JOIN'を使うでしょうが、それはもっと好みかもしれません。とにかく、最良のアプローチは、ユーザーが投稿/トピックを表示するときに、セッションキャッシュとデュアルキャッシュ/セッションの更新を組み合わせたものだと私は思っています。そうすれば、クエリは実際にはログイン処理中やセッション設定中にのみ実行され、効率的かつ管理しやすくなります。 –

1

私は多分3列を持つ単純なテーブルを使用します。

  1. ユーザーID
  2. ポストID
  3. タイムスタンプまず、ユーザーが記事を表示すると、テーブルに行を追加

を見ます。与えられたユーザ/投稿IDのコンボのためにテーブルに行が存在しない場合、その投稿は表示されません。

関連する問題