Что касается Первичного ключа, независимо от того, что физически делает строку уникальной, должен быть определен как первичный ключ.
Для ссылки как внешний ключ, с помощью автоматического целого числа постепенного увеличения, поскольку суррогат является хорошей идеей по двум главным причинам.
- Сначала, там меньше наверху поносится в соединении обычно.
- Второй, если необходимо обновить таблицу, которая содержит уникальный varchar тогда, обновление должно расположиться каскадом вниз ко всем дочерним таблицам и обновить всех их, а также индексы, тогда как с международным суррогатом, это только должно обновить основную таблицу, и это - индексы.
drawaback к использованию суррогата - то, что Вы могли возможно позволить изменяться значения суррогата:
ex.
id value
1 A
2 B
3 C
Update 3 to D
id value
1 A
2 B
3 D
Update 2 to C
id value
1 A
2 C
3 D
Update 3 to B
id value
1 A
2 C
3 B
Все это зависит от того, о чем действительно необходимо волноваться в структуре и что означает больше всего.
Правило 12: Правило отсутствия подверсий:
Если система предоставляет интерфейс низкого уровня (запись за раз), то этот интерфейс нельзя использовать для подорвать систему, например, в обход реляционной безопасности или ограничение целостности.
Допустим, вы определяете ненулевое ограничение для столбца. Можете ли вы обойти СУБД (например, используя служебный API низкого уровня, предоставляемый Oracle), чтобы вставить в этот столбец нуль? Если да, то вы нарушили это правило.
То, что сказал Майкл, также применимо к массовым загрузчикам.
Предположим, что SQL * Loader позволяет массово загружать строки в таблицу, не проверяя, дублируют ли строки строки уже в таблице с нарушением уникального ограничения. Это равносильно нарушению правил, выраженных в схеме.
Другие продукты СУБД имеют массовые загрузчики, и некоторые из них допускают подрывную загрузку, чтобы ускорить массовую загрузку.
Правило 12 запрещает это.