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