Я создаю базу данных для мониторинга состояния функциональности приложений. Логика следующая:
Каждое приложение имеет свой определенный список функций, которые я отслеживаю. Каждый функционал принадлежит только одному приложению. Существует таблица Функциональности, которая имеет внешний ключ для Приложения
Каждое приложение работает на одном или нескольких компьютерах. На каждой машине может работать одно или несколько приложений. Это соединение MTM, поэтому есть соединение таблицы ApplicationInstance Приложения с машинами.
Фактический мониторинг касается запросов ApplicationInstance. В случае возникновения проблемы информация о ней поступает в таблицу AppInstanceError, которая содержит внешний ключ для ApplicationInstance. Если запрос выполнен успешно, мы получаем список статусов каждой функции. Итак, у нас есть таблица FunctionalityStatus с внешними ключами для ApplicationInstance & Functionality.
Я думаю, что это плохой дизайн - почему у нас есть несколько ссылок на приложение? Что гарантирует, что оба будут указывать на одно и то же приложение? Или есть ли способ это обеспечить?
Таким образом, мое предложение исправить это соединить FunctionalityStatus с внешними ключами для Machines & Functionality. Но в этом случае они определяют ApplicationInstance, так какова гарантия наличия ApplicationInstance для каждой пары? Разве они не должны быть связаны как-то? В реальном мире связь существует и очевидна, так что нормально, если ее нет в базе данных?
Существует ли «более эффективный» способ решения этой проблемы или обеспечения невидимых соединений при проектировании данных?
Чтобы было понятнее, я подготовил дизайн БД, который у меня сейчас:
Единственное, чего не хватает, так это соединения между FunctionalityStatus и Machine. Я вижу два способа сделать такое соединение:
- Добавить внешний ключ в ApplicationInstance - тогда мои сомнения:
- Как убедиться, что ApplicationId из Functionality такой же, как и из ApplicationInstance?
- Разве это дублирование данных действительно необходимо?
- Добавить внешний ключ к машине - и сомневается:
- Будет ли для каждой записи FunctionalityStatus соответствующая запись ApplicationInstance?
- Если существует очевидная связь между ApplicationInstance и FunctionalityStatus (упомянутое в первом сомнении), почему мы не можем увидеть его в базе данных?
- Опять избыточность данных, поскольку все записи ApplicationInstance (или должны быть) видны в таблице FunctionalityStatus
Или, может быть, весь дизайн облажался, и я должен выяснить что-то еще?