最初のステップは、常に適切な要件分析です。私がプロジェクトマネージャーだとしましょう。システムにログインすると、唯一のプロジェクトが時間どおりに表示されます。開発者が私のオフィスに来て、彼の活動に遅れがあると私に言いました。開発者のアクティビティを選択し、その期間を変更します。システムはまだ私のプロジェクトを時間通りに表示しているので、私は喜んで仕事を辞めます。
午前3時にクライアントから電話があり、プロジェクトが時間どおりに行われなくなった理由の説明を求められたら、どのように感じますか?明らかに、システムが私に警告を出さなかったので、非常に驚いています。なぜそれが起こったのですか?プロジェクトのステータスを更新するために、スケジュールされたジョブの次の実行を30秒(なぜ1秒だけではないのですか?)待たなければならなかったためです。
それは解決策にはなり得ません。プロセスの実行に30秒かかる場合でも、警告をユーザーにすぐに送信する必要がありIsStale()
ます。ユーザーにloading...
画像などを表示しますが、ユーザーが正確なデータを持っていることを確認してください。
さて、実装に関しては、前の問題から逃げるために何もすることはできません。いくつかの期日に影響を与える何かが変更されたときに、そのプロセスを実行する必要があります。ただし、できることは、そのプロセスを不必要に実行することではありません。たとえば、ユーザーがログインするたびに実行できるとおっしゃいました。2人以上のユーザーがログインして同じプロジェクトを表示し、何も変更しない場合はどうなりますか?プロセスを2回実行する必要はありません。
さらに、ユーザーがプロジェクトを更新するときにプロセスが実行されていることを確認すれば、それ以外のときにプロセスを実行する必要はありません。結論として、このスキーマには、「ポーリング」ソリューションと比較して次の長所と短所があります。
利点
- 予定されている仕事はありません
dirty
不要なプロセスは実行されません(プロジェクトにフラグを設定し、フラグが設定されている場合にのみ実行できるため、これは議論の余地がありますtrue
)
dirty
値の不要なクエリはありません
- ユーザーには、プロジェクトの現在および実際の状態が常に通知されます(これは、提供されているソリューションで対処する最も重要な項目です)。
短所
- ユーザーがプロジェクトを更新し、数秒で再度更新した場合、プロセスは2回実行されます(ポーリングスキーマでは、スケジュールされた頻度によっては、プロセスがその期間に1回実行されない場合もあります)。
- プロジェクトを更新するユーザーは、プロセスが終了するのを待つ必要があります
StackOverflowと同様の方法で通知システムを実装する方法に変更すると、まったく別の質問になります。あなたはユーザーやプロジェクトと多対多の関係を持っていると思います。最も簡単な解決策は、これらのエンティティ間の関係に単一の属性を追加することです(中央のテーブル)。

カーディナリティ:ユーザーには多くのプロジェクトがあります。プロジェクトには多くのユーザーがいます
そうすれば、プロセスを実行するときに、各ユーザーHas_pending_notifications
を新しい結果で更新する必要があります。たとえば、ユーザーがプロジェクトを更新し、それが時間どおりに行われtrue
なくなった場合は、すべてのユーザーフィールドに設定して、ユーザーHas_pending_notifications
が状況を認識できるようにする必要があります。同様に、プロジェクトが時間どおりになっているときに設定しますfalse
(プロジェクトが時間どおりになっていないときに通知が表示されることを確認したいだけだと思います)。
StackOverflowの例をとると、ユーザーが通知を読むときは、フラグをに設定する必要がありますfalse
。タイムスタンプを使用して、ユーザーが通知を読んだかどうかを推測しないようにしてください。ログインしても、通知を読んだわけではありません。
最後に、通知自体が十分に複雑な場合は、ユーザーとプロジェクトの関係から通知を移動して、次のようにすることができます。

カーディナリティ:ユーザーには多くのプロジェクトがあります。プロジェクトには多くのユーザーがいます。ユーザーには多くの通知があります。通知には1人のユーザーがいます。プロジェクトには多くの通知があります。通知には1つのプロジェクトがあります。
私が言ったことが理にかなっていることを願っています、またはあなたに他のより良いアイデアを与えるでしょう:)