Какой-либо пример необходимого nullable внешнего ключа?

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

//assuming bool is available (where I come from it is an enum)

typedef bool (*pmyfun_t)();

pmyfun_t pMyFun;

pMyFun=A; //pMyFun=&A is actually same

pMyFun();
18
задан eggdrop 29 May 2009 в 09:48
поделиться

4 ответа

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

48
ответ дан 30 November 2019 в 05:47
поделиться

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

Вы всегда можете нормализовать необязательную связь «1-много». Если взять ваш пример, у вас могут быть следующие таблицы:

Customers: customer_id, ...
Orders: order_id, ...
OrdersCustomers: order_id, customer_id
  UNIQUE(order_id)

Два уникальных ограничения гарантируют, что один заказ может принадлежать только одному покупателю и никогда одному и тому же покупателю дважды.

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

16
ответ дан 30 November 2019 в 05:47
поделиться

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

Назначение внешнего ключа - явное выражение концепции, когда случайное целое число в таблице «Заказы» фактически относится к элементу в таблице «Клиенты». На самом деле принудительное применение этого ограничения случайно.

5
ответ дан 30 November 2019 в 05:47
поделиться

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

Когда у родительской записи (например, учетной записи) есть дочерние элементы, которые могут быть удалены (например, запросы помощи), это хорошее использование.

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

Другой пример - когда вы хотите, чтобы NULL означал, что строке еще не назначен родительский элемент. Возможно, у вас есть запросы о помощи, и NULL в поле технического специалиста означает, что для запроса не назначена никакая технология.

0
ответ дан 30 November 2019 в 05:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: