数据库三大范式

第一范式
1NF,强调数据中列的原子性,即列中的值不能再分割为其他列。

例如:

现在有一个用户User表,表中字段分别包括,用户名,联系方式,性别等信息。

usernamesextel
小明13112345678 0755-1234567
小红13234567890
从表中可以看出,小明的数据中联系方式有两种,包括手机和固话,而小红的联系方式中只有手机。所以这样的表结构是不符合1NF的。下面我们将表结构进行进一步拆分:

usernamesextelphone
小明131123456780755-1234567
小红13234567890
我们将表中的联系方式字段拆成了手机和固话两个字段,现在这张表中的字段都是不可再分割的了。所以,满足了第一范式。
第二范式
2NF,首先必须满足1NF规范。另外其有两个特点:一是表必须有一个主键(可以是多个字段组成的联合主键);二是非主键列必须完全依赖于主键整体,而不能只依赖主键的一部分。
例如:

现在有一张订单详情OrderDetail表,订单表示是用户下单寄件的行为产生的一个订单,但是用户可能一次性寄出很多个不同地址的货物,每个收件地址会产生一个运单号。所以一张订单详情表中由订单ID和运单ID为联合主键,还包括了收件人姓名,收件人地址,收件人联系方式,寄件人电话,寄件人下单时间,寄件人下单,运费相关方式等等。

orderIDwaybillIDshipperPhoneshipperTimeshipperSourcereceiverNamereceiverAddressreceiverPhonefee
1234567823451311234567820170323 11:23:14电话下单小明广州1322345678912
1234567823461311234567820170323 11:23:14电话下单小红上海1572341655523
从上表可以看出,其实收件人姓名,地址,联系方式等列只与waybillID相关,不同的运单,才会有相关的收件人信息。而用户下单相关的信息也只有订单内容相关,与运单内容无关。所以这样的表设计是不符合2NF规范的。下面我们来进行拆分。 

OrderDetail表

orderIDwaybillIDshipperPhoneshipperTimeshipperSourcefee
1234567823451311234567820170323 11:23:1412
1234567823461311234567820170323 11:23:1413

waybill表

waybillIDreceiverNamereceiverAddressreceiverPhone
2345小明广州13223456789
2346小红上海15723416555
我们将orderDetail表中的内容进行了拆分,将与运单相关的信息,分到了waybill表中,这样在订单表中只保留了与订单表相关的信息。这样,便满足了第二范式。
第三范式
同样首先必须满足2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。传递依赖的意思是,例如非主键A列依赖于非主键B列,非主键B列依赖于主键的情况。

例如:

用户下单寄件时,通过我们的官网进行下单,用户已经是我们的会员,所以我们会保存用户的一些相关信息,会员下单会有一些优惠等等。所以我们的订单表里面有下面这些信息:订单ID,订单下单时间,订单来源,会员ID,会员名称,会员联系方式等。

orderIDoderDateorderSourcecustomerIDcustomerNamecustomerTel
123456720170303 10:28:13官网下单2134小明13212345678
123214620170112 23:12:01微信下单7251小红13523125647
从上表可以看出会员的相关具体信息是依赖于会员ID存在的,会员ID又依赖于订单ID,所以这张表的设计师不符合3NF的,现在我们来对表进行改造,让它符合第三范式。

order表

orderIDoderDateorderSourcecustomerID
123456720170303 10:28:13官网下单2134
123214620170112 23:12:01微信下单7251

customer表

customerIDcustomerNamecustomerTel
2134小明13212345678
7251小红13523125647

我们将Order表中关于会员的信息拆分出来,做为会员customer表,这样将与订单无关的信息抽出来,就符合了第三范式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值