数据库 - 第二范式(2NF)

我在 CSDN 学院发布的 SQL 入门视频教程

第二范式声明了需要满足第一范式的所有规则,而且任何列不存在对主键的部分依赖。

考虑一个客户-订单关系,需要存储的内容包括客户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    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之间没有关系。

为了让该表满足第二范式,需要将这些列拆掉成3个表。

首先,创建一个客户信息表:

 

CREATE TABLE CUSTOMERS(
       CUST_ID    INT              NOT NULL,
       CUST_NAME VARCHAR (20)      NOT NULL,
       PRIMARY KEY (CUST_ID)
);(
       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)
);(
       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)
);(
       CUST_ID    INT              NOT NULL,
       ORDER_ID   INT              NOT NULL,
       SALE_DATE  DATETIME,
       PRIMARY KEY (CUST_ID, ORDER_ID)
);

 

 

原文地址:http://www.tutorialspoint.com/sql/index.htm

上一页                                                                                                                                                                   下一页

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值