Я думаю, что эта дискуссия является еще одним побочным продуктом несоответствия объектно-реляционного сопротивления . Некоторые DBA-типы педантично скажут, что никогда не разрешать null в FK, основываясь на более глубоком понимании семантики реляционной алгебры, но разработчики приложений будут утверждать, что это делает их уровень домена более элегантным.
Варианты использования для "еще не установленных" отношений действительны, но с нулевыми FK некоторые считают, что это усложняет их запросы, вводя более сложные функции SQL, в частности, LEFT JOINs.
Одним из распространенных альтернативных решений, которое я видел, является введение «нулевой строки» или «строки часового» в каждую таблицу с pk = 0 или pk = 1 (в зависимости от того, что поддерживается вашей RDBMS). Это позволяет вам создавать доменный слой с «еще не установленными» отношениями, но также избегать введения ЛЕВЫХ СОЕДИНЕНИЙ, поскольку вы гарантируете, что всегда будет к чему присоединиться.
Конечно, этот подход также требует усердия, потому что вы в основном торгуете с ЛЕВЫМИ СОЕДИНЕНИЯМИ за необходимость проверять наличие вашей строки дозорного в запросах, чтобы вы не обновляли / не удаляли ее и т. Д. оправданы это другое дело. Я склонен согласиться с тем, что изобретать null просто для того, чтобы избежать более изящного объединения, кажется немного глупым, но я также работал в среде, где разработчики приложений не выигрывают дебаты с администраторами баз данных.
редактирует
Я удалил некоторые формулировки «по сути» и попытался уточнить, что я имел в виду под «неудачными» объединениями. Пример @ wcoenen - причина, по которой я лично чаще всего слышал, чтобы избегать нулевых ФК. Дело не в том, что они терпят неудачу, как в «сломанном», а в том, что некоторые терпят неудачу - придерживаться принципа наименьшего удивления.
Кроме того, я превратил этот ответ в вики, поскольку по сути я выбил его из исходного состояния и позаимствовал из других постов.