2011-07-05 1 views
1

ユーザーごとの投稿の読み取り/未読ステータスを処理する必要があります。 今、私はカンマで区切られたuser_idsを格納するために非正規化された列を使用しています。テキスト列であるため、選択クエリのパフォーマンスは低下します。mysqlのメールのようなユーザーのための読み取り/未読の投稿の処理

ここで、ユーザA-1、ユーザB-2、ユーザC-4、ユーザD-8(ビット単位)のすべてのユーザに定数を割り当てたい場合は、その組み合わせを整数列に格納します。したがって、ユーザーA、Cが整数列の値を読み取るときは、(1 + 4)5になります。 そして、ビットワイズ演算子を基準に使用して、読み取り/未読のポストを照会します。問題はノーです。私がコンビネーションとして保存できるユーザーの数は制限されています。さらに私が拡張する必要がある場合、私は他のユーザーを格納するために別のBIGINT列を追加するかもしれません。

その情報を保存するにはどのような方法が良いでしょうか。 以下は、私が行う必要のある行動です。

  1. 新しい返信が投稿された場​​合、値を0として更新する必要があります(すべての人が未読にするため)。
  2. ユーザーが投稿を読むときの列のステータスを更新します。
  3. ユーザーの未読の投稿をすべて選択します。

EDIT: 間接的に3番目のアクションに取り組もうとしています。その列を選択列リストに追加し、mysql条件として追加するのではなく、アプリケーションコードでユーザーの読み取りステータスを検索します。これは決して解決策ではありません。私はまだ良いものが必要です。

CREATE TABLE views(
    user_id bigint not null, 
    post_id bigint not null, 
    primary key(user_id,post_id 
) 

をしてからちょうどユーザIDを持つレコードとポストIDが存在するかどうかを確認:

答えて

0

私はそれがこのようやるだけだろう、このようにテーブルを作成します。これを使用してビューの数をカウントすることもできます。

+0

私はこれを既に試しましたが、私の場合はスケーリングがうまくありません。 100人のユーザーと50万件の投稿いくつかの基準に基づいて投稿セットを取得します。 – John

+0

バッドには記憶が不要なものもあります。日付を比較するだけで、最後のログイン以降に新しいものを表示できます。 – bigblind

+0

ありがとうFrederik、ここでは、読み取り/未読のステータスが重要な役割を果たしているので、それは揮発性ではありません – John

関連する問題