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