私はSEに通知システムを構築する方法を検討して、他の場所と私はここに受け入れ答えである液に描か発見されている:/programming/9735578/building-a-notification-system た用途この構造:
╔═════════════╗ ╔═══════════════════╗ ╔════════════════════╗
║notification ║ ║notification_object║ ║notification_change ║
╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
║ID ║—1:n—→║ID ║—1:n—→║ID ║
║userID ║ ║notificationID ║ ║notificationObjectID║
╚═════════════╝ ║object ║ ║verb ║
╚═══════════════════╝ ║actor ║
╚════════════════════╝
通知は、何か(オブジェクト=イベント、友情..)が誰か(俳優)によって変更(動詞=追加、要求)され、ユーザー(対象)に報告されることに関するものです。これが正規化されたデータ構造です(MongoDBを使用しましたが)。特定のユーザーに変更を通知する必要があります。つまり、ユーザーごとの通知です。つまり、100人のユーザーが関与している場合は、100の通知を生成します。
最初はこのアプローチを理解していると思っていましたが、それを実装する準備を始めたとき、私は明らかにそれを特によく理解していないことに気付きました。回答に関する最後のいくつかのコメントは、ソリューションの理解に苦労した他のユーザーからの質問です。
私がいないことを確認これは私が次のように終わるだろうモデルがある場合だけど、それが持っているupvotesの数を考えると、私はそれは私がする恩恵を受けるだろうと確信して理解し、それを、私は確かのようにもっと勉強したいです。これがこの解決策を把握するのに苦労した他の人にも役立つことを願っています(偶然、私はこの質問に向けてその答えにコメントを残すのに十分なインターネットポイントを持っていません、他の誰もしてください!)
ご質問
正しく理解できれば、notificationObjectIDはnotification_objectテーブルを指す外部キーであり、notificationIDは通知テーブルを指す外部キーです。オブジェクトは、通知の対象となるデータベースエントリ(特定のイベントや投稿など)のIDを参照する外部キーであるように見えますが、そのIDが属するテーブルを示す別のフィールドが必要ではないでしょうか?
著者が書いた
notification_object.objectは、文字列「friendship」のような変更タイプを識別します。私が話す追加データを含む変更されたオブジェクトへの実際の参照は、notification_change.notificationObjectIDにあります。
私には意味がないようです。オブジェクトは文字列(enum?)で、notificationObjectIDは通知の対象となるオブジェクトを参照する外部キーですか?それでは、真ん中のテーブルと正しいテーブルはどうやってつながっているのでしょうか?
中央のテーブルは、通知の対象となるオブジェクト(またはオブジェクトのタイプ)、たとえばイベントや投稿を指定しているようです。次に、同じオブジェクトタイプを指すnotification_changeのエントリを多数持つことができます。これにより、通知(「25人のユーザーがXの壁に投稿されました」など)をバンドルできます。
しかし、左テーブルと中央テーブルの間に1:nの関係があるのはなぜですか?「25人のユーザーがSamのウォールに投稿されました」と「Maryが彼女の「Friday Picnic」イベントを更新した同じ通知IDを提供しますか?同じユーザーのすべての通知に同じ通知IDがある場合、なぜ左?
パフォーマンスに関する質問-ジョンがメアリーのピクニックイベントにコメントを投稿するとします。notification_changeエントリを作成する前に、Mary's Picnicのnotification_objectが既に存在するかどうかを確認するためにルックアップを行う必要があるようです。これはパフォーマンスに悪影響を及ぼしますか、それとも問題ではありませんか?前の段落からの質問を続けると、どのように我々は知っているだろう通知指すようにエントリnotification_objectをしますか?