Обнуление внешнего ключа плохая практика?



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



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



(в моем случае это не заказ, а клиент).



EDIT: как насчет неназначенного клиента для ссылки?

437   11  

11 ответов:

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

на боковой ноте; использование таблицы ссылок не обязательно делает его n к n, если вы в таблице ссылок используете внешний ключ это указывает на вашу таблицу заказов в качестве первичного ключа в этой таблице ссылок, отношение по-прежнему равно 1..Н. Может быть только одна запись в этой ссылке таблица на заказ.

нет ничего плохого в ФКС допускает значения null. Это распространено, когда сущность, на которую указывает FK, находится в отношении (ноль или один) к (1 или много) с таблицей ссылок на первичный ключ.

пример может быть, если у вас есть как физический адрес, так и атрибут почтового адреса (столбец) в таблице, с FKs в таблицу адресов. Вы можете сделать физический адрес пустого дескриптора, когда предприятие имеет только почтовый ящик (почтовый адрес) и почтовый адрес nullable на ручки, если почтовый адрес совпадает с физическим адресом (или нет).

nullable столбцы могут быть в 1NF через 5NF, но не в 6NF в соответствии с тем, что я прочитал.

только если вы знаете лучше, чем Крис дата ", что первая нормальная форма означает на самом деле". Если X и y оба являются nullable, и действительно в какой-то строке X и y null, потом WHERE x=y не дает true. Это доказывает, что null не является значением (потому что любое реальное значение всегда равно самому себе). И поскольку РМ предписывает, что " должно быть значение в каждой ячейке таблицы", любая вещь, которая может содержать нули, не является реляционной вещью, и поэтому вопрос о 1NF даже не возникает.

Я слышал, что он утверждал, что столбцы с нулевым значением в целом нарушают первую степень нормализации.

см. выше по разумной причине, лежащей в основе этого аргумента.

но на практике это очень практично.

только если вы невосприимчивы к головным болям, что это обычно причины во всем остальном мире. Одна такая головная боль (и это только незначительная, по сравнению с другими null явления) является тот факт, что WHERE x=y в SQL на самом деле означает WHERE x is not null and y is not null and x=y, но большинство программистов просто не знают об этом факте и просто читают его. Иногда без всякого вреда, иногда нет.

фактически, столбцы с нулевым значением нарушают одно из самых фундаментальных правил проектирования базы данных : не объединяйте отдельные информационные элементы в одном столбце. Нулями делать именно потому, что они объединяют логическое значение "это поле/на самом деле не присутствует" с фактическим значением.

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

дополнительные отношения, безусловно, возможны в реляционной модели.

вы можете использовать нули, чтобы выразить отсутствие связи. Они удобны, но они вызовут у вас те же головные боли, что нулевые вызывают у вас в другом месте. Одно место, где они не вызывают никаких проблем, - это соединения. Строки, имеющие значение null во внешнем ключе, не совпадают ни с одной строкой в указанной таблице. Поэтому они выпадают из внутреннего соединения. Если вы делаете внешние соединения, вы будете иметь дело с нули в любом случае.

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

использование NULL было бы хорошим способом очистить неполные заказы:

SELECT * FROM `orders`
WHERE `started_time` < (UNIX_TIMESTAMP() + 900) AND `customer_id` IS NULL

выше будут показаны заказы старше 15 минут без соответствующего идентификатора клиента.

Nullable FKs для необязательных отношений "многие к одному" полностью в порядке.

Если вы только добавляете заказ временно без идентификатора клиента до тех пор, пока клиент не будет определен, не будет ли проще добавить клиента и заказ в одной транзакции, тем самым устраняя необходимость ввода нулевого внешнего ключа и избегая каких-либо ограничений или триггеров, которые вы установили, нарушаются?

обычно эта ситуация возникает в веб-приложениях, где заказ детализируется до того, как клиент определяет, кто он / она. И в тех ситуациях порядок сохраняется на сервере состояние или в файле cookie до тех пор, пока не будет предоставлено все необходимое состояние для полного Заказа, после чего заказ сохраняется в базе данных.

нулевые внешние ключи в порядке для таких вещей, как адреса, Как упоминалось выше. Но поле NULL customer не имеет смысла для заказа и должно быть ограничено.

вы всегда можете добавить искусственную строку в таблицу Customer, что-то вроде Id=-1 и CustomerName = 'Unknown', а затем в случаях, когда вы обычно устанавливаете свой CustomerId в порядке NULL, установите его в -1.

Это позволяет вам не иметь нулевых FKs, но по-прежнему представлять отсутствие данных соответствующим образом (и избавит вас от нижестоящих пользователей, не знающих, как обращаться с нулями).

Я слышал, что он утверждал, что столбцы с нулевым значением в целом нарушают первую степень нормализации. Но на практике это очень практично.

Да там что-то не так. Его не внешний ключ, если его можно обнулить. Его дизайн базы данных по коду. Может быть, вы сделаете нулевую ссылку на неназначенный. или "неназначенные", если вы используете символ, коль. Сохранить целостность ваших данных 100%.

Comments

    Ничего не найдено.