Избегайте обнуляемых «внешних ключей». У них есть несколько недостатков.
Ограничение на ссылочную строку не всегда применяется, когда внешний ключ содержит ноль. Однако такое поведение по умолчанию не согласовано между различными СУБД. Некоторые СУБД поддерживают параметры конфигурации для изменения поведения внешних ключей, допускающих нулевое значение, а некоторые - нет. Поэтому разработчики и пользователи SQL могут не знать, что на самом деле означает обнуляемое ограничение внешнего ключа с точки зрения целостности данных. Портирование базы данных между продуктами СУБД или даже между различными серверами, использующими один и тот же продукт, может дать противоречивые результаты.
Инструменты проектирования баз данных, инструменты интеграции и другое программное обеспечение не всегда поддерживают их правильно, и результаты, которые они производят, могут быть неверными.
Внешние ключи часто используются в соединениях и другой логике запросов, что усугубляет проблемы для пользователей, которые считают, что ограничение действует, когда его нет, или которые не знают логику, применяемую вашей конкретной СУБД.
Некоторые функции оптимизации запросов, позволяющие переписывать запросы и другие варианты оптимизации, могут быть недоступны, если внешний ключ имеет значение NULL.
С логической точки зрения, ограничение «внешний ключ», допускающее значение NULL, не имеет большого логического смысла. В соответствии со стандартом SQL такое ограничение не может быть нарушено, даже если ссылка на таблицу пуста. Это противоречит одному из наиболее распространенных предполагаемых оправданий использования нулевого значения - что оно представляет «неизвестный» случай. Если нет допустимых значений X, то любой «неизвестный» X, безусловно, не может быть допустимым значением - и все же SQL разрешит это.
Обнуляемые внешние ключи совершенно не нужны. Вы всегда можете либо разложить внешний ключ на новую таблицу, либо использовать шаблон супертипа / подтипа, чтобы нули не были нужны. Поэтому в интересах простоты и точности лучше не указывать значения null, а вставлять их.