Внешний ключ «Нет» или «Не используется» при использовании GUID в качестве первичного ключа - PullRequest
1 голос
/ 07 марта 2009

Мы создаем приложение, которое, возможно, потребуется реплицировать на многие серверы (я надеюсь, что нет, но нет способа узнать, потребуется ли клиентам их собственная копия клиент / сервер, пока мы не выпустим онлайн-продукт).

Поскольку число серверов неизвестно, я решил использовать GUID для любых идентификаторов транзакционной таблицы. Поскольку каждый клиент имеет свою собственную базу данных, я намерен использовать значение по умолчанию NEWSEQUENTIALID (), а самая большая таблица будет добавлять не более 1,5 млн строк в год (но в среднем 15 тыс. Строк), я не ожидаю значительных проблем с производительностью .

Однако я не уверен, как обращаться со случаями, когда мы хотим, чтобы внешний ключ указывал «ни один не выбран». Например, клиент имеет одного администратора. Это устанавливается как внешний ключ (login_id) для login.id (GUID). Однако, если у клиента еще нет пользователя с правами администратора, как мы могли бы легко настроить клавишу «Нет выбранных»?

В предыдущих приложениях мы использовали столбцы IDENTITY и вставляли в большинство таблиц фиктивную запись с идентификатором 0. Существует ли принятый подход к предоставлению аналогичных функций с GUID?

Ответы [ 4 ]

4 голосов
/ 08 марта 2009

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

Репликация может работать очень просто: реплицируйте вставки и обновляйте сначала в порядке родительской таблицы, затем реплицируйте удаленные записи от дочерней к родительской. (в обратном порядке.)

Надеюсь, это поможет.

2 голосов
/ 07 марта 2009

У вас есть 3 варианта:

1) В вашей ссылочной таблице добавьте пустую строку значений с указанием всех нулей, затем укажите ссылку на эту запись

2) Просто сохраните ноль для пустых ссылок

3) Не иметь пустых записей в справочной таблице, но хранить нулевую направляющую. Это может вызвать проблемы, если объединения выполняются в базе данных или с отчетами. Вам придется написать код для этого особого случая.

Я бы сказал, что 1 и 2 - единственные хорошие варианты.

1 голос
/ 07 марта 2009

Сделайте поле внешнего ключа в дочерней таблице NULLable и оставьте поле NULL, когда нет администратора. Магические значения, такие как столбцы идентификаторов «0», - это катастрофа, ожидающая наступления.

1 голос
/ 07 марта 2009

Я мог бы упустить что-то действительно очевидное здесь, но вы не можете просто установить его в NULL?

...