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