数据库的三大设计范式

数据库的三大设计范式

1.第一范式(1NF)

  • 数据表中的所有字段都是不可分割的原子值

    #示例一
    create table student2(
    id int primary key,
    name varchar(20),
    address varchar(30));
    insert into student2 values(1,"张三","中国新疆昌吉玛纳斯");
    insert into student2 values(2,"李四","中国新疆石河子玛纳斯");
    insert into student2 values(3,"王五","中国新疆伊犁新源");
    insert into student2 values(4,"赵六","中国新疆卡拉玛依乌尔禾");
    #输出结果
    +----+------+------------------------+
    | id | name | address                |
    +----+------+------------------------+
    |  1 | 张三 | 中国新疆昌吉玛纳斯     |
    |  2 | 李四 | 中国新疆石河子玛纳斯   |
    |  3 | 王五 | 中国新疆伊犁新源       |
    |  4 | 赵六 | 中国新疆卡拉玛依乌尔禾 |
    +----+------+------------------------+
    #如图所示address中还可以继续拆分所以不满足第一范式
    
    #示例二
    create table student3(
    id int primary key,
    name varchar(20),
    contry varchar(30),
    privence varchar(30),
    city varchar(30),
    distrct varchar(30)
    );
    insert into student3 values(1,"张三","中国","新疆","昌吉","玛纳斯");
    insert into student3 values(2,"李四","中国","新疆","石河子","玛纳斯");
    insert into student3 values(3,"王五","中国","新疆","伊犁","新源");
    insert into student3 values(4,"赵六","中国","新疆","卡拉玛依","乌尔禾");
    #输出结果
    +----+------+--------+----------+----------+---------+
    | id | name | contry | privence | city     | distrct |
    +----+------+--------+----------+----------+---------+
    |  1 | 张三 | 中国   | 新疆     | 昌吉     | 玛纳斯  |
    |  2 | 李四 | 中国   | 新疆     | 石河子   | 玛纳斯  |
    |  3 | 王五 | 中国   | 新疆     | 伊犁     | 新源    |
    |  4 | 赵六 | 中国   | 新疆     | 卡拉玛依 | 乌尔禾  |
    +----+------+--------+----------+----------+---------+
    #最小地址不可再分,所以满足第一范式
    

2.第二范式(2NF)

  • 在满足第一字段的前提下,第二范式要求,除主键外其他列必须完全依赖与 主键。

  • 如果出现不完全依赖,只可能发生在联合主键的情况下。

    #示例一
    create table myorder(
    product_id int,
    customer_id int,
    product_name varchar(20),
    customer_name varchar(20)),
    primary key(product_id,customer_id));
    ## 问题???
    #除主键外的其他列,只依赖与主键的部分字段(不满足2NF),其实适合联合主键的只要两个加起来不相同就行的特点有关
    #解决——拆表
    
    #示例二
    #对表进行拆分
    create table myorder(
    order_id int primary key,
    product_id int,
    customer_id int);
    
    create table product(
    id int primary key,
    name varchar(20));
    
    create table customer(
    id inr primary key,
    name varchar(20))
    #--分成三个表之后,就满足了第二范式
    
    

第三范式(3NF)

  • 必须先满足第二范式,除开主键的其他列之间不能有传递依赖关系。

    #示例一(不满足3NF)
    create table myorder(
    order_id int primary key,
    product_id int,
    customer_id int,
    customer_phone int); #严重依赖customer_i又依赖主键d,customer_id
    
    #示例二(可修改为)
    create table customer(
    id int primary key,
    name varchar(20),
    phone varchar(15));
    
    
记录学习的点点滴滴
原文地址:https://www.cnblogs.com/yangzilaing/p/14542400.html