Database - Seconda forma normale (2NF)

La seconda forma normale afferma che dovrebbe soddisfare tutte le regole per 1NF e non devono esserci dipendenze parziali di nessuna delle colonne sulla chiave primaria -

Considera una relazione cliente-ordine e desideri memorizzare l'ID cliente, il nome del cliente, l'ID ordine e i dettagli dell'ordine e la data di acquisto -

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)
);

Questa tabella è nella prima forma normale; in quanto obbedisce a tutte le regole della prima forma normale. In questa tabella, la chiave primaria è costituita da CUST_ID e ORDER_ID. Combinati, sono unici presumendo che lo stesso cliente difficilmente ordinerebbe la stessa cosa.

Tuttavia, la tabella non è nella seconda forma normale perché esistono dipendenze parziali di chiavi primarie e colonne. CUST_NAME dipende da CUST_ID e non esiste un vero collegamento tra il nome di un cliente e ciò che ha acquistato. Anche i dettagli dell'ordine e la data di acquisto dipendono da ORDER_ID, ma non da CUST_ID, poiché non esiste alcun collegamento tra CUST_ID e ORDER_DETAIL o la loro SALE_DATE.

Per rendere questa tabella conforme alla seconda forma normale, è necessario separare le colonne in tre tabelle.

Innanzitutto, crea una tabella per memorizzare i dettagli del cliente come mostrato nel blocco di codice seguente:

CREATE TABLE CUSTOMERS(
   CUST_ID    INT              NOT NULL,
   CUST_NAME VARCHAR (20)      NOT NULL,
   PRIMARY KEY (CUST_ID)
);

Il passaggio successivo è creare una tabella per memorizzare i dettagli di ogni ordine -

CREATE TABLE ORDERS(
   ORDER_ID   INT              NOT NULL,
   ORDER_DETAIL VARCHAR (20)  NOT NULL,
   PRIMARY KEY (ORDER_ID)
);

Infine, crea una terza tabella che memorizzi solo CUST_ID e ORDER_ID per tenere traccia di tutti gli ordini per un cliente -

CREATE TABLE CUSTMERORDERS(
   CUST_ID    INT              NOT NULL,
   ORDER_ID   INT              NOT NULL,
   SALE_DATE  DATETIME,
   PRIMARY KEY (CUST_ID, ORDER_ID)
);
sql-rdbms-concepts.htm