Sql-second-normal-form

提供:Dev Guides
移動先:案内検索

データベース-2番目の正規形(2NF)

2番目の正規形は、1NFのすべてのルールを満たしている必要があり、主キーの列の部分的な依存関係があってはならないと述べています-

顧客と注文の関係を考慮し、顧客ID、顧客名、注文ID、注文の詳細、購入日を保存します-

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で構成されています。 同じ顧客が同じものを注文することはほとんどないと仮定すると、これらはユニークです。

ただし、主キーと列の部分的な依存関係があるため、テーブルは2番目の標準形式ではありません。 CUST_NAMEはCUST_IDに依存しており、顧客の名前と購入したものの間に実際のリンクはありません。 注文の詳細と購入日もORDER_IDに依存していますが、CUST_IDとORDER_DETAILまたはそれらのSALE_DATEの間にリンクがないため、CUST_IDには依存しません。

このテーブルを2番目の標準形式に準拠させるには、列を3つのテーブルに分ける必要があります。

まず、以下のコードブロックに示すように、顧客の詳細を保存するテーブルを作成します-

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のみを格納する3番目のテーブルを作成して、顧客のすべての注文を追跡します-

CREATE TABLE CUSTMERORDERS(
   CUST_ID    INT              NOT NULL,
   ORDER_ID   INT              NOT NULL,
   SALE_DATE  DATETIME,
   PRIMARY KEY (CUST_ID, ORDER_ID)
);