简述
第二范式声明它应该满足 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)
);