Как я понимаю, третья нормальная форма (3NF) в основном означает, что должен быть ровно один ключ.
№ 2NF, 3NF и Нормальная форма Бойса Кодда (BCNF) имеют дело с функциональными зависимостями . Таблица в 2NF означает, что нет частичных ключевых зависимостей, где неключевой столбец зависит от некоторого правильного подмножества многостолбцового ключа. Таблицы, подобные той, что в нашем примере, уже находятся в 2NF, поскольку каждый ключ-кандидат представляет собой один столбец. Таблица в 3NF означает, что каждый неключевой столбец также не является функционально зависимым от некоторого другого неключевого столбца, что создает транзитивную зависимость., Неважно, есть ли один или сто возможных ключей. На самом деле это BCNF, а не 3NF, который является «конечной» нормальной формой в отношении функциональных зависимостей. Это связано с тем, что таблица может быть в 3NF, но не в BCNF, поскольку может быть несколько ключей-кандидатов, которые перекрываются. Таким образом, когда мы используем термин 3NF для обозначения «полностью нормализованного» в отношении функциональных зависимостей, мы действительно имеем в виду BCNF.
Если таблица с, скажем, столбцом идентификатора автоинкремента также имеет столбец, который известен как уникальный и не нулевой, например, номер социального страхования, этот другой столбец можно использовать в качестве ключа.
Мало того, что это может быть, это должно быть, если мы хотим, чтобы данные, хранящиеся в базе данных, оставались в соответствии с правилами, которые мы определили в реальном мире!
Игнорирование практических / бизнес-проблем (например, риск безопасности / конфиденциальности при передаче SSN в качестве ключа / FK) с точки зрения строгой схемы, не будет ли такая таблица в 3NF, поскольку фактически существует 2 ключа?
Как объяснено выше, находится ли таблица в 3NF (или, что более важно, BCNF), ортогонально тому, сколько ключей-кандидатов она содержит.
Будет ли зависеть ответ от того, был ли уникальный ключ в другом столбце? Если так, то почему?
Нет, просто потому, что определение, находится ли таблица в 3NF или нет, не имеет никакого отношения к тому, сколько ключей-кандидатов она имеет. Вместо этого он имеет полное отношение к обеспечению того, что все неключевые столбцы полностью функционально зависят от этих ключей-кандидатов.
Но это действительно принесет интересный момент. Обратите внимание, что уникальный ключ, когда он определен как ограничение в СУБД, не совпадает с уникальным идентификатором, определенным как бизнес-правило в концептуальной бизнес-модели. Возможно, в нашем мире мы всегда знаем SSN человека, и поэтому он служит ключом-кандидатом для человека, и, возможно, мы также вводим суррогатный ключ в логическую схему, которую мы называем Person Id . Наша бизнес-модель включает правило, согласно которому SSN является уникальным идентификатором человека в нашем мире. Это подразумевает функциональную зависимостьиз всех описательных атрибутов на этом атрибуте идентичности. Это правило не меняется только потому, что мы либо забыли, либо решили не информировать СУБД. Именно поэтому важно объявить ограничение - чтобы СУБД могла обеспечить соответствие хранимых данных правилам бизнес-модели! Если мы не создали это уникальное ограничение для SSN, то теперь мы можем случайно создать более одной строки для одного человека с одним и тем же SSN; каждый ряд имеет свой идентификатор личности!
Отличный учебник по этим темам - серия практических баз данных Фабиана Паскаля и теория проектирования баз данных и реляционной теории Криса Дейта , из которой вытекает этот ответ. В то время как каждая статья Фабиана является обязательной для прочтения, статья № 1 (которая четко определяет разницу между концептуальным, логическим и физическим уровнями) и статья № 4 (которая четко определяет различные виды ключей) специально посвящены этому вопросу. Точно так же вся книга Криса является обязательной для прочтения, а часть II - это раздел, посвященный нормализации в отношении функциональной зависимости.