8

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

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

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

4

3 に答える 3

7

関連する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`;

それから私は彼らのウィキでここを見ます

このテーブルは、訪問したトピックを既読または未読としてマークするために記録を保持します。トピック x のタイムスタンプの最後の投稿と一緒に mark_time タイムスタンプを使用して、トピック x が読まれたかどうかを確認します。

トピックが既読かどうかを正確に判断するには、phpbb_forums_track もチェックする必要があります。

したがって、基本的に、ユーザーによるトピック (スレッド) の表示に関連付けられたデータを格納するルックアップ テーブルがあり、それをフォーラム ビュー テーブルのタイムスタンプと照合して、トピックがユーザーによって表示されたかどうかを判断します。

于 2012-06-08T17:10:01.080 に答える
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]
于 2012-06-08T16:56:04.973 に答える
1

この説明に基づいて、おそらく3列の単純なテーブルを使用します。

  1. ユーザーID
  2. 投稿ID
  3. 最初に表示されたタイムスタンプ

ユーザーが投稿を表示したら、テーブルに行を追加します。特定のユーザー/投稿IDの組み合わせの行がテーブルに存在しない場合、その投稿は表示されていません。

于 2012-06-08T16:57:31.103 に答える