Base de données - Deuxième forme normale (2NF)

La deuxième forme normale indique qu'elle doit respecter toutes les règles de 1NF et qu'il ne doit y avoir aucune dépendance partielle de l'une des colonnes sur la clé primaire -

Envisagez une relation client-commande et vous souhaitez stocker l'ID client, le nom du client, l'ID de commande et les détails de la commande et la date d'achat -

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

Cette table est dans la première forme normale; en ce qu 'il obéit à toutes les règles de la première forme normale. Dans ce tableau, la clé primaire se compose du CUST_ID et du ORDER_ID. Combinés, ils sont uniques en supposant que le même client commanderait à peine la même chose.

Cependant, la table n'est pas dans la deuxième forme normale car il existe des dépendances partielles des clés primaires et des colonnes. CUST_NAME dépend de CUST_ID et il n'y a pas de lien réel entre le nom d'un client et ce qu'il a acheté. Les détails de la commande et la date d'achat dépendent également du ORDER_ID, mais ils ne dépendent pas du CUST_ID, car il n'y a pas de lien entre un CUST_ID et un ORDER_DETAIL ou leur SALE_DATE.

Pour rendre ce tableau conforme à la deuxième forme normale, vous devez séparer les colonnes en trois tableaux.

Tout d'abord, créez une table pour stocker les détails du client comme indiqué dans le bloc de code ci-dessous -

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

L'étape suivante consiste à créer un tableau pour stocker les détails de chaque commande -

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

Enfin, créez une troisième table ne stockant que le CUST_ID et le ORDER_ID pour garder une trace de toutes les commandes d'un client -

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