我正在创建用于监控应用程序功能状态的数据库。逻辑如下:
每个应用程序都有自己的特定功能列表,我正在监控这些功能。每个功能只属于一个应用程序。有一个具有应用程序外键的功能表
每个应用程序都在一台或多台机器上运行。每台机器都可以运行一个或多个应用程序。这是MTM连接,所以有ApplicationInstance表连接Applications with Machines。
实际监控是查询ApplicationInstance。如果有问题,有关它的信息将转到 AppInstanceError 表,该表包含 ApplicationInstance 的外键。如果查询成功,我们会得到每个功能的状态列表。所以我们有一个功能状态表,其中包含应用程序实例和功能的外键。
我认为这是一种糟糕的设计——为什么我们要多次引用应用程序?什么保证两者都指向同一个应用程序?或者有什么办法可以确保这一点?
所以我的修复建议是将功能状态与机器和功能的外键连接起来。但是在这种情况下,他们定义了 ApplicationInstance 那么每对都有 ApplicationInstance 的保证是什么?他们不应该以某种方式连接吗?在现实世界中存在连接并且是显而易见的,那么数据库中没有它可以吗?
是否有解决这个问题的“正确方法”,或者确保连接从数据设计中不可见?
为了更清楚,我准备了我现在拥有的数据库设计:
唯一缺少的是从功能状态到机器的连接。我看到了两种建立这种联系的方法:
- 将外键添加到 ApplicationInstance - 那么我的疑问是:
- 如何确保功能中的 ApplicationId 与 ApplicationInstance 中的相同?
- 真的需要这种数据复制吗?
- 将外键添加到机器 - 和疑问:
- 每个功能状态记录都会有一个适当的 ApplicationInstance 记录吗?
- 如果 ApplicationInstance 和 FunctionalityStatus 之间有明显的联系(在第一个疑问中提到)我们不能在数据库中看到它吗?
- 再次数据冗余,因为所有 ApplicationInstance 记录都(或应该)在 FunctionalityStatus 表中可见
或者,也许整个设计都搞砸了,我应该找出完全不同的东西?