Я создаю базу данных для мониторинга состояния функциональных возможностей приложений. Логика следующая:
Каждое приложение имеет свой собственный список функций, которые я отслеживаю. Каждая функциональность принадлежит только одному приложению. Существует таблица функций с внешним ключом для приложения.
Каждое приложение работает на одной или нескольких машинах. Каждая машина может запускать одно или несколько приложений. Это соединение MTM, поэтому существует соединение таблицы ApplicationInstance Applications with Machines.
Фактический мониторинг заключается в запросе ApplicationInstance. Если есть проблема, информация о ней попадает в таблицу AppInstanceError, которая содержит внешний ключ к ApplicationInstance. Если запрос выполнен успешно, мы получаем список статусов каждой функциональности. Итак, у нас есть таблица FunctionalityStatus с внешними ключами ApplicationInstance и Functionality.
Я думаю, что это плохой дизайн - почему у нас есть несколько ссылок на приложение? Какие гарантии, что оба будут указывать на одно и то же приложение? Или есть способ это обеспечить?
Поэтому мое предложение по исправлению состоит в том, чтобы связать FunctionalityStatus с внешними ключами с Machines & Functionality. Но в этом случае они определяют ApplicationInstance, так какова гарантия наличия ApplicationInstance для каждой пары? Разве они не должны быть как-то связаны? В реальном мире связь существует и очевидна, поэтому можно ли не иметь ее в базе данных?
Есть ли «правильный способ» решения этой проблемы или обеспечения связи, невидимой из дизайна данных?
Чтобы было понятнее, я подготовил дизайн БД, который у меня сейчас есть:
Единственное, чего не хватает, так это подключения от FunctionalityStatus к Machine. Я вижу два пути создания такой связи:
- Add foreign key to ApplicationInstance - then my doubts are:
- How to make sure that ApplicationId from Functionality is the same that one from ApplicationInstance?
- Действительно ли необходимо это дублирование данных?
- Add foreign key to Machine - and doubts:
- Will there be a propper ApplicationInstance record for every FunctionalityStatus record?
- Если существует очевидная связь между ApplicationInstance и FunctionalityStatus (упомянутая в первом случае), почему мы не можем увидеть ее в базе данных?
- Снова избыточность данных, потому что все записи ApplicationInstance видны (или должны быть) в таблице FunctionalityStatus.
Или, может быть, весь дизайн испорчен, и я должен придумать что-то совсем другое?