第一章 绪论
软件开发过程
- 问题的理解:清楚问题的输入、要求和输出
- 算法设计:包括软件架构设计、模块分解、选择具体算法策略、用适当的方式描述和逐步细化算法步骤
- 数据结构设计:一方面要选择或设计能有效表示和存储应用问题中所涉及的数据对象的数据结构,同时还要选择或设计能支持算法策略实现的数据结构
- 算法分析:发现有改进完善之处,返回第二步,重新选择或设计算法与数据结构
- 程序设计:设计具体的数据存储方案、数据结构实现细节、基于某种操作系统设计程序实现细节,在计算机上调试和运行程序
- 程序实现:用某种计算机程序设计语言,定义数据结构、数据存储、基于某种操作系统编写实现算法的代码,编译代码并在计算机上调试和运行程序,并不断优化程序设计
数据结构在计算问题中的用途
存放要处理的数据、实现算法策略
算法设计
研究各类数据结构上的各种运算方法,从而解决计算问题
操作系统
一组控制和管理计算机硬件和软件资源、合理的对各类作业进行调度,以及方便用户使用的程序的集合
操作系统主要功能
- 处理机管理
按照一定的算法把处理机分配给进程(线程),并对其进行有效的管理和控制
2. 存储器管理
为多道程序的运行提供良好的环境,方便用户使用存储器,提高存储器的利用率以及 能 从逻辑上扩充内存
- 设备管理
完成用户进程提出的I/O请求;为用户进程分配其所需的I/O设备;提高CPU和I/O设备的利用率;提高I/O速度;方便用户使用I/O设备
-
文件管理
对用户文件和系统文件进行管理,以方便用户使用,并保证文件的安全性
-
用户接口
提供友好的用户接口以方便用户使用
系统调用是用户程序取得操作系统服务的唯一途径
编译原理相关
-
依赖操作系统的编译方式
-
不依赖操作系统的编译方式
-
相关语言
数据库相关
数据库管理系统(DBMS) 是位于用户与操作系统之间的数据管理软件。
数据库在建立、运用和维护时由数据库管理系统统一管理、统一控制。它使用户方便的定义数据和操作数据,并能够保证数据的安全性、完整性、以及多用户对数据的并发使用及发生故障后的数据库恢复。
第二章 数据结构
2.1 线性表
-
线性表的逻辑存储结构
-
线性表的顺序和链式存储结构
顺序:用一组地址连续的存储单元依次存放线性表中的数据元素
链式:用一组地址任意的存储单元存放线性表中的数据元素 -
两种方式插入删除操作
顺序:均为O(n)
链式:O(1) -
两种存储结构的优缺点
顺序适合查找,链式适合插入删除
2.2 复杂度分析
- 常见关系式
例题:
- 渐进分析
2.3 分治递归
-
分治递归算法思想
第一步:要求解一个大问题可划分为k个子问题,对这k个子问题进行求解,如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题的规模足够小,很容易求出其解为止
第二步:将求出的小规模问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解 -
分支法的适用条件
该问题的规模缩小到一定的程度就可以容易地解决;
该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
利用该问题分解出的子问题可以合并为该问题的解;
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
Tips: 如果各个子问题不独立,需要重复的解决公共的子问题,用动态规划更好 -
分治思想求解排序问题
思想:
比如:
应用:归并排序,快速排序等
2.4 树
树的各种基本概念
- 树(Tree)是n(n≥0)个结点的有限集,有且只有一个根结点,其余结点可划分为不同的根的子树
- 树的结点包含一个数据元素及若干指向其子树的分支
- 结点拥有的子树数称为结点的度(Degree)
- 度数为0的结点称为叶子(Leaf)或终端结点
- 度数不为0的结点称为非终端结点或分支结点
- 树的度是树内各结点的度的最大值
- 结点的子树的跟称为该结点的孩子,该结点称为孩子的双亲,同一个双亲的孩子互称兄弟
- 结点的祖先是从根到该结点所经分支上的所有结点,反之,以某结点为根的子树的任意结点都称为该结点的子孙
- 结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层
- 其双亲在同一层的结点互称为堂兄弟
- 树中结点的最大层次称为树的深度
- 如果树中结点的各子树看成从左到右是有次序的,则称该树为有序树,否则称为无序树
- 森林(Forest)是m(m≥0)棵互不相交的树的集合
二叉树的存储结构
- 顺序存储结构
用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素;对于一般二叉树 - 链式存储结构
二叉树的链表中的结点至少包含3个域:数据域和左、右指针域,称之为二叉链表,如若还包含指向双亲结点的指针域则称之为三叉链表
容易证得,在含有 n n n个结点的二叉链表中有 n + 1 n+1 n+1个空链域,则应将其每个结点于完全二叉树上的结点相对照,存储在一维数组的相应分量中
二叉树、满二叉树、完全二叉树
- 二叉树(Binary Tree)是另一种树型结构,它的特点是每个结点至多只有两棵子树(度小于等于2),并且二叉树的子树有左右之分
- 满二叉树一棵深度为 k k k且有 2 2 2 k k k − 1 -1 −1个结点的二叉树
- 完全二叉树深度为 k k k的,有n个结点的二叉树,当且仅当其中每一个结点都与深度为 k k k的满二叉树中编号1至n的结点一一对应
二叉树的遍历
先序中序后序遍历
关键: 递归实现(先序指的是根结点的顺序在先)
#include<iostream>
using namespace std;
typedef struct BiTNode {
char data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void creatBiTree(BiTree& T);
void InOrderTraverse(BiTree T);
void PostOrderTraverse(BiTree T);
int getNumOfLeaf(BiTree T, int count);
int getDepth(BiTree T);
int main()
{
BiTree T = new BiTNode;
cout << "请先序输入结点:" << endl;
creatBiTree(T);
cout << endl;
cout << "中序遍历:";
InOrderTraverse(T);
cout << endl;
cout << "后序遍历:";
PostOrderTraverse(T);
cout << endl;
cout << "叶子结点数:";
cout << getNumOfLeaf(T, 0) << endl;
cout << "树的高度:";
cout << getDepth(T) << endl << endl;
system("pause");
return 0;
}
void creatBiTree(BiTree& T)
{
char data;
cin >> data;
if (data == ',') {
T = nullptr;
return;
}
T = new BiTNode;
T->data = data;
creatBiTree(T->lchild);
creatBiTree(T->rchild);
}
void InOrderTraverse(BiTree T)
{
if (T) {
InOrderTraverse(T->lchild);
cout << T->data << " ";
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{
if (T) {
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data << " ";
}
}
int getNumOfLeaf(BiTree T, int count)
{
if (T) {
if (!T->lchild && !T->rchild) {
return ++count;
}
count = getNumOfLeaf(T->lchild, count);
count = getNumOfLeaf(T->rchild, count);
}
return count;
}
int getDepth(BiTree T)
{
if (T) {
int HL = getDepth(T->lchild);
int HR = getDepth(T->rchild);
int MaxH = HL > HR ? HL : HR;
return (MaxH + 1);
}
else {
return 0;
}
}
层次遍历
关键:队列实现(父节点出队列,子节点入队)
题:给定先序和中序遍历恢复二叉树
核心:判断根结点
2.5 图
图的定义及相关术语
- 图是一种较线性表和树更为复杂的数据结构。在图形结构中,结点之间的关系是任意的,图中任意两个数据元素之间都可能相关。
- 在图中的数据元素通常称做顶点(Vertex),V是顶点的有穷非空集合;VR是两个顶点之间的关系的集合。若 < v , w > ∈ V R <v,w>∈VR <v,w>∈VR,则 < v , w > <v,w> <v,w>表示从 v v v到 w w w的一条弧(Arc), 且称 v v v为弧尾(Tail)或起始点,称 w w w为弧头(Head)或终端点。
- 无向图中 < v , w > <v,w> <v,w>与 < w , v > <w,v> <w,v>是相同的,即VR是对称的,用 ( v , w ) (v,w) (v,w)表示 v v v和 w w w的一条边(Edge),反之称为有向图。
- 有 1 2 \Large\frac{1}{2} 21 n ( n − 1 ) n(n-1) n(n−1)条边的无向图称为完全图,有 n ( n − 1 ) n(n-1) n(n−1)条边的有向图称为有向完全图
- 有很少条边或弧的无向图称为稀疏图,反之称为稠密图。
- 有时图的边或弧具有与它相关的数,这种与图的边或弧相关的数叫做权(Weight)。
- 对于无向图 G = ( V , G=(V, G=(V,{ E E E} ) ) ),如果边 ( v , v ′ ) ∈ E (v,v')∈E (v,v′)∈E,则称顶点 v v v和 v ′ v' v′互为邻接点(Adjacent)。边 ( v , v ′ ) (v,v') (v,v′)依附于顶点 v v v和 v ′ v' v′,或者说 ( v , v ′ ) (v,v') (v,v′)和顶点 v v v和 v ′ v' v′相关联。
- 顶点的度(Degree)是和 v v v相关联的边的数目,记为 T D ( V ) TD(V) TD(V)。以顶点 v v v为头的弧的数目称为 v v v的入度(InDegree),记为 I D ( v ) ID(v) ID(v);以顶点 v v v为尾的弧的数目称为 v v v的出度(OutDegree),记为 O D ( v ) OD(v) OD(v); T D ( v ) = I D ( v ) + O D ( v ) TD(v)=ID(v)+OD(v) TD(v)=ID(v)+OD(v)。
- 一般地,如果顶点 v v v i i i的度记为 T D ( v TD(v TD(v i i i ) ) ),那么一个有 n n n个顶点, e e e条边或弧的图,满足 e = e= e= 1 2 \Large\frac{1}{2} 21 ∑ T D ( v ) \sum TD(v) ∑TD(v)
- 无向图中从顶点 v v v到顶点 v ′ v' v′的路径是一个顶点序列。第一个顶点和最后一个顶点相同的路径称为回路或环(Cycle)。序列中顶点不重复出现的路径称为简单路径,类似的,除了第一个和最后一个顶点外,其余顶点不重复出现的回路称为简单回路或简单环。
- 在无向图 G G G,如果通过顶点 v v v到顶点 v ′ v' v′有路径,则称 v v v和 v ′ v' v′是连通的。如果对图 G G G中任意两个顶点都满足连通关系,则称图 G G G为连通图(Connected Graph)。连通分量(Connected (Connected Graph))是指无向图中的极大连通子图。
- 在有向图 G G G,如果每一对顶点都有路径,则称 G G G为强连通图,有向图中的极大强连通子图称做有向图的强连通分量。
- 一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的 n − 1 n-1 n−1条边。
- 一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧。
图的存储结构
- 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此没有顺序映像的存储结构
- 邻接矩阵
- 邻接表
图的遍历
深搜和广搜
深搜:递归进行
广搜:队列进行,类似树是层次遍历
贪心算法与单源最短路径
- 贪心算法
- 在对问题求解时,总是做出在当前看来是最好的选择,也就是说仅仅是在某种意义上的局部最优解。
贪心算法不能对所有问题都得到整体最优解。
活动安排
Dijkstra
第三章 操作系统
3.1 进程相关
进程的定义
- 一个正在执行的程序
- 可并发执行的程序在一个数据结合上的运行过程
- 基本特征
- 动态性:存在生命周期
- 并发性:任何进程都可以同其他进程一起推进
- 独立性:各进程的地址空间相互独立,除非采用进程间通信手段
- 异步性:按各自独立的、不可预知的速度向前推进
- 结构性:进程 = 进程控制块(PCB) + 程序块 + 数据段
进程的五状态转换模型
- 新建状态
进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态 - 就绪状态
进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行 - 执行状态
进程处于就绪状态被调度后,进程就会进入到执行状态 - 阻塞状态
正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用 - 终止状态
进程结束,或出现错误,或被系统终止,进入终止状态,无法再执行
进程的构成与PCB
-
进程 = 进程控制块(PCB) + 程序块 + 数据段
-
PCB(process control block)
进程存在的唯一标识,进程新建时就有
运行Fork()创建进程
-
进程的创建
-
Fork()
-
例题
3.2 线程相关
线程的定义
线程是操作系统汇总独立调度和分派的基本单位,大部分情况下,他被包含在进程之中,是进程中的实际运作单位。
进程的俩基本特点:资源所有权和调度基本单位
现将调度权力给了线程,线程也就不含资源所有权,进程中的所有线程共享进程的资源,当然TCB、程序计数器、寄存器和堆栈这些必不可少的资源除外
进程和线程的区别
-
概念
进程是系统进行资源分配和调度的一个独立单位
线程是进程中的一个实体,是独立调度和分配的基本单位 -
调度
-
并发性
-
拥有资源
-
系统开销
三类线程(用户级、内核级、混合)
- 根据线程是否对内核透明
-
用户级线程
含义:线程的创建、撤销和切换等操作全部由应用程序完成
操作系统内核不知道线程的存在,仍以进程为调度单位Infomix OS
-
内核级线程
含义:线程的创建、撤销和切换等操作由系统内核完成,操作系统以线程为调度单位Win Linux OS
优缺点:
-
混合线程
含义:线程的创建、撤销、调度和同步等操作在用户级应用程序中完成,多个用户级线程被影射到一个或较少的某些内核级线程Solaris OS
-
用户级、内核级、混合模式比较
3.3 互斥与同步
竞争临界资源引起的问题和互斥的条件
-
临界资源
必须互斥使用的资源称为临界资源 -
临界区
访问临界资源的那段代码 -
引起的问题
忙等、饥饿和死锁
-
临界区使用原则/互斥条件
空闲让进
当无进程处于临界区时,允许进程进入临界区
忙则等待
当一个进程正处在某临界区内,任何试图进入其临界区的进程都必须进入代码连续循环,陷入忙等状态。连续测试一个变量直到某个值出现为止,称为忙等
有限等待
对要求访问临界资源的进程,应保证有限时间内能进入自己的临界区,以免陷入“死等”状态~(受惠的是进程自己)
让权等待
当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态~(受惠的是其他进程)
掌握信号量方法
- 互斥与同步解决策略
信号量进行互斥和同步
-
基本原理
两个或多个进程可以通过传递信号的方式进行合作,可以迫使进程在某个位置暂停执行(阻塞等待),知道他收到一个可以“向前推进”的信号(被唤醒)
将实现信号灯作用的变量称为信号量,常定义为记录型变量s,其中一个域为整型,另一个域为队列,其元素为等待该信号量的阻塞进程(FIFO) -
P/V操作
-
信号量的物理意义
-
wait、signal应用
-
信号量分类
互斥信号量:用于申请或释放资源的使用权,通常初始化为1
资源信号量:用于申请或归还资源,可以初始化为大于1的正整数表示系统中某类资源的可用个数
解决生产者消费者问题
进程间通信方式
-
进程通信
进程之间的信息交换 -
进程通信方式
-
掌握消息传递机制
-
如何用消息传递机制实现互斥
3.4 程序的装入和链接
高级语言的源代码转化为进程的三个步骤
静态链接,装入时链接,运行时链接的区别,以及各自的优缺点
-
静态链接
在程序运行之前,先将各目标模块及他们所需的库函数,链接成一个完整的装配模块(又称执行模块),以后不再拆开。
-
装入时动态链接
目标模块在装入内存时,采用边装入边链接的链接方式。
-
运行时动态链接
对某些目标模块的链接,是在程序执行中需要该目标模块时,由操作系统去找到该模块并将之装入内存,随后把他链接到调用者模块e
绝对装入方式和可重定位装入方式的优缺点
-
绝对装入方式
-
可重定位装入方式
-
运行时重定位(动态重定位)装入方式
第四章 编译原理
4.1 数据类型及其抽象层次
- 含义
数据类型实质上是对存储器中所存储的数据进行的抽象,包括了一组值的集合和一组操作 - 抽象层次分类
内部类型、用户定义类型和抽象数据类型 - 抽象数据类型
满足下述特性的用户定义类型称为抽象数据类型
(1)在定义该类型的程序单元中,建立与表示有关的基本操作
(2)对使用该类型的程序单元来说,该类型的表示是隐蔽的比如Java中get,set而不用public,为了封装性与安全性
4.2 六种数据类型聚合方式
-
笛卡尔积
- 定义
n个集合A1, A2, … , An的笛卡儿积:
A1×A2×…×An,
它是一个集合,其元素时有序的n元式
(a1, a2, … , an) - 举例
例如一个正多边形用一个整数表示边数,用一个实数表示长度
integer×realC语言中的结构就是很好应用
- 定义
-
有限映像
- 定义
从定义域类型DT值的有限集合,到值域类型RT值的有限集合的函数(映像)称为有限映像
值域对下给你通过下标变量方式对应 - 举例
数组
- 定义
-
序列
(1)任意多个数据项组成,数据项称为该序列的成分,且类型相同
(2)串是序列(字符串)
(3)顺序文件的思想也来自序列的概念,只能顺序读写 -
递归
若数据类型T包含属于同一类型T的成分——递归类型
(1)在类型定义中使用被定义类型的名字
(2)不允许直接递归(C++的静态对象成员除外)
(3)指针是构造递归类型的重要手段struct mlink { int data; struct mlink *next; …
-
判定或
可以选择不同成员的构造机制
例如C的联合union
union Data
{
int i;
float f;
char str[20];
} data;
现在,Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。 -
幂集
类型T的元素所有子集的集合,称为幂集,T称为基类型(并不所有语言都有幂集聚合机制,没有的话可以用链表,数组实现)
4.3 语句级控制结构
-
语句级控制结构
规定语句执行流程的控制单元级控制结构:控制调用程序单元
-
三种 语句级控制结构
顺序
选择(分支)
重复(循环)
-
顺序
-
语言可用的、最简单的控制结构
A;
B; -
复合语句
若干个语句可以组合在一起。逻辑上作为一条语句对待
如{…}
-
-
选择
选择控制结构允许在某些可选择的语句中选择其中一条来执行单选: if then
二选一: if then else
多选一:嵌套 if then else -
重复
-
两种情况
计数器制导
条件制导 -
计数器制导
当预先知道重复次数时,在循环计数器值的有限集合上重复
(for循环) -
条件制导
不知道次数,只知道条件
(while, do-while)
-
4.4 定义语言:生成(文法)或识别(语法图)
- 文法从产生的观点来定义语言的语法,通用性好
- 语法图从识别的观点定义语言的语法,更直观和清晰
文法
4.5 文法的分类
文法
0型文法:没有限制
1型文法:左边表达式长度小于右边(s->埃普西隆除外)
2型文法:在1基础上,左边是非终结符
3型文法:3型文法也叫正规文法,它对应于有限状态自动机。它是在2型文法的基础上满足:A→α|αB(右线性)或A→α|Bα(左线性)。
4.6 推导与规约,文法与语言,二义性问题
4.7 短语、直接短语、句柄的含义和求法
4.8 编译步骤
每个步骤的任务,符号表及管理程序的任务
- 变量四要素:类型、值、作用域和生存期
- 编译步骤
-
词法分析
输入字符串,根据此法规则识别出单词符号 -
语法分析
根据语法规则,将单词符号构成各类语法单位,并执行语法检查 -
语义分析
根据语义规则,进行初步编译 -
优化
对中间代码进行等价变换,以使代码更有效 -
目标代码生成
生成机器语言程序或汇编语言程序 -
符号表管理
完成符号表的建立,查找,更新 -
出错处理
发现,指出,限制(1)实用的编译程序不一定总是分成5个阶段
(2)目标程序不一定能立即执行,可能还要经过链接、装入等阶段
(3)编译的各阶段均需要和符号表管理程序、出错程序打交道
4.9 语法分析的两大类别:自下而上和自上而下
4.10 递归下降分析法
公共左因子和左递归消除
语法分析
4.11 预测分析法
分析方法,流程,组成
FIRST集和FOLLOW集
预测分析表的构造
LL(1)文法的判断
语法分析
4.12 LR分析法是句柄规约
4.13 语义翻译的概念、作用
4.14 类型检查
4.15 语义翻译
赋值语句的翻译
布尔表达式
IF语句的翻译
4.16 中间代码的写法:三地址码、四元式
第五章 数据库
5.1 数据库基本概念
-
数据库
数据库是长期存储在计算机内、有组织的、可共享的大量数据集合 -
DBMS
一个能够让用户定义、创建和维护数据库以及控制对数据库访问的软件系统组成:查询处理器 + 存储管理器
查询处理器:DDL编译器、DML编译器、嵌入式DML的预编译器及查询运行核心程序
存储管理器:授权和完整性管理器、事务管理器、文件管理器及缓冲区管理器
-
数据库系统
DBS是指在计算机系统中引入数据库后的系统构成
由硬件系统、数据库集合、数据库管理系统及相关软件、DBA、用户组成
5.2 模式的体系结构,三种模式
-
型 和 值 的概念
型:对某一类数据的结构和属性的说明
值:是型的一个具体赋值 -
模式
数据库逻辑结构和特征的描述
是型的描述
反映的是数据的结构及其联系
模式是相对稳定的
5.3 关系模式的基本概念
-
关系模式
关系名、属性的名字及相关联的域名、完整性约束(表头)
关系必须是规范化的,满足一定的规范条件
-
关系
笛卡尔积的一个有意义的子集
关系模式是静态的,比如我们看到的一张二维表的表头,即有哪些构成,每个列的名称,类型啊长度等等
关系是动态的,就是一张二维表的具体内容,就是除了标题以外的数据行,因为表数据经常被修改,插入,删除,所以不同时刻、关系可能不一样、其实,关系就是数学中的集合了,每一行就是集合的一个元素
关系为一张二维表的具体内容,就是除了标题行以外的数据行,因为表数据经常被修改,插入,删除,所以不同时刻,关系可能不一样。
- 元组
表中的一行,表示一个实体,关系是由元组组成的 - 属性
表中的每一列在关系中称为属性 - 域(Domin)
属性的取值范围
5.4 主码与候选码
5.5 关系运算,运算符表达式
-
并运算
-
差运算
-
交运算
-
笛卡尔积运算
-
选择运算
-
投影运算
-
条件运算
-
自然连接
-
连接运算
5.6 完整性约束,规则、类别等
-
概述
完整性约束是加在数据库模式上的一个具体条件,它规定什么样的数据能够存储到数据库系统中。比如,年龄必须为整数,有取值范围等
学号一定是唯一的
学生所在的系是学校开设的系 -
控制机制
-
目的
数据的完整性是为了防止数据库中存在不符合的数据,防止错误数据的输入和输出所造成的无效操作和错误结果。 -
分类
-
PK约束
主键约束,非空唯一 -
UNIQUE约束
唯一,允许为空,多个空都可 -
NOT NULL约束
-
CHECK约束
-
FK约束
外键约束
5.7 SQL语法
5.8 数据库设计理论
函数依赖,模式分解
范式的概念、如何区分不同的范式
-
范式
是一种关系的状态,是衡量关系模式的标准。
1NF、2NF、3NF、BCNF检查关系中属性间的函数依赖
满足特定约束
避免不必要的数据重复 -
1NF
在关系模式R的每个关系中,如果每个属性值都是不可再分的原子值,那么称R是第一范式的模式 -
2NF
如果关系模式R属于1NF, 且每个非主属性(非候选码中的属性)完全函数依赖于候选码,那么称R属于2NF的模式只有在主键是复合属性下才可能不符合2NF
-
3NF
如果关系模式R属于1NF, 且每个非主属性都不传递依赖于R的候选码,那么R属于3NF的模式。
-
BCNF
如果关系模式R属于1NF,且每个属性都不传递依赖R的候选码,那么称R是BCNF的模式
-
范式总结
5.9 数据库应用设计方法
数据库的三种数据模型
物理,概念,逻辑
ER模型的概念、结构及使用其构造数据库的方法