Я обычно использую 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();
Представьте себе таблицу, в которой хранятся TODO команды. Если TODO еще не назначен члену группы, его user_id
равен NULL
. Если он не NULL
, это внешний ключ для таблицы пользователей
.
Нет, внешние ключи, допускающие значение NULL, никогда не необходимы .
Вы всегда можете нормализовать необязательную связь «1-много». Если взять ваш пример, у вас могут быть следующие таблицы:
Customers: customer_id, ...
Orders: order_id, ...
OrdersCustomers: order_id, customer_id
UNIQUE(order_id)
Два уникальных ограничения гарантируют, что один заказ может принадлежать только одному покупателю и никогда одному и тому же покупателю дважды.
Всегда ли вы должны нормализовать такие отношения - это другая история. В некоторых случаях денормализация может привести к более простой реализации.
Таким образом, понятие обнуляемого внешний ключ кажется несовместимым с цель внешнего ключа, который должен обеспечить соблюдение этого ограничения.
Назначение внешнего ключа - явное выражение концепции, когда случайное целое число в таблице «Заказы» фактически относится к элементу в таблице «Клиенты». На самом деле принудительное применение этого ограничения случайно.
Обычный сценарий разработки для установки столбца в значение NULL - это если у вас есть отношение один-ко-многим родительским дочерним элементам, но дочерние элементы могут не присутствовать.
Когда у родительской записи (например, учетной записи) есть дочерние элементы, которые могут быть удалены (например, запросы помощи), это хорошее использование.
У вас может быть столбец для MostRecentRequest, который включает идентификатор самого последнего запроса помощи. Когда запрос удаляется из системы, столбец MostRecentRequest устанавливается в NULL, что означает, что их нет.
Другой пример - когда вы хотите, чтобы NULL означал, что строке еще не назначен родительский элемент. Возможно, у вас есть запросы о помощи, и NULL в поле технического специалиста означает, что для запроса не назначена никакая технология.