一、数据结构
-
线性存储和链式存储优缺点比较
1.1. 线性表的存储结构,优缺点 -
顺序存储结构可以直接存取数据元素,方便灵活、效率高,但插入、删除操作时将会引起元素的大量移动,因而降低效率。
-
链接存储结构中内存采用动态分配,利用率高,但需增设指示结点之间关系的指针域,存取数据元素不如顺序存储方便,但结点的插入、删除操作较简单。
1.2. 数据结构的存储结构(3个)和对应的存储模式(1对1 1对多 多对多)
线性表:1对1
图:1对多
树:多对多 -
最小生成树两种算法优缺点比较
1.普里姆(Prim)算法
特点:时间复杂度为O(n2).适合于求边稠密的最小生成树。
2.克鲁斯卡尔(Kruskal)算法
特点:时间复杂度为O(eloge)(e为网中边数),适合于求稀疏的网的最小生成树。 -
hash函数的特点以及如何处理冲突
3.1. 散列表的建立方法
1、直接定址法
关键码本身和地址之间存在某个线性函数关系时,散列函数取为关键码的线性函数,即:H(key)=a*key+b,a、b均为常数。
2、数字分析法
假设关键码完全已知,且每个关键码都是以某个数r为基数(例以10为基数的十进制数)的值,则关键码中若干位恰能构成分布比较均匀的散列地址空间时,可取关键码的若干位的组合作为散列地址。
3、除留余数法
通过选择适当的正整数p,按计算公式H(K)=Kmodp来计算关键码K的散列地址。
若关键码个数为n,散列表表长为m(一般m>=n),通常选p为小于或等于表长m的最大素数或不包含小于20的质因子的合数,一般也要求p>=n。
4、平方取中法
将关键码K平方,取K^2中间几位作为其散列地址H(K)的值。
假如有以下关键字序列{421,423,436},平方之后的结果为{177241,178929,190096},那么可以取{72,89,00}作为Hash地址。
5、折叠法
将关键码从低位到高位(或从高位到低位)分割成位数相等的几段,最后一段可以短些,然后将这些段构成的数值按照某种叠加方法求和。最后,在散列地址范围限制下,取求和结果的最后几位作为关键码的散列函数值。
6、随机数法
采用随机函数作为散列函数H(Key)=random(Key),其中random为随机函数。
3.2. hash适合存储什么样的数据
表示的自然数太大,或是表示的自然数不连续,或者是不是自然数
3.3. 影响hash表平均查找长度的因素
● 哈希函数
● 哈希表的大小
● 碰撞处理方法 -
排序算法有哪些,及其时间复杂度
4.1. 排序最优和最差相同的排序算法
归并排序、堆排序,选择排序
4.2. 最差和平均算法复杂度一样的排序算法
归并排序、堆排序,选择排序、冒泡排序、希尔排序
4.3. 最好最坏平均都一样的排序算法
归并排序、堆排序
-
怎么确定图是一个环
如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。
算法:
第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。
第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。
如果最后还有未删除顶点,则存在环,否则没有环。
有向图是否有环的判定算法,主要有深度优先和拓扑排序方法。
拓扑排序,如果能够用拓扑排序完成对图中所有节点的排序的话,就说明这个图中没有环,而如果不能完成,则说明有环。 -
简述线索二叉树
● 若无左子树,则将左指针指向其前驱结点;
● 若无右子树,则将右指针指向其后继结点。 -
汉罗塔
Hn=Hn-1 x 2 + 1.
8.图的存储
1、邻接矩阵
2、邻接表
- 图的遍历
9.1. 图的深度和广度遍历是什么,在工程中有哪些应用
走迷宫
最短路径
9.2. 树和图的遍历的区别,存储方式;
存储具体实现方式:
一、使用邻接矩阵。
开二维数组以二维数组的两个下标指定边的指向,二维数组的初始化为-1,数组元素的值代表边的权重。但这种方法可能会浪费大量空间。
二、使用邻接表。
开一个一维数组记录每个点,以他们作为头结点作单链表存储与该点存在边的所有点。
更常用的是邻接表,较为省空间。
遍历:每个点只会被遍历一次。无需刻意从某个点开始遍历,因为树是无环连通图
1.深度优先遍历。
尽可能往深了搜,当触底时回溯,直到把所有点全部搜过一遍。
2.广度优先遍历。
从根节点开始广搜,每次搜索把所有一层的点全部搜过一遍。
10. 两个最短路径算法有什么不同,用于什么情况
Floyd算法是按顺序逐渐允许每个顶点作为中间节点,按照这个中间节点的变化去进行松弛。
Dijsktra算法是根据当前离开始节点最近为标准来确定当前扩展节点,按照这个起始节点的变化去进行松弛。
11. 拓扑排序中使用了哪些数据结构
栈
12. 简述二叉排序树
-
二叉树和度为二的树的区别
1、度不同
度为2的树要求每个节点最多只能有两棵子树,并且至少有一个节点有两棵子树。二叉树的要求是度不超过2,节点最多有两个叉,可以是1或者0。
2、分支不同
度为2的树有两个分支,但分支没有左右之分;一棵二叉树也有两个分支,但有左右之分,左右子树的次序不能随意颠倒。
3、次序不同
度为2的树从形式上看与二叉树很相似,但它的子树是无序的,而二叉树是有序的。即,在一般树中若某结点只有一个孩子,就无需区分其左右次序,而在二叉树中即使是一个孩子也有左右之分。 -
程序和软件的区别
计算机软件是计算机系统中程序和文档的总称 -
解释下关键路径和关键活动,什么情况下才有关键路径
-
简述背包问题
f[v]=max{f[v],f[v-w[i]]+v[i]}
这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-w[i]的背包中”,此时能获得的最大价值就是f [i-1][v-w[i]]再加上通过放入第i件物品获得的价值v[i]。
二、软件工程 -
软件生命周期
软件生命周期又称为软件生存周期或系统开发生命周期,是软件的产生直到报废的生命周期。软件生存周期包括:
(1)问题定义:弄清"用户需要计算机解决什么样的问题”,提出"系统目标和范围的说明“,提交用户审查和确认。
(2)可行性分析:把待开发系统的目标以明确的语言描述出来,并从经济、技术、法律等多个方面进行可行性分析。
(3)需求分析:弄清用户对软件系统的全部需求,编写需求规格说明书和初步的用户手册,提交评审。
(4)开发阶段:设计、实现(完成源程序的编码)、测试
(5)维护:改正性维护(由于开发测试的不彻底、不完全),适应性维护(适应环境变化),完善性维护(使用过程中提出的一些建设性意见),预防性维护(改善软件系统的可维护性和可靠性)。 -
瀑布模型
将软件生命周期中的各个活动规定为线性连接的模型,包括需求分析、设计、编码、测试、运行与维护,由前至后、相互衔接的固定顺序,如同瀑布流水逐级下落。
瀑布模型是以文档作为驱动、适合于软件需求很明确的软件项目的模型。
3. 模块的概念
3.1. 模块间耦合度
模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。
模块间联系越多,其耦合性越强,同时表明其独立性越差。
3.2. 区分模块的要素是什么
功能、逻辑和状态
4. 软件的设计模式
- 增量模型
融合了瀑布模型的基本成分和原型实现的迭代特征,它假设可以将需求分段为一系列增量产品,每一增量可以分别开发。
使用增量模型,第1个增量往往是核心的产品。客户对每个增量的使用和评估都作为下一个增量发布的新特征和功能,这个过程在每一个增量发布后不断重复,直到产生了最终的完善产品。增量模型强调每一个增量均发布一个可操作的产品。
增量模型的优点:1)容易理解,管理成本低;2)强调开发的阶段性早期计划及需求调查和产品测试;3)第一个可交付版本所需要的成本和时间很少;4)开发由增量表示的小系统所承担的风险不大;5)减少用户需求的变更;6)运行增量投资,即在项目开始时,可以仅对一个或两个增量投资。
增量模型的缺点:1)如果没有对用户的变更需求进行规划,那么产生的初始增量可能会造成后来增量的不稳定;2)如果需求不想早期思考的那样稳定和完整,那么一些增量就可能需要重新开发,重新发布;3)管理发生的成本、进度和配置的复杂性可能会超出组织的能力。
6. 喷泉模型
一种以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发方法。它克服了瀑布模型不支持软件重用和多项开发活动集成的局限性,喷泉模型使开发过程具有迭代性和无间隙性。
- IPO图、层次图、DFD图等的使用阶段,作用,描述
IPO图就是用来说明每个模块的输入、输出数据和数据加工的重要工具。
层次图用来描绘软件的层次结构
数据流图DFD是描述系统中数据流程的一种图形工具,它标志了一个系统的逻辑输入和逻辑输出,以及把逻辑输入转换逻辑输出所需的加工处理。 - CMM
软件能力成熟度模型是一种对软件组织在定义、实施、度量、控制和改善其软件过程的实践中各个发展阶段的描述形成的标准。 - 黑盒白盒
白盒测试也称为结构测试,主要用于检测软件编码过程中的错误。程序员的编程经验、对编程软件的掌握程度、工作状态等因素都会影响到编程质量,导致代码错误。
黑盒测试又称为功能测试,主要检测软件的每一个功能是否能够正常使用。在测试过程中,将程序看成不能打开的黑盒子,不考虑程序内部结构和特性的基础上通过程序接口进行测试,检查程序功能是否按照设计需求以及说明书的规定能够正常打开使用。
三、计算机网络
1.TCP/IP 位于哪一层
1.1. TCP/IP 有几层,为什么没有物理层
1.2. TCP和UDP有什么区别
1.3. TCP怎么实现可靠传输
带重传的肯定确认
1.4. TCP怎么解决拥塞控制
慢开始
快重传
快恢复
1.5. 怎么判断是不是拥塞了,拥塞了怎么办
发送方接受到的报文段小于自身发送的报文时,报文中途丢失了,重传计时器超时
2. UDP有哪些应用
QQ语音、QQ视频、实时语音
3. 计算机网络中有哪些流量控制,缓存满了怎么调度
滑动窗口
后退N帧
停止等待
选择重传
4. 子网掩码的作用
同一个IP地址根据不同子网掩码,会划分出不同的网络号和机器号。
子网掩码就是用来遮掩IP地址并划分网段的工具,根据遮掩的位数不同来划分不同的网段
5. 交换机、路由器和集线器的区别
交换机(Switch)意为“开关”是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机
6. 交换机能不能用在大型网络中
7. IP地址和MAC地址的区别
1、两者地址使用不同。
IP地址是指Internet协议使用的地址,而MAC地址是Ethernet协议使用的地址。当存在一个附加层的地址寻址时,设备更易于移动和维修。
2、分配依据不同。IP地址的分配是基于网络拓朴,MAC地址的分配是基于制造商。
IP地址是可以自动分配的,MAC地址在每个网卡出场的时候就有一个全球唯一的MAC地址,所以很多的验证软件就是验证mac地址的。
3、地址能否更改不同。
IP是可以更改的,mac地址虽然也可以更改,但是一般用不上,除非要用来绕过一些验证软件的。网卡在通讯的时候通过mac地址相互识别。
4、 长度不同。
IP地址为32位,MAC地址为48位。
5、寻址协议层不同。
IP地址应用于OSI第三层,即网络层,而MAC地址应用在OSI第二层,即数据链路层。
7.1. 网络层的设备有哪些
路由器,三层交换机,防火墙
7.2 计算机网络中各层和网络中的地址对应关系
7.3. IP地址的组成,有几位
网络地址
主机地址
8. OSI模型有几层
8.1·传输层的作用
8.2. 传输层有什么协议
8.3 各层作用
8.4. OSI模型和五层协议和TCP/IP模型
8.5. 五层上有什么协议
9. 内部网关协议有哪些,各有什么特点
9.1 距离-向量路由算法(RIP)
在距离-向量路由算法中,所有结点都定期地将它们的整个路由选择表传送给所有与之直接相邻的结点。这种路由选择表包含:1.每条路径的目的地(另一结点)。2.路径的代价(也称距离)。在这种算法中,所有结点都必须参与距离向量交换,以保证路由的有效性和一致性,也就是说,所有的结点都监听从其他结点传来的路由选择更新信息,并在下列情况下更新它们的路由选择表:
- 被通告一条新的路由,该路由在本结点的路由表中不存在,此时本地系统加入这条新的路由。
- 发来的路由信息中有一条到达某个目的地的路由,该路由与当前使用的路由相比,有较短的距离(较小的代价)。此种情况下,就用经过发送路由信息的结点的新路由替换路由表中到达那个目的地的现有路由。
9.2 链路状态路由算法(OSPF)
链路状态路由算法要求每个参与该算法的结点都具有完全的网络拓扑信息,它们执行下述两项任务。
第一,主动测试所有邻接结点的状态。两个共享一条链接的结点是相邻结点,它们连接到同一条链路,或者连接到同一广播型物理网络。
第二,定期地将链路状态传播给所有其他结点(或称路由结点)
距离-向量路由算法与链路状态路由算法的比较:在距离-向量路由算法中,每个结点仅与它的直接邻居交谈,它为它的邻居提供从自已到网络中所有其他结点的最低费用估计。在链路状态路由算法中,每个结点通过广播的方式与所有其他结点交谈,但它仅告诉它们与它直接相连的链路的费用。相较之下,距离~向量路由算法有可能遇到路由环路等问题。
-
路由表有哪些字段
10.1. 路由表表项
目的地址:用来标识IP包的目的地址或者目的网络。
mask:网络掩码,与目的地址一起标识目的主机或者路由器所在的网段的地址。
pre:标识路由加入IP路由表的优先级。
nexthop:下一跳IP地址,说明IP包所经过的下一个路由器。
10.2. 路由器内部有哪些协议
RIP OSPF
10.3. 你把家里的路由器看成什么设备
10.4. 路由器的作用和功能
第一,网络互连:路由器支持各种局域网和广域网接口,主要用于互连局域网和广域网,实现不同网络互相通信;
第二,数据处理:提供包括分组过滤、分组转发、优先级、复用、加密、压缩和防火墙等功能;
第三,网络管理:路由器提供包括路由器配置管理、性能管理、容错管理和流量控制等功能。
10.5. 路由的定义 -
计算机网络的地址
11.1. 有哪些地址
12.1. mac和IP怎么相关转换
ARP协议
ARP 工作在网络层,其工作原理如下:主机A 欲向本局域网上的某台主机B 发送IP 数据报时,先在其ARP 高速缓存中查看有无主机B 的IP 地址。如有,就可查出其对应的硬件地址,再将此硬件地址写入MAC 帧,然后通过局域网将该MAC 帧发往此硬件地址。如果没有,那么就通过使用目的MAC 地址为FF-FF-FF-FF-FF-FF 的帧来封装并广播ARP 请求分组,使同一个局域网里的所有主机收到ARP 请求。主机B 收到该ARP 请求后,向主机A 发出响应ARP 分组,分组中包含主机B 的IP与MAC 地址的映射关系,主机A 在收到后将此映射写入ARP 缓存,然后按查询到的硬件地址发送MAC 帧。ARP 由于“看到了"IP 地址,所以它工作在网络层,而NAT路由器由于“看到了“端口,所以它工作在传输层。
13.1. MAC地址是什么地址,为什么要有MAC地址
通俗一点来说就是有了IP地址,就只通过路由器找到目的主机,屏蔽了下层网络的异构型,由MAC地址完成下层的实际转发。 -
路由算法
12.1. OSPF和RIP -
计算机网络的拓扑结构
-
计算机网络按照覆盖范围可以划分成什么
1、局域网。局域网是一种在小区域内使用的,由多台计算机组成的网络,覆盖范围通常局限在10 千米范围之内,属于一个单位或部门组建的小范围网。
2、城域网。城域网是作用范围在广域网与局域网之间的网络,其网络覆盖范围通常可以延伸到整个城市,借助通信光纤将多个局域网联通公用城市网络形成大型网络,使得不仅局域网内的资源可以共享,局域网之间的资源也可以共享。
3、广域网。广城网是一种远程网,涉及长距离的通信,覆盖范围可以是个国家或多个国家,甚至整个世界。由于广域网地理上的距离可以超过几千千米,所以信息衰减非常严重,这种网络一般要租用专线,通过接口信息处理协议和线路连接起来,构成网状结构,解决寻径问题。 -
你认为计算机网络的定义是什么
-
网关是什么
“网关又称为协议转换器。网关的功能是实现网络之间的相互连接。网关不仅可以让广域网之间相互连接,也可以让局域网之间相互连接。网关在计算机和设备之间起转换的作用,相当于一个翻译器,可以使不同的协议、语言、数据在不同的系统之间进行转换 -
数据链路层的三个基本问题和解决办法
封装成帧:
数据链路层的发送方应当让接收方的数据链路层知道,所发送的帧是从什么地方开始到什么地方结束。
封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。
透明传输:
数据链路层传送的比特组合必须是不受限制的。
发送端的数据链路层在数据中出现控制字符”SOH”和”EOT”的前面插入一个转义字符”ESC”
差错检验:
数据链路层必须有差错检测功能。
使用循环冗余检验CRC的检测技术 -
传输层端口号和http、ftp、web的端口号
http:80
ftp:20(传输数据), 21(控制)
dns:53 -
已经有交换机了,还需要CSMA/CD协议吗
不需要 -
IPv4的地址是不够用的,怎么处理这个问题
ipv6
四、计算机组成原理 -
中断有几种
1.1. 中断的过程,描述一下中断
1.2. 断点的概念
断点是CPU中断响应的一个返回点(或状态点)
1.3. 中断的类型
1.4. 中断向量表
1.5. 中断向量
中断向量:每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。
所有中断的中断服务程序入口地址构成一个表,称为中断向量表;
2. b/s和c/s的区别
3. 五种CPU与外设交换方式
- 程序 I/O 方式
1.早期的计算机系统中, 没有中断系统,所以CPU和I/O设备进行通信,传输数据时CPU速度远快于I/O设备,于是CPU需要不断测试I/O设备,看其是否完成了传输
2.当某进程要启动某个 I/O 设备工作时,便由 CPU 向相应的设备控制器发出一条 I/O 命令,然后立即返回继续执行原来的任务。仅当输完一个数据时,才需 CPU 花费极短的时间去做些中断处
3.DMA方式(直接存储器访问)
通过在I/O设备和内存之间开启一个可以直接传输数据的通路,采用DMA控制器来控制一个数据块的传输,CPU只需在一个数据块传输开始阶段设置好传输所需的控制信息,并在传输结束阶段做 进一步处理。
4.I/O通道控制方式
虽然DMA方式比起中断方式来已经显著地减少了CPU的干预,即已由以字(节)为单位的干预减少到以数据块为单位的干预。但CPU每发出一条I/O指令,也只能去读/写一个连续的数据块。而 当我们需要一次去读多个数据块且将它们分别传送到不同的内存区域,或者相反时,则需由CPU 分别发出多条I/O指令及进行多次中断处理才能完成。
---- 通道控制方式与DMA控制方式类似,也是一种以内存为中心,实现设备与内存直接交换数据的控制方式。
---- 与DMA控制方式相比,通道方式所需要的CPU干预更少,而且可以做到一个通道控制多台设备,从而进一步减轻了CPU负担。
---- 通道本质上是一个简单的处理器,专门负责输入、输出控制,具有执行I/O指令的能力,并通过执行通道I/O程序来控制I/O操作。
---- 通道的指令系统比较简单,一般只有数据传送指令、设备控制指令等。 - 南桥北桥
南桥北桥就是两颗 相对意义上的高速低速 IO模块。
南北桥之前是按速度划分:
内存, pci-e这样第一梯队速度的是北桥
usb网卡声卡这样第二梯队速度的是南桥 - cache有几种映射方式
5.1. cache是什么,为很么要采用cache,原理是什么
5.2. 分别解释下两个局部性
- 程序的时间局部性: 是指程序即将用到的信息可能就是目前正在使用的信息。
- 程序的空间局部性: 是指程序即将用到的信息可能与目前正在使用的信息在空间上相邻或者临近。
- CPU有几种设计方式
CISC RISC
(1)程序直接控制方式:就是由用户进程直接控制内存或CPU和外围设备之间的信息传送。这种方式控制者都是用户进程。
(2)中断控制方式:被用来控制外围设备和内存与CPU之间的数据传送。这种方式要求CPU与设备(或控制器)之间有相应的中断请求线,而且在设备控制器的控制状态寄存器的相应的中断允许位。
(3)DMA方式:又称直接存取方式。其基本思想是在外围设备和内存之间开辟直接的数据交换通道。
(4)通道方式:与DMA方式相类似,也是一种以内存为中心,实现设备和内存直接交换数据控制方式。
6.1 DMA方式与通道方式的主要区别
①与DMA控制方式相加,通道控制方式所需的CPU干预更少,并且一个通道可以控制多台设备,进一步减轻了CPU的负担。
②对通道来说,可以使用一些指令来灵活改变通道程序,这一点DMA控制方式却无法做到。
③DMA方式需要CPU来控制传输数据块的大小、传输的内存位置,而通道方式中这些信息是由通道控制的。
7. 并行通信和串行通信
1、发送数据数量不同
串行通信用一根线在不同的时刻发送8位数据;并行通信在同一时刻发送多位数据。
2、优点不同
串行通信优点是传输距离远、占用资源少,并行通信优点是发送速度快。
3、缺点不同
串行通信缺点是发送速度慢,并行通信缺点是传输距离短、资源占用多。
8. 什么是RISC和CISC,他们的区别和特点
-
CPU和外设的通信方式,其中输入输出处理机的方式和其作用再哪些地方,
-
并行接口和串行接口
五、操作系统 -
什么是内组件、什么是外组件
内组件:
外组件 -
简述处理机管理、文件管理
处理机管理(进程控制、进程同步、进程通信、死锁处理、处理机调度)
存储器管理(提高内存利用率,内存的分配与回收、地址映射、内存保护与共享、内存扩充)
文件管理(计算机中的信息都是以文件的形式存在的)
设备管理(完成用户的I/O请求,方便用户使用设备、并提高设备的利用率) -
介绍一下实时操作系统和分时操作系统
-
分时(Time Sharing)操作系统的工作方式是:一台主机连接了若干个终端,每个终端有一个用户在使用;
-
实时操作系统(RealTimeOperatingSystem,RTOS)是指使计算机能及时响应外部事件的请求,在规定的严格时间内完成对该事件的处理,并控制所有实时设备和实时任务协调一致地工作。
-
说一下并行和串行
1、数据传送方式不同:串行口传输方式为数据排成一行、一位一位送出接收也一样,并行口传输8位数据一次送出.
2、针脚不同:串行口针脚少、并行口针脚多.
3、用途不同:串行口现在只用作控制接口、并行口多用作打印机、扫描仪等接口。
六、编译原理 -
编译的过程分为哪些阶段,其中哪些阶段是必不可少的
词法分析、语法分析、语义分析与中间代码产生、优化和目标代码生成。 -
C的编译过程
● 预处理(Preprocessing)
● 编译(Compilation)
● 汇编(Assembly)
● 链接(Linking)
七、数据库 -
ER图转换原则
-
数据库并发机制
在线程并发处理中, Synchronized内置锁 就是悲观锁的一种,也称之为 独占锁,加了synchronized关键字的代码基本上就只能以单线程的形式去执行了,它会导致其他需要该资源的线程挂起,直到前面的线程执行完毕释放所资源;而 乐观锁是一种更高效的机制,它的原理就是每次不加锁去执行某项操作,如果发生冲突则失败并重试,直到成功为止,其实本质上不算锁,所以很多地方也称之为自旋。
乐观锁的理念是:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性;而悲观锁的理念是假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。针对于不同的业务场景,应该选用不同的并发控制方式。所以,不要把乐观并发控制和悲观并发控制狭义的理解为DBMS中的概念,更不要把他们和数据中提供的锁机制(行锁、表锁、排他锁、共享锁)混为一谈。需要指出的是,在DBMS中,悲观锁正是利用数据库本身提供的锁机制来实现的。 -
建立数据的流程
-
数据库范式
1NF
作为一个二维表,关系要符合一个最基本的区间,每个分量必须是不可分的数据项,即具有原子性。
1NF强调的是列的原子性,即列的属性不可再拆分。比如下表包含「姓名」、「性别」、「电话」字段。
但是在实际应用场景中,「电话」是可以被拆分为「家庭电话」以及「工作电话」的。所以我们说,「电话」这一列不符合原子性原则,也就是说这个表不符合1NF。
正确的做法应该是将「电话」拆分为「家庭电话」和「工作电话」。
(总结:就是一个表中的属性,不能拆分成多个就说这个表符合第一范式)。
2NF
在第一范式的基础上,没有非主属性对于码的部分函数依赖。即每个非主属性完全依赖于任何一个候选码。
举例学生成绩表(学号,姓名,科目,成绩,所属院系,系主任)
此表中由于成绩是由科目和学号共同确定的,只有当学号确定,科目确定,才能知道成绩。
所以这个表的码就是(学号,科目)这两个组成的。然后就是说主属性是学号和科目,非主属性是姓名,成绩,所属院系,系主任。
因为姓名可以不需要科目只由学号单独就能确定出来,所以说非主属性(姓名)部分函数依赖于码(学号,科目)。所以此表不符合第二范式,要想他符合2NF必须将此表分成两个表:学生表(学号,姓名,所属院系,系主任),成绩表(学号,科目,成绩)。
3NF
不存在非主属性对码的部分函数依赖和传递函数依赖。
举例学生表(学号,姓名,所属院系,系主任)
在这个表中,主属性是学号,由学号可以确定其他的属性,
但是由以下情况 学号–>所属院系,所属院系–>系主任,学号–>系主任
学号可以确定所属院系,所属院系可以确定系主任,学号又可以确定系主任
具有传递关系,即存在非主属性(系主任)对码(学号)的传递函数依赖,所以不符合第三范式。
要想符合3NF就拆分表:学生表(学号,姓名,所属院系) ,院系表(院系,系主任)。
5. 数据库完整性
1、实体完整性
实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。定义表中的所有行能唯一的标识,一般用主键,唯一索引 unique关键字,及identity属性比如说我们的身份证号码,可以唯一标识一个人。
2、域完整性
域完整性是对数据表中字段属性的约束,通常指数据的有效性,它包括字段的值域、字段的类型及字段的有效规则等约束,它是由确定关系结构时所定义的字段的属性决定的。限制数据类型,缺省值,规则,约束,是否可以为空,域完整性可以确保不会输入无效的值。
3、参照完整性
参照完整性是对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参考完整性
6. 数据库的索引
6.1 概念
数据库索引好比是一本书前面的目录,能加快数据库的查询速度。索引是对数据库表中一个或多个列的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息
常见的查询算法:顺序查找、二分查找、二叉排序树查找、哈希散列法、分块查找、平衡多路搜索树B树(B-tree)
索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现
6.2 优缺点
优点:
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
1.索引需要占用数据表以外的物理存储空间
2.创建索引和维护索引要花费一定的时间
3.当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
6.3 索引的类型
唯一索引: UNIQUE 例如:create unique index stusno on student(sno);
表明此索引的每一个索引值只对应唯一的数据记录,对于单列唯一性索引,这保证单列不包含重复的值。对于多列唯一性索引,保证多个值的组合不重复。
主键索引: primary key
数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
聚集索引(也叫聚簇索引):cluster
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。 如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。
6.4 索引的实现方式
1.B+Tree 索引
MyISAM和InnoDB存储引擎的默认创建的是B+tree索引,Memory存储引擎也可以为B+tree索引(或者Hash索引)InnoDB 的 B+Tree 索引分为主索引和辅助索引。
主索引的叶子节点 data 域记录着完整的数据记录,这种索引方式被称为聚簇索引。因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。
辅助索引 的叶子节点的 data 域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找
-
哈希索引
哈希索引能以 O(1) 时间进行查找,但是失去了有序性:无法用于排序与分组;只支持精确查找,无法用于部分查找和范围查找。
InnoDB 存储引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的非常频繁时,会在 B+Tree 索引之上再创建一个哈希索引,这样就让 B+Tree 索引具有哈希索引的一些优点,比如快速的哈希查找 -
全文索引
MyISAM 存储引擎支持全文索引,用于查找文本中的关键词,而不是直接比较是否相等。查找条件使用 MATCH AGAINST,而不是普通的 WHERE。
全文索引使用倒排索引实现,它记录着关键词到其所在文档的映射。InnoDB 存储引擎在 MySQL 5.6.4 版本中也开始支持全文索引 -
空间数据索引
MyISAM 存储引擎支持空间数据索引(R-Tree),可以用于地理数据存储。空间数据索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。 -
数据库的视图
-
数据库delete和drop的作用
-
数据库触发器
● 可在写入数据表前,强制检验或转换数据。
● 触发器发生错误时,异动的结果会被撤销。
● 部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
● 可依照特定的情况,替换异动的指令 (INSTEAD OF)。 -
数据库的三级模式和两级映像
-
数据库死锁
活锁
活锁:如果事务T1封锁了数据R,事务T2又请求封锁数据R,于是T2等待;T3也请求封锁数据R,当T1释放了R上的锁之后,系统首先批准了T3的请求,T2任然等待;然后T4又请求封锁R,当T3释放R上的锁之后,系统又批准了T4的请求……T2有可能永远等待,这就是活锁的情况。
解决办法
避免活锁的简单方法是:采用先来先服务策略
死锁
死锁:如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2封锁了R2,于是T1等待T2释放R2上的锁;接着T2又请求封锁R1,因T1封锁了R1,于是T2等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1,的局面,T1、T2两个事务永远不能结束,形成死锁。
解决办法
解决死锁的方法:有两种思路 -
预防死锁的发生
① 一次封锁法:一次性将所有要使用的数据全部加锁,否则就不能继续执行
存在的问题:扩大了封锁范围,降低了系统的并发度;
② 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按照这个顺序实施封锁。
存在的问题:
1.数据库在动态地不断变化,要维护这样的资源的封锁顺序非常困难,成本很高。
2.事务的封锁请求可以随着事务的执行而动态地决定,很难实现确定每一个事务要封锁哪些对象,因此很难按规定的顺序去施加封锁。 -
死锁的诊断与解除(普遍采用的方法)
① 超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
存在的问题:
1.时间设置太短,有可能误判死锁
2.时间设置太长,死锁发生后不能及时发现
② 等待图法:事务等待图是一个有向图G=(T,U),T为结点的集合,每个结点表示正在运行的事务;U为边的集合,表示事务等待情况,若事务T1等待T2,则在T1、T2之间画一条有向边,从T1指向T2。 -
主键和外键
-
数据库DBA、DBMS的作用
带有数据库的计算机系统,除具备一般的硬件、软件外,必须有用以存储大量数据的直接存取存储设备、管理并控制数据库的软件——数据库管理系统(DBMS)、管理数据库的人员——数据库管理员 (DBA)。
13.1. 用户能不能对数据库进行增删改查 -
数据库的存储程序
一组存储和执行在数据库服务器端的程序。存储程序总是在服务器的进程或线程的内存中执行的。
存储程序分为3类,分别是:
● 存储过程:有输入和输出参数,可以执行一组sql语句。
● 存储函数:有一个返回值,可以执行一组sql语句,可以传递参数。
● 触发器:执行一组sql语句,由事件驱动自动执行,不能传递参数。 -
数据库的事务
15.1. sql server中事务的语句有哪些 -
数据库中怎么消除冗余,举个例子
-
数据库的ACID特性,什么是数据库一致性
(1)原子性 (Atomicity):事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
(2)一致性 (Consistency):数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。
(3)隔离性 (Isolation):一个事务所做的修改在最终提交以前,对其它事务是不可见的。
(4)持久性 (Durability):一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。使用重做日志来保证持久性 -
数据库有哪些操作
-
数据库了解哪些系统