В последнее время я задал несколько вопросов относительно дизайна базы данных, возможно, слишком много ;-) Однако я полагаю, что я постепенно разбираюсь в сути дела с моим дизайном и постепенно его разрушаю. Я все еще борюсь с парой решений относительно того, как «предупреждения» хранятся в базе данных.
В этой системе оповещение - это объект, который должен быть подтвержден, обработан и т. Д.
Изначально я связывал показания с такими предупреждениями (очень урезано): -
[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
По сути, сейчас я не связываю показания с предупреждением - вместо этого я просто знаю, что оповещение было активным между временем начала и окончания для определенного датчика, и если я хочу просмотреть показания для этого предупреждения, я могу сделать ,
Очевидно, недостатком является то, что у меня больше нет ограничений, мешающих мне удалять показания, которые произошли во время оповещения, но я не уверен, что ограничение необходимо.
Теперь, когда вы выглядите разработчиком / администратором базы данных со стороны, это заставляет вас хотеть заболеть или это кажется разумным?
Может быть, есть еще один способ сделать это, что я могу пропустить?
Спасибо.
EDIT:
Вот еще одна идея - это работает по-другому. Он хранит каждое изменение состояния датчика, переходя от нормального состояния к предупреждению в таблице, а затем показания просто связываются с определенным состоянием. Кажется, это решает все проблемы - что ты думаешь? (единственное, в чем я не уверен, так это в вызове таблицы «SensorState», не могу не подумать, что есть более подходящее имя (возможно, SensorReadingGroup?): -
[Location]
LocationId
[Sensor]
SensorId
LocationId
[SensorState]
SensorStateId
SensorId
Timestamp
Status
IsInAlert
[SensorReading]
SensorReadingId
SensorStateId
Value
Timestamp
Должно быть элегантное решение для этого!