Вторая нормальная форма утверждает, что она должна соответствовать всем правилам 1NF и не должно быть никаких частичных зависимостей любого из столбцов первичного ключа.
Рассмотрим отношение клиента заказ, вы хотите сохранить идентификатор клиента, имя клиента, идентификатор заказа и детали заказа и дату покупки:
CREATE TABLE CUSTOMERS( CUST_ID INT NOT NULL, CUST_NAME VARCHAR (20) NOT NULL, ORDER_ID INT NOT NULL, ORDER_DETAIL VARCHAR (20) NOT NULL, SALE_DATE DATETIME, PRIMARY KEY (CUST_ID, ORDER_ID) );
Эта таблица находится в первой нормальной форме; в том, что она подчиняется всем правилам первой нормальной формы. В этой таблице первичный ключ состоит из CUST_ID и ORDER_ID. В совокупности они являются уникальными исходя из того же клиента вряд ли бы заказать то же самое.
Однако таблица не во второй нормальной форме, потому что есть частичные зависимости первичных ключей и столбцов. CUST_NAME зависит от CUST_ID и нет никакой реальной связи между именем клиента и то, что он приобрел. Детали заказа и дата покупки также зависит от ORDER_ID, но они не зависят от CUST_ID, потому что нет никакой связи между CUST_ID и ORDER_DETAIL или их SALE_DATE.
Для того, чтобы эта таблица соответствовала второй нормальной форме, необходимо отделить столбцы на три таблицы.
Во-первых, создать таблицу для хранения информации о клиенте, как показано в блоке кода ниже:
CREATE TABLE CUSTOMERS( CUST_ID INT NOT NULL, CUST_NAME VARCHAR (20) NOT NULL, PRIMARY KEY (CUST_ID) );
Следующим шагом является создание таблицы для хранения сведений о каждом заказе:
CREATE TABLE ORDERS( ORDER_ID INT NOT NULL, ORDER_DETAIL VARCHAR (20) NOT NULL, PRIMARY KEY (ORDER_ID) );
И, наконец, создать третью таблицу, хранящую только CUST_ID и ORDER_ID, чтобы держать след всех заказов для клиента:
CREATE TABLE CUSTMERORDERS( CUST_ID INT NOT NULL, ORDER_ID INT NOT NULL, SALE_DATE DATETIME, PRIMARY KEY (CUST_ID, ORDER_ID) );