首页 > 数据库 >数据库三范式和四特性

数据库三范式和四特性

时间:2022-09-19 11:12:45浏览次数:68  
标签:OrderID 范式 数据库 依赖于 CustomerID 特性 主键

1、原子性(Atomicity)

  事务中包含的程序作为数据库的逻辑工作单位,它对数据库中的数据进行操作时,要么全部执行,要么都不执行。

2、一致性(Consistancy)

  一个事务执行前和执行后,数据库都必须要处于一致性的状态。

3、分离性、独立性(Isolation)

  分离性是指在并发的事务是相互隔离的。即一个事务的内部操作及正在操作的数据必须被封锁起来,不会被其他的事务来企图修改。这一点和Java中多线程编程的同步锁很像。

4、持久性(Durability)

  持久性是指当数据库系统出现故障了,要确保已经提交的事务的更新是不会丢失的。即数据库中的数据的修改是永久性的。就算系统出现了故障,我们也可以使用数据库的备份和恢复来保证数据的修改。

范式

第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
考虑这样一个表:【联系人】(姓名,性别,电话)
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。

第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。

可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多次重复的情况。

第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。

其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。

通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。

标签:OrderID,范式,数据库,依赖于,CustomerID,特性,主键
From: https://www.cnblogs.com/xiaoguo876/p/16707026.html

相关文章

  • 2022 IDC中国未来企业大奖优秀奖颁布,华为云数据库助力德邦快递获奖
    摘要:华为云数据库助力德邦快递打造的“基于数智融合的一站式物流供应链平台”项目从500多个项目中脱颖而出,荣获2022IDC中国未来企业大奖优秀奖“未来智能领军者”。本文......
  • Postman连接数据库
     Postman连接数据库总括我们有时候做postmann接口测试时,需要操作数据库,所以就需要用Postman直接连接数据库,以便可以直接对数据库里面的数据进行增删改查;若Postman要连接......
  • SAP HANA2.0 HDB studio 创建租户数据库及备份租户数据库的初步理解
    为避免误人子弟,本次是由笔者于自己搭建的测试环境上进行测试的结果而记录下来的,没有确认是否正确,望知悉。0x00环境:1.HANA2.0 2.HDBstudio已安装0x01几个概念(自......
  • Redis作为缓存和作为数据库的区别
    Redis又被叫做Nosql,非关系型数据库,由于Redis作用于内存上,所以又可以被当作是缓存,那么Redis当作缓存和数据库的区别就是:技术服务于业务逻辑,所以,选择Redis作为什么,还是要根......
  • 【java8新特性】02:常见的函数式接口
    Jdk8提供的函数式接口都在java.util.function包下,Jdk8的函数式类型的接口都有@FunctionInterface注解所标注,但实际上即使没有该注解标注的有且只有一个抽象方法的接口,都可......
  • 数据库设计
    任务一、业务描述图书管理员功能:(一)图书管理功能:1.对图书库中的图书入库操作2.删除图书库中的图书3.查询图书库中的图书4.修改图书编号或类别(二)信息维护功能:1.查看......
  • kmem_cache的alias特性
    kmem_cache的alias特性,或者叫kmem_cache重名、kmem_cache别名。指在kmem_cache_create创建kmem_cache的时候,会尝试复用slub中已经存在的kmem_cache,复用的基本条件是创建siz......
  • Room数据库(以book类为例)
    使用Room实体定义数据|Android开发者|AndroidDevelopers(google.cn)在build.gradle中加入以下引用//roomdefroom_version="2.4.3"implementation"andro......
  • Java8新特性
    1.lambda表达式即允许将函数作为参数传递进方法中。可以替代匿名内部类的编写新手一开始不能直接写出lambda表达式,我们可以先用Idea的提示写出匿名内部类,匿名内部类比较......
  • SQL数据库语句执行顺序
    数据库查询语句完整的执行顺序:逻辑查询处理阶段简介:1、FROM:对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1。2、ON:对VT1应用ON筛选器,只有那些使......