В последнее время я задавал несколько вопросов относительно дизайна базы данных, возможно, слишком много ;-) Однако я верю, что постепенно вхожу в суть вопроса с моим дизайном и медленно довожу его до конца. . Я все еще борюсь с парой решений относительно того, как «предупреждения» хранятся в базе данных.
В этой системе предупреждение - это объект, который должен быть подтвержден, действовать и т. Д.
Изначально я связал показания для предупреждений, подобных этому (очень урезанных): -
[Location]
LocationId
[Sensor]
SensorId
LocationId
UpperLimitValue
LowerLimitValue
[SensorReading]
SensorReadingId
Value
Status
Timestamp
[SensorAlert]
SensorAlertId
[SensorAlertReading]
SensorAlertId
SensorReadingId
Последняя таблица связывает показания с предупреждением, потому что именно показания определяют, находится ли датчик в состоянии тревоги.
Проблема с этой конструкцией заключается в том, что она позволяет связывать показания многих датчиков с одним предупреждением, тогда как каждое предупреждение предназначено только для одного датчика и должен иметь только показания для этого датчика, связанного с ним (я должен беспокоиться, что БД позволяет это?).
Я подумал упростить вещи, зачем вообще возиться с таблицей SensorAlertReading? Вместо этого я мог бы сделать следующее:
[Location]
LocationId
[Sensor]
SensorId
LocationId
[SensorReading]
SensorReadingId
SensorId
Value
Status
Timestamp
[SensorAlert]
SensorAlertId
SensorId
Timestamp
[SensorAlertEnd]
SensorAlertId
Timestamp
В основном я сейчас не связываю показания с предупреждением - вместо этого я просто знаю, что предупреждение было активным между временем начала и окончания для определенного датчика, и если я хочу посмотреть показания для этого предупреждения я могу сделать.
Очевидно, обратная сторона заключается в том, что у меня больше нет ограничений, мешающих мне удалять показания, полученные во время предупреждения, но я ' Вот еще одна идея - работает по-другому. Он сохраняет каждое изменение состояния датчика, переходя от нормального к аварийному в таблице, а затем показания просто связываются с определенным состоянием. Кажется, это решает все проблемы - что ты думаешь? (единственное, в чем я не уверен, так это называть таблицу "SensorState", я не могу не думать, что есть лучшее имя (может быть, SensorReadingGroup?): -
[Location]
LocationId
[Sensor]
SensorId
LocationId
[SensorState]
SensorStateId
SensorId
Timestamp
Status
IsInAlert
[SensorReading]
SensorReadingId
SensorStateId
Value
Timestamp
Для этого должно быть элегантное решение!