В последнее время я задал несколько вопросов о дизайне базы данных, возможно, слишком много;-) Однако я верю, что я медленно вникаю в суть дела с моим дизайном и медленно его кипятил. Я все еще борюсь с несколькими решениями относительно того, как "предупреждения" хранятся в базе данных.
В этой системе предупреждение представляет собой объект, который должен быть подтвержден, действовать и т.д.
Изначально я рассказывал о таких предупреждениях (очень сокращенно): -
[Location]
LocationId
[Sensor]
SensorId
LocationId
UpperLimitValue
LowerLimitValue
[SensorReading]
SensorReadingId
Value
Status
Timestamp
[SensorAlert]
SensorAlertId
[SensorAlertReading]
SensorAlertId
SensorReadingId
Последняя таблица связывает показания с предупреждением, потому что это чтение, которое указывает, что датчик находится в состоянии готовности или нет.
Проблема с этим дизайном заключается в том, что он позволяет считывать данные из многих датчиков с одним предупреждением, тогда как каждое предупреждение предназначено только для одного датчика и должно иметь только показания для связанного с ним датчика (следует ли мне беспокоиться о том, что DB позволяет это, хотя?).
Я думал упростить вещи, зачем даже беспокоиться о таблице 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
Там должно быть элегантное решение!