Как далеко идти с ограничениями базы данных?

Этот вопрос связан с другим вопросом, который я задал. В моем другом вопросе я прошу мнения людей о трех разных способах создания базы данных. Самый чистый способ, которым я могу думать об этом без (практически) повторения таблиц и странных понятий, таких как "супер таблицы", - это вариант 2:

Location [Table]
- Id
- Name
- HasLogger
- LoggerRFID
- LoggerUpperLimit
- LoggerLowerLimit

Sensor [Table]
- Id [PK]
- LocationId [FK]
- UpperLimit
- LowerLimit

SensorReading [Table]
- Id [PK]
- SensorId [FK]
- Value

LoggerReading [Table]
- LocationId [FK]
- Value

Alert [Table]
- Id [PK]

AlertCorrectiveAction [Table]
- AlertId [FK]
- CorrectiveActionId [FK]
- ByUserId [FK]

AlertAcknowledgement [Table]
- AlertId [FK]
- ByUserId [FK]

SensorAlertReading [Table]
- AlertId [FK]
- SensorReadingId [FK]

LoggerAlertReading [Table]
 - AlertId [FK]
 - LoggerReadingId [FK]

Теперь проблема с этой опцией заключается в том, что она позволяет привязывать показания нескольких датчиков и нескольких местоположений к одному сигналу.

Чтобы объяснить, почему это проблема, я объясню, как работает система:

Местоположение может содержать множество "живых датчиков", но только 1 регистратор. По этой причине я помещал атрибуты регистратора в таблицу местоположений (это было эффективно с отношением 1 к 1). Регистратор собирает показания до тех пор, пока их не соберет позже, живые датчики мгновенно передают показания через сеть, и у них есть дополнительные атрибуты, такие как сетевые подчиненные устройства, которые имеют атрибуты сетевых адресов.. настолько сильно отличаются от регистраторов (я пытался обрабатывать регистраторы как датчики в одной точке, не получится хорошо).

Когда датчик или регистратор выходит за пределы диапазона (обозначается показанием), система генерирует предупреждение. Предупреждение относится только к этому датчику и считается активным до тех пор, пока показания для этого датчика (или регистратора) не покажут, что он находится в зоне действия. До этого времени показания, в которых датчик выходит за пределы диапазона, "привязаны" к тому же предупреждению.

Итак, как вы можете видеть, одно предупреждение должно иметь только показания для одного и того же сенсора, связанного с ним, однако мой проект выше позволяет различать показания от разных датчиков и регистраторов, связанных с одним и тем же предупреждением, - следует ли мне беспокоиться о том, что Я так не ограничил это? Другая проблема заключается в том, что он позволяет оповещения существовать без каких-либо чтений.

Отсюда мой вопрос; насколько далеко следует идти с ограничениями или сгибать дизайн в соответствии с этими ограничениями? Мне нравится дизайн выше, потому что он прост: предупреждения могут иметь показания датчиков и показания регистратора, поэтому это простое отношение, чтобы связать их.

Я не могу не думать, что мне тоже не хватает трюка - есть ли гораздо лучший способ сделать этот проект? Я крутился с ним целую вечность и всегда кажется компромиссом (если я не повторяю все таблицы предупреждений для разных типов чтения).

Спасибо.

Ответ 1

Должен ли я беспокоиться, что я так не ограничил это?

Да.

Вы совершили две основные ошибки.

  • Нажатие Id iot клавиш на все, что движется.

    Это затрудняет вашу способность моделировать данные как данные (не как строки, которые не имеют смысла, но с искусственно соблюдаемой уникальностью) и раскрывают идентификаторы; и Dependdencies (например, датчик зависит от местоположения). Вы моделируете электронные таблицы с предварительно заданными Row_Ids, содержащими данные. Вы должны нормализовать данные, как данные.

    Это привело к обнаруженной проблеме, но есть и другие проблемы.

    Если вы моделируете данные, Идентификаторы будут ясными, а ограничения индекса и FK будут предотвращать это. Какие данные независимы; какие данные принадлежат (зависит от), какие другие данные; какие данные делают то, что для других данных, и основы этих действий.

    Затем (основные проблемы были устранены) вы остаетесь с незначительными ограничениями для решения небольших областей.

  • В противном случае вы застряли с добавлением ограничений по всему месту, чтобы попробовать и получить то, что хотите, но никогда не попадаете туда. Вы знаете, что они вам нужны, поэтому вы ищете их.

Неправильное место. Нам нужно выполнить резервное копирование до (1).

Я ответил на ваш другой вопрос и включил ▶ Модель данных датчика ◀. Это не устраняет недостатки, которые вы идентифицируете здесь. Тем не менее, я только что увидел этот вопрос, я буду обновлять DM завтра и включать эти таблицы и столбцы.

▶ Ссылка на идентификатор IDEF1X ◀ для тех, кто не знаком со стандартом для моделирования реляционных баз данных.

Вопросы

  • Похоже, вам нужна ссылочная таблица для датчиков, элемент полки, чтобы удерживать UpperLimit и LowerLimit; а не повторять его для каждого местоположения. Или они установлены локально для каждого местоположения.

  • Подумайте о том, что Logger является SensorNo нолем.

  • Почему у датчиков нет RFID?

  • В каждом Location параметр Logger необязателен, это 1:: 0-1?,

Ответ 2

Почему бы не иметь:

Alert [Table]
- Id [PK]  
- SensorReadingId [FK]  
- LoggerReadingId [FK]  

И затем вы заполняете либо SensorReadingId, либо LoggerReadingId. Я полагаю, что ваша структура является упрощенной, но часто представляет собой таблицу, в которой нет ничего, кроме того, что один PK является избыточным.