0

Facebookに似たメッセージ機能を作ろうとしています。Facebookではなく、メッセージだけです。簡単な説明はこのようにします。

1) 多数のユーザーが存在します ( user テーブル) 2) 1 人のユーザーが 1 人または複数の人にメッセージを送信できます。3) 同じメッセージに複数の返信がある場合があります。4) 複数人に送る場合。全員が返信でき、全員に表示されます。

使用したテーブル

メッセージ テーブル

id
timestamp
sender_id
subject
message
due_date
urgent_flag
open_flag
reply_id

message_user (テーブル)

id
timestamp
message_id
receiver_id
read_flag

CakePHP の関係は次のとおりです。

メッセージ モデル

var $hasMany = array(
        'MessageUser' => array(
            'className'     => 'MessageUser',
            'foreignKey'    => 'message_id',    
                )
    );  
var $belongsTo = array (
    'User' => array (
        'className' =>  'User',
        'foreignKey' => 'sender_id',
    )
);
var $hasAndBelongsTo=array(
    'Message' => array (
        'className' => 'Message',
        'foreignKey' => 'reply_id',
       )
);

MessageUser モデル

var $belongsTo = array (
    'User' => array (
        'className' =>  'User',
        'foreignKey' => 'receiver_id',
    ),
    'Message' => array (
        'className' =>  'Message',
        'foreignKey' => 'message_id'

    )
);

質問:

1) 私のアプローチは正しいですか? または、データベース スキーマを修正する必要があります。2) はいの場合、受信トレイのデータを取得するにはどうすればよいですか? 人々が私に送ったメッセージの会話を表示したいので、これは少し複雑です。

たとえば、ユーザー 1 がユーザー 2 にメッセージを送信します。ユーザー 2 は同じメッセージに 2 つの返信を追加します。次に、ユーザー 1 の受信トレイには 1 つのメッセージのみが表示されます。そして開くと。以前のメッセージも表示されます.. (これは Facebook に似ています)

ここで見られるもう 1 つの問題は、メッセージを削除する方法です。ユーザー 1 が、自分の受信トレイに何も表示しないはずのメッセージを削除したとします。しかし、ユーザー 2 は、彼が行った会話全体を見ることができます。

4

1 に答える 1

0

あなたのスキーマをWRTしてください。アクセスする必要がある方向にのみ関係を設定します。したがって、メッセージを受け取ったユーザーにアクセスする必要がない場合は、メッセージをユーザーにリンクしないでください。循環ループ (User hasMany Message、Message HasMany User など) があるため、モデルが自動的に大量のデータをフェッチするという再帰の問題が発生する可能性があります。これが実際の HABTM 関係であるため、hasMany の代わりにそれを使用します (双方向の関係にしたい場合)。

私のコメントは、ツリーの動作に言及しました。簡単に言えば、階層データをリレーショナル データベース テーブルに簡単に格納できます。マニュアルを繰り返すつもりはありませんが、 http://book.cakephp.org/view/91/Treeをチェックして、例をグーグルで検索してください。これは、スレッド化された返信に使用したいものだと確信しています。

もう 1 つ注意が必要です。これを本格的なユーザー ベースで使用する場合は、データベースのこの部分で負荷テストを実行してください。TreeBehavior が安価なサーバーで何百万行も処理できるかどうかはわかりません。

于 2010-02-24T16:55:27.523 に答える