MySQL数据表设计,三大范式

个人笔记,仅供参考

数据库的三大设计范式

三大范式即三个创建数据表的准则,根据自己的实际需求决定是否遵守即可

1、第一范式,(1NF)

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

例如一个地址信息,如果全部存在一个字段中就不符合第一范式,需要把国家,省份这些信息尽可能拆分到不同字段才满足。这样可以方便以后检索。

举例:

create table student1(
    id int primary key,
    name varchar(20)
    address varchar(20)
    );

如上创建的数据表地址中会含有很多可分割的信息,例如中国四川省成都市武侯区XXX大道这个地址,其中的国家,省份,城市,路名都可以拆分。所以应设计成如下形式

create table student2(
    id int primary key,
    name varchar(20),
    country varchar(20),
    province varchar(20),
    city varchar(20),
    details varchar(20)
    );

如上,地址被拆分成国家,省份,城市,详细地址四个部分,方便以后查找数据。(这里的详细地址其实还可以继续拆分)

具体拆分到什么程度,根据实际情况决定,不一定非要满足范式

2、第二范式(2NF)

必须是满足第一范式的前提下,第二范式要求,除主键外的每一列必须完全依赖于主键,如果出现不完全依赖,只可能发生在联合主键的情况下,此时就需要对表进行拆分。

例如,现在设计一个订单表

create table myorder(
    product_id int,
    customer_id int,
    product_name varchar(20),
    customer_namr varchar(20),
    primary key(product_id,customer_id)
    );

这里存在一个问题,即产品id只与产品名称有关,而与用户id无关,同理,顾客id只与顾客名称有关,这种情况即是:除主键外的其他列,值依赖于主键的部分字段,而没有完全依赖主键。这样会在数据结构上出现问题,即一行中产品的数据和顾客的数据完全没有关系。为了应对这种情况,产品信息和顾客信息应该放在不同的表里,即这张表应该拆成3张表。

create table myorder(
    order_id int primary key,
    prodduct_id int,
    customer_id int
    );
create table product(
    id int primary key,
    name varchar(20)
    );
create table customer(
    id int primary key,
    name varchar(20)
    );

现在,每个表都满足第二范式,即除主键外的其他字段都完全依赖于主键

第二范式即表中每一列的信息都必须与全部主键有联系,如果不满足,就要拆成多个表。

3、第三范式(3NF)

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

用前面的例子来说明,如果我在订单表中加一条customer_phone哟用来存储电话号码,那么在这张表中customer_phone可以与订单id有关系,也可以与顾客id有关系,即除开主键列的其他列之间有了依赖关系,所以不满足第三范式

create table myorder(
    order_id int primary key,
    prodduct_id int,
    customer_id int,
    customer_phone int  //这里与主键外的其他字段有联系,所以不应该放在这张表中,应该放在顾客表中
    );

你可能感兴趣的:(MySQL数据表设计,三大范式)