アプリケーションの機能の状態を監視するためのデータベースを作成しています。ロジックは次のとおりです。
各アプリケーションには、私が監視している独自の特定の機能リストがあります。各機能は、1 つのアプリケーションのみに属します。アプリケーションへの外部キーを持つ機能テーブルがあります
各アプリケーションは、1 つ以上のマシンで実行されます。各マシンは、1 つ以上のアプリケーションを実行できます。これは MTM 接続なので、ApplicationInstance テーブル接続アプリケーションとマシンがあります。
実際の監視は、ApplicationInstance のクエリに関するものです。問題がある場合、それに関する情報は、ApplicationInstance への外部キーを保持する AppInstanceError テーブルに送られます。クエリが成功すると、各機能のステータスのリストが取得されます。したがって、ApplicationInstance と Functionality への外部キーを持つ FunctionalityStatus テーブルがあります。
これは一種の悪い設計だと思います。なぜアプリケーションへの複数の参照があるのでしょうか? 両方が同じアプリケーションを指すことを保証するものは何ですか? または、これを確実にする方法はありますか?
したがって、私の修正案は、FunctionalityStatus を外部キーで Machines & Functionality に接続することです。しかし、この場合、彼らは ApplicationInstance を定義しているので、各ペアに ApplicationInstance があるという保証は何ですか? 何らかの形で接続すべきではないでしょうか。現実の世界では接続が存在し、それは明白なので、データベースに存在しなくても問題ないでしょうか?
この問題を解決する、またはデータ設計から見えない接続を確保する「適切な方法」はありますか?
より明確にするために、現在持っている DB の設計を準備しました。
欠けているのは、FunctionalityStatus から Machine への接続だけです。このような接続を行うには、次の 2 つの方法があります。
- 外部キーを ApplicationInstance に追加します - 次に、私の疑問は次のとおりです。
- Functionality の ApplicationId が ApplicationInstance の ApplicationId と同じであることを確認するにはどうすればよいですか?
- このデータの複製は本当に必要ですか?
- マシンに外部キーを追加 - そして疑問:
- すべての FunctionalityStatus レコードに適切な ApplicationInstance レコードがありますか?
- ApplicationInstance と FunctionalityStatus の間に明らかな関連がある場合 (最初の疑問で言及)、データベースでそれを確認できないのはなぜですか?
- ここでも、すべての ApplicationInstance レコードが FunctionalityStatus テーブルに表示される (または表示されるはず) ため、データの冗長性が確保されます。
それとも、デザイン全体が台無しになっていて、まったく別のことを考え出す必要があるのでしょうか?