SQL 2NF第二范式
第二范式指出它应满足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组成。假设相同的顾客很少会订购相同的商品,这两个组合是唯一的。
然而,该表不符合第二范式,因为存在主键和列的部分依赖关系。CUST_NAME依赖于CUST_ID,而顾客的名字与他购买的物品之间没有真正的联系。订单详情和购买日期也依赖于ORDER_ID,但它们不依赖于CUST_ID,因为CUST_ID与ORDER_DETAIL或SALE_DATE之间没有联系。
为使该表符合第二范式,需要将列分离为三个表。
首先,根据下面的代码块创建一个表来存储客户详细信息。
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以跟踪客户的所有订单。
CREATE TABLE CUSTMERORDERS(
CUST_ID INT NOT NULL,
ORDER_ID INT NOT NULL,
SALE_DATE DATETIME,
PRIMARY KEY (CUST_ID, ORDER_ID)
);