很多字段的数据要插入另一张表_一文看懂数据库设计之逻辑设计,值得收藏
概述
数据库逻辑设计是从事数据库应用设计、开发、运行维护等各方面工作的一个重要的基础性工作。根据不同业务和应用需求,确定并遵循数据库逻辑设计原则,例如按照第三范式开展逻辑设计,不仅能满足减少数据冗余、保证数据一致性和完整性、易扩展性和伸缩性等需求,也是保障系统高性能的一个重要基础。
一、为什么要逻辑设计?
1、全表扫描案例
从一个案例来看,例如查询“喜欢语文的所有学生”
--由于%号这里肯定是走了全表扫描select id,name,hobby from student where hobby like '%语文%';
2、原因
select id,name,hobby from student;ID NAME HOBBY---------------------1 小明 语文,数学2 小红 英语,语文,数学3 小林 英语,语文
可以看到如果是这么设计表的话,把学生的爱好都塞在一个字段HOBBY中,那么查询条件只能写成like '%语文%'。这里的根本原因是该表设计不符合规范化设计理论,从而导致了全表扫描。这里我们就可以看出逻辑设计的重要性了。
二、什么是逻辑设计
1、概念总结
1)将需求转化成数据库的逻辑模型
2)通过ER图的型式对逻辑模型进行展示
3)同所选用的具体的DBMS系统无关
2、名词解释
关系:一个关系对应通常所说的一张表
元组:表中的一行即为一个元组
属性:表中的一列即为一个属性,每一个属性都有一个名称,称为属性名
候选码:表中的某个属性组,它可以唯一确定一个元组
主码:一个关系有多个候选码,选定其中一个为主码
域:属性的取值范围
分量:元组中的一个属性值
3、ER图例说明
矩形:表示实体集,矩形内写实体集的名字
菱形:表示联系集
椭圆:表示实体的属性
线段:将属性连接到实体集,或将实体集连接到联系集
4、数据操作异常及数据冗余
插入异常:如果某实体随着另一个实体的存在而存在,即缺少某个实体时无法表示这个实体,那么这个表就存在插入异常。
更新异常:如果更改表所对应的某个实体实例的单独属性时,需要将多行更新,那么就说这个表存在更新异常。
删除异常:如果删除表的某一行来反映某实体实例,失效时导致另一个不同实体实例信息丢失,那么这个表中就存在删除异常。
注意:若一个表中存在插入异常,那它肯定存在删除异常和更新异常。
数据冗余:是指相同的数据在多个地方存在,或者说表中的某个列可以由其他列计算得到,这样就说表中存在数据冗余。
三、什么是规范化设计
1、第一范式(所有属性必须是单值)
定义:数据库表中的所有字段都是单一属性,不可再分的。这个单一属性是由基本的数据类型所构成的,如整数,浮点数,字符串等,换句话说,第一范式要求数据库中的表都是二维表。(二维表就是由行和列组成的表)
2、第二范式(所有属性必须依赖于该实体的唯一标识属性)
定义:数据库的表中不存在非关键字段对任一候选关键字段的部分函数依赖。部分函数依赖是指存在着组合关键字中的某一关键字决定非关键字的情况。
换句话说:所有单关键字的表都符合第二范式。
修改后的:
通俗解释:
完全依赖:表中只有一个关键字(即主键),其他属性的增删改查的时候定位到这一行都是依赖此关键字的。
第二范式:只能有一个主键,不能有复合主键,可以就满足了第二范式。
由于供应商和商品之间是多对多的关系,所以只有使用商品名称和供应商名称才可以唯一标识出一件商品,也就是商品名称和供应商名称是一组组合关键字。
上表中存在以下的部分函数依赖关系
(商品名称)—>(价格,描述,重量,商品有效期)(供应商名称)—>(供应商电话)
3、第三范式(没有一个非唯一标识属性依赖于另一个非唯一标识属性)
定义:第三范式是在第二范式的基础上定义的,如果数据表中不存在非关键字段,对任意候选关键字段的传递函数依赖则符合第三范式。
存在问题:
(分类,分类描述)对于每一个商品都会进行记录,所以存在数据冗余,同时也会存在数据deep插入、更新及删除异常。
4、BC范式
定义:在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BC范式。也就是说如果是复合关键字,则复合关键字之间也不能存在函数依赖关系
存在下列关系因此不符合BCNF要求:
(供应商)—>(供应商联系人)(供应商联系人)—>(供应商)
并且存在数据操作异常及数据冗余
总结
第一,二,三范式解决的是非主属性的关系。BC 范式解决的是主属性的关系;
第一范式:就是原子性,字段不可再分割,(列属性不能在细分为子列)
第二范式:就是完全依赖,没有部分依赖;(非主属性不能依赖于主键的一部分,要完全依赖于主键(主键是复合键))
第三范式:没有传递函数依赖。(非主属性之间的依赖)
BC范式: 解决部分主键依赖于非主键部分(复合关键字之间也不能存在函数依赖关系)。
觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~
很多字段的数据要插入另一张表_一文看懂数据库设计之逻辑设计,值得收藏相关推荐
- easyui datalist 动态绑定数据_一文看懂动态链接
上篇文章中,介绍了静态链接,目的是为学习动态链接打底,毕竟现在,动态链接才是主流.但是,要理解本文的内容并不是一件容易的事情,可能看完后仍然是似懂非懂,对此,我的建议是,先把上篇静态链接的文章细细阅读 ...
- mysql bench建立一张表_使用MySQL Workbench建立数据库,建立新的表,向表中添加数据...
点击上图中的"加号"图标,新建一个连接, 如上图,先输入数据库的账号密码,帐号默认为root,填好密码后 点击"OK",连接就建立好了,建立完成后,会出现一个长 ...
- mysql 大量数据 更改索引_一文看懂ICP原理--MySQL用索引去表里取数据的一种优化...
概述 今天主要介绍一下mysql的ICP特性,可能很多人都没听过,这里用一个实验来帮助大家加深一下理解. 一.Index_Condition_Pushdown Index Condition Push ...
- 二叉搜索树的删除操作可以交换吗_一文看懂数据结构中的树
通常在开始学编程的时候,你会接触一些常用数据结构.到最后一般会学到哈希表.对于修读计算机科学学位的朋友,你通常要上专门的数据结构课,从了解有关链表.队列和栈的各种知识.这些统称为线性数据结构,因为依逻 ...
- 属性子集选择的基本启发方法_一文看懂数据预处理最重要的3种思想和方法
导读:本文我们考虑应当采用哪些预处理步骤,让数据更加适合挖掘.数据预处理是一个广泛的领域,包含大量以复杂的方式相关联的不同策略和技术.我们将讨论一些最重要的思想和方法,并试图指出它们之间的相互联系. ...
- php删除一张表数据的时候 把另一张表的数据也删除,剔除第一张表的数据时,修改第二张表的相关字段的数值...
删除第一张表的数据时,修改第二张表的相关字段的数值 表xf xf_id vip total 1 1 10 2 1 100 3 2 80 4 3 50 表vip vip jifen 1 1000 2 5 ...
- 查询数据插入别一张表中
sql查询数据插入别一张表中 第一种方法: Btable 作为插入数据表,Atable是数据源表,Btable表在插入之前必须存在 insert into Btable select 列1,列2 fr ...
- java项目大概多少张表,要把数据插入到多张表?该如何处理
当前位置:我的异常网» Java Web开发 » 要把数据插入到多张表?该如何处理 要把数据插入到多张表?该如何处理 www.myexceptions.net 网友分享于:2013-01-27 浏 ...
- mysql插入多行数据来自另一张表_mysql从一张表查询批量数据并插入到另一表中的完整实例...
说在前面 nodejs 读取数据库是一个异步操作,所以在数据库还未读取到数据之前,就会继续往下执行代码. 最近写东西时,需要对数据库进行批量数据的查询后,insert到另一表中. 说到批量操作,让人最 ...
最新文章
- 如何在jasperreport自动生成序号
- Codeforces 671E Organizing a Race (贪心、线段树)
- c语言比较当前日期大小,C语言判断两个日期只差的方法
- oracle rac 节点启动,Oracle 10g RAC 节点自动重启故障处理
- JAVA标识符命名规则及命名规范
- centos7.3下apache搭建django[未成功]
- 程序员职业自由6个阶段,你处于哪个?
- pl/sql的存储过程
- 我热爱编程,但我讨厌这个行业
- 阿里云生成SSH秘钥对,使用SCRT登录阿里云服务器
- 选择排序的Java代码实现(超详细代码)
- 单片机编程技术学习攻略
- Android并发之Executor(线程池)家族(二)之AtomicInteger
- php 可以将图片分类吗,PHP图片处理教程.ppt
- 使用 Apache ECharts 实现圣都装饰的延期日历图
- CPU为什么选择导热硅脂而不是牙膏
- 日志易之AIX、HP-UNIX小机探针Agent安装步骤
- LTSPICE调用下载的lib文件步骤
- WPF内部DeliverEvent读锁和PrivateAddListener写锁导致死锁
- 温州民企走出寒冬 SOA解读新型工业模式
热门文章
- c语言 位域 sizeof,含位域结构体的sizeof
- demod函数_MATLAB信号处理工具箱函数 | 学步园
- 判断是否是数组的方法
- linux命令查看g 版本,如何查看linux版本
- java网页中url传值的转码
- 使用nsenter进入docker容器后端报错 mesg: ttyname failed: No such file or directory
- java基础 第一章上(安装 配置java、简单dos命令)
- 行高 line-height
- ldap数据库--ODSEE--复制协议
- python:collections模块