Представьте себе, в нашей модели данных у нас есть сущность (структура данных), которая имеет необязательные части. Мы можем реализовать эти «части» как пустые ссылки на другие (дочерние) сущности. Другими словами, каждый экземпляр главного объекта может иметь или не иметь единственный экземпляр другого (дочернего) объекта, связанного с ним, и любой экземпляр дочернего объекта имеет только один экземпляр главного объекта, связанный с ним. Таким образом, у нас есть отношение от 1 до 0..1.
Например, запись журнала аудита имеет общие поля, такие как (отметка времени, пользователь, операция), а также спецификация операции c part (расширенная информация), которая может быть совершенно разным для разных операций. Мы можем использовать отдельную сущность для представления каждого типа расширенной информации, а затем заставить основную сущность иметь обнуляемые ссылки на каждый возможный тип расширенной информации.
Я вижу 2 способа реализации ее в реляционных базах данных:
1. Обнуляемые ссылки на дочерние сущности в основной записи
Для каждого типа дочерней сущности таблица основной записи имеет поле, ссылающееся на идентификатор записи из дочерней (внутренней) таблицы в качестве внешнего ключа.
Это кажется более простым вариантом: чтобы получить соответствующую информацию, мы просто следуем по прямой ссылке. В запросе SQL мы объединяем дочерние таблицы (расширения) по внешнему ключу. Нулевые значения внешнего ключа дадут нам нулевые значения для всех полей дочерних таблиц.
2. Записи дочерних сущностей ссылаются на записи главной сущности
Мы не храним никаких ссылок в таблице главной сущности. Вместо этого каждая запись таблиц дочерних сущностей ссылается на запись из основной таблицы по идентификатору в качестве внешнего ключа. В запросе SQL мы все еще оставляем дочерние таблицы в основной и получаем нулевые значения для всех полей дочерних таблиц, в которых нет соответствующей дочерней записи.
???
Какой подход является правильным? Второй, кажется, более реляционный , и нам не нужно создавать дополнительные поля в основной таблице, но технически может потребоваться больше работы для поиска связанных записей, потому что вместо следующих прямых ссылок мы имеем искать основной идентификатор в дочерних таблицах. Или механизмы БД оптимизируют этот тип соединений, чтобы они были быстрыми, например, с помощью индексов? Поиск по индексу быстрее, чем сканирование, но все же медленнее, чем прямая ссылка. Плюс индексы занимают место. Я восполняю недостаток знаний о том, как работают механизмы БД ... Или, может быть, я просто упускаю что-то очевидное. Помощь будет высоко ценится.
Обновление
Получив ответ ниже, а также немного подумав, решил использовать второй подход. В дополнение к тому, что было сказано в принятом ответе (более компактный, более корректный с точки зрения отношений, не должен иметь дело с NULL), это также дает мне хорошую возможность использовать каскадное удаление, если мне нужно удалить основные записи со всеми соответствующими дочерние записи.