@ MikeM
Лично я бы всегда выбирал uniqueidentifier вместо int в качестве первичного ключа таблицы каждый раз. Однако я бы использовал NEWSEQUENTIALID (), а не NEWGUID (), чтобы обеспечить меньшую фрагментацию индекса.
Причина, по которой я делаю этот выбор, проста:
Слишком легко перепутать целые числа, и на столе с несколькими внешними ключами вероятность «случайного» ввода значения в неправильное поле слишком высока. Вы никогда не увидите проблему, потому что ВСЕ столбцы идентификаторов начинаются с начального числа 1, и поэтому большинство таблиц имеют одинаковые целочисленные значения в каждой таблице. Используя uniqueidentifier, я абсолютно гарантирую, что для всех экземпляров столбца, который имеет внешний ключ, правильное значение, которое я помещаю в него, потому что таблица, на которую он ссылается, является единственной таблицей, которая может иметь этот уникальный идентификатор.
Более того ... в коде все ваши аргументы будут иметь тип int, что снова открывает вам возможность случайно ввести неправильное значение в неправильный параметр, и вы никогда не узнаете ничего другого. Вместо этого, используя уникальные идентификаторы, вы снова гарантируете правильную ссылку.
Попытка отследить ошибки из-за перекрестно размещенных целых чисел коварна, и хуже всего то, что вы никогда не узнаете, что проблема возникла, пока не стало слишком поздно и данные не стали слишком поврежденными, чтобы вы могли их перепутать. Все, что требуется, это одно целочисленное поле с перекрестным соответствием, и вы можете потенциально создать миллионы несогласованных строк, ни о одной из которых вы не узнаете, пока просто не «попадаете», пытаясь вставить значение, которого нет в указанной таблице. и к тому времени может быть уже слишком поздно.