Я пытаюсь создать базу данных для хранения информации о записях биологических сигналов. Каждая запись использует датчик, и если запись использует датчик силы, необходима дополнительная информация, чтобы знать, к какому каналу подключены положительный и отрицательный выводы датчика. Для других типов датчиков дополнительная информация не требуется.
Я новичок в SQL, и моей первой попыткой было создать таблицу записей, таблицу типов датчиков и таблицу сигналов силы. Для каждой записи я использую FK, чтобы указать тип датчика, и, если датчик является датчиком силы, я добавляю строку в таблицу force_signal, содержащую дополнительную информацию, и FK, ссылающийся на PK записи.
record:
record_id (PK)
record_name
sensor_type_id (FK)
... [other fields describing the record]
sensor_type:
sensor_type_id (PK)
sensor_name
... [additional informations of the sensor type]
force_info:
force_info_id (PK)
record_id (FK)
channel_positive
channel_negative
Таким образом, возможно, например, иметь запись с использованием датчика силы без соответствующей строки force_info (и тогда я задаюсь вопросом «Как реализовать реальное взаимно-однозначное отношение?»). Есть ли лучшая структура, чтобы удовлетворить мои требования и избежать проблемы один на один?
Вместо FK в force_info, ссылающегося на PK записи, я также подумал об использовании FK в таблице записи, ссылающейся на PK force_info с условием NOT NULL, только если sensor_type_id соответствует датчику силы. Для меня это лучше, потому что он гарантирует, что каждая запись, использующая датчик силы, имеет связанную строку в таблице force_info. Но тогда у меня могут быть строки force_info, не связанные ни с одной записью (например, если я удалю запись, в которой используется датчик силы). Это не большая проблема, потому что эти строки force_info без связанной записи будут похожи на призрак в моей базе данных, не вызывая проблем с целостностью данных, но я не думаю, что иметь эти призраки - хорошая практика.
Лучше удалить данные из таблицы force_info, когда они больше не нужны. Это может быть достигнуто автоматически с помощью TRIGGER при DELETE в записи таблицы.