计算机二级Python公共基础部分

大家好,又见面了,我是你们的朋友全栈君。

计算机二级Python公共基础部分


  1. 公共基础知识不单独考试,与其他二级科目组合在一起,作为二级科目考核内容的一部分。
  2. 考试方式为上机考试,10 道选择题,占 10 分。

1. 基本数据结构与算法

1.1 算法的基本概念

算法是一种设计好的计算序列,用来解决一类问题。 算法复杂的包括:时间复杂度和空间复杂度。时间复杂度指计算工作量,空间复杂度指内存空间的要求。

综合起来:如果一个算法的执行次数是 T(n),那么只保留最高次项,同时忽略最高项的系数后得到函数 f(n),此时算法的时间复杂度就是 O(f(n))。为了方便描述,下文称此为 大O推导法。

  • 对于一个循环,假设循环体的时间复杂度为 O(n),循环次数为 m,则这个 循环的时间复杂度为 O(n×m)。
代码语言:javascript
复制
void aFunc(int n) {
    for(int i = 0; i < n; i++) {         // 循环次数为 n
        printf("Hello, World!\n");      // 循环体时间复杂度为 O(1)
    }
}

此时时间复杂度为 O(n × 1),即 O(n)。

  • 对于多个循环,假设循环体的时间复杂度为 O(n),各个循环的循环次数分别是a, b, c…,则这个循环的时间复杂度为 O(n×a×b×c…)。分析的时候应该由里向外分析这些循环。
代码语言:javascript
复制
void aFunc(int n) {
    for(int i = 0; i < n; i++) {         // 循环次数为 n
        for(int j = 0; j < n; j++) {       // 循环次数为 n
            printf("Hello, World!\n");      // 循环体时间复杂度为 O(1)
        }
    }
}

此时时间复杂度为 O(n × n × 1),即 O(n^2)。

  • 对于顺序执行的语句或者算法,总的时间复杂度等于其中最大的时间复杂度。
代码语言:javascript
复制
void aFunc(int n) {
    // 第一部分时间复杂度为 O(n^2)
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            printf("Hello, World!\n");
        }
    }
    // 第二部分时间复杂度为 O(n)
    for(int j = 0; j < n; j++) {
        printf("Hello, World!\n");
    }
}

此时时间复杂度为 max(O(n^2), O(n)),即 O(n^2)。

  • 对于条件判断语句,总的时间复杂度等于其中 时间复杂度最大的路径 的时间复杂度。
代码语言:javascript
复制
void aFunc(int n) {
    if (n >= 0) {
        // 第一条路径时间复杂度为 O(n^2)
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                printf("输入数据大于等于零\n");
            }
        }
    } else {
        // 第二条路径时间复杂度为 O(n)
        for(int j = 0; j < n; j++) {
            printf("输入数据小于零\n");
        }
    }
}

此时时间复杂度为 max(O(n^2), O(n)),即 O(n^2)。

空间复杂度(Space Complexity)

S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括:

  • 存储算法本身所占用的存储空间
  • 算法的输入输出数据所占用的存储空间
  • 算法在运行过程中临时占用的存储空间

算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地”进行的,是节省存储的算法,如这一节介绍过的几个算法都是如此;有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如将在第九章介绍的快速排序和归并排序算法就属于这种情况。

1.2 数据结构

数据结构的定义

程序=数据结构+算法

在计算机科学中,数据结构(datastructure)是计算机中存储、组织数据的方式。指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

  1. 数据的逻辑结构: 反映数据元素之间的关系的数据元素集合的表示。数据的逻辑结构包括集合、线形结构、树形结构和图形结构四种
  2. 数据的存储结构: 数据的逻辑结构在计算机存储空间种的存放形式称为数据的存储结构。常用的存储结构有顺序、链接、索引等存储结构。

常见的数据结构:

数组(Array) 堆栈(Stack) 队列(Queue) 链表(Linked List) 树(Tree) 图(Graph) 堆(Heap) 散列表(Hash) 线性结构和非线性结构

根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构和非线性结构。

1.3 线性表

线性表的定义 线性表(Linear List)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列。

  • 数据元素的个数n定义为表的长度 = “list”.length() (“list”.length() = 0(表里没有一个元素)时称为空表)
  • 将非空的线性表(n>=0)记作:(a[0],a[1],a[2],…,a[n-1])
  • 数据元素a[i](0≤i≤n-1)只是个抽象符号,其具体含义在不同情况下可以不同

常见的线性表有顺序表链表 顺序表是线性表的顺序存储结构,指的是用一组地址连续的存储单元依次存储线性表的数据元素。 顺序表常见操作*(括号中为算法平均时间复杂度,没有写明的具体复杂度依赖不同算法和运算规则)*:

插入(O(n))、删除(O(n))、查找、排序、分解、合并、复制(O(n))、逆转(O(n))

1.4 栈和队列

栈实际上也是一个线性表,只不过是一种特殊的线性表。栈是只能在表的一端进行插入和删除运算的线性表,通常称插入、删除这一端为栈顶(TOP),另一端为栈底(BOTTOM)。当表中没有元素时称为栈空。 栈顶元素总是后被插入(入栈)的元素,从而也是最先被移除(出栈)的元素;栈底元素总是最先被插入的元素,从而也是最后才能被移除的元素。所以栈是个**后进先出(LIFO)**的数据结构

栈的基本运算有三种:入栈、出栈与读栈顶,时间复杂度都是O(1)

队列

队列是只允许在一端删除,在另一端插入的顺序表,允许删除的一端叫做队头,用对头指针 front 指向对头元素的下一个元素,允许插入的一端叫做队尾,用队尾指针 rear 指向队列中的队尾元素,因此,从排头指针 front 指向的下一个位置直到队尾指针 rear 指向的位置之间所有的元素均为队列中的元素。队列的修改是 先进先出(FIFO) 。往队尾插入一个元素称为入队运算。从对头删除一个元素称为退队运算。

队列主要有两种基本运算:入队运算和退队运算,复杂度都是O(1)

1.5 链表

链表指线性表的链式存储结构。

  • 单链表 一组任意的存储单元存储线性表的数据元素,因此,为了表示每个数据元素 ai 与其直接后继数据元素 ai+1 之间的逻辑关系,对数据元素 ai 来说,除了存储其本身的信息(数据域)之外,还需存储一个变量指示其直接后继的信息(指针域)。这两部分信息组成数据元素 ai 的存储映象,称为结点。N 个结点链结成一个链表。该链表就是传统的单向链表。

有时,我们在单链表的第一个结点之前附设一个结点,称之为头结点,它指向表中第一个结点。头结点的数据域可 以不存储任何信息,也可存储如线性表的长度等类的附加信息,头结点的指针域存储指向第一个结点的指针。在单链表中,取得第 I 个数据元素必须从头指针出发寻找,因此,链表是非随机存取的存储结构。

  • 循环链表 以上提到的链表指针域只包括一个指针,指向下一个数据的地址,如果我们将链表最后一个结点指针域的指针指向链表的头结点地址,就构成了一个环状的存储结构,我们称作循环链表。
  • 双向链表 当然我们可以给每个结点的指针域再添加一个指针,使其指向前一个数据结点的地址,这样就构成了双向链表,而将头结点的前一个结点指向尾结点,同时将尾结点的下一个结点指向头结点就构成了双向循环链表。

如果链表的尾结点的指针域指向了该链表之前的任意一个结点,我们称该链表为有环链表。环形链表就是其中一个特例 常见操作:

插入(O(n))、删除(O(n))、查找、排序、分解、合并、复制(O(n))、逆转

1.6 树和二叉树

  • 树 树是一种简单的非线性结构。在树这种数据结构中,所有数据元素之间的关系具有明显的层次特性。 在树结构中,每一个结点只有一个前件,称为父结点。没有前件的结点只有一个,称为树的根结点,简称树的根。每一个结点可以有多个后件,称为该结点的子结点。没有后件的结点称为叶子结点。 在树结构中,一个结点所拥有的后件的个数称为该结点的,所有结点中最大的度称为树的度。树的最大层次称为树的深度。
  • 二叉树 每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。 二叉树性质
  1. ···
  2. ···
  3. 完全二叉树和满二叉树
  • 二叉树的储存结构 与线性链表类似,用于存储二叉树中各元素的存储结点也由两部分组成:数据域和指针域。但在二叉树中,由于每一个元素可以有两个后件(即两个子结点),因此,用于存储二叉树的存储结点的指针域有两个:一个用于指向该结点的左子结点的存储地址,称为左指针域;另一个用于指向该结点的右子结点的存储地址,称为右指针域
  • 二叉树的遍历 二叉树的遍历是指不重复地访问二叉树中的所有结点。二叉树的遍历可以分为以下三种:
  1. 前序遍历(DLR): 若二叉树为空,则结束返回。否则:首先访问根结点,然后遍历左子树,最后遍历右子树;并且,在遍历左右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
  2. 中序遍历(LDR): 若二叉树为空,则结束返回。否则:首先遍历左子树,然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。
  3. 后序遍历(LRD): 若二叉树为空,则结束返回。否则:首先遍历左子树,然后遍历右子树,最后访问根结点,并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。

1.7 查找

  1. 顺序查找与二分查找
  • 顺序查找 从表中的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者相符,查到所要找的元素为止。否则就是表中没有要找的元素,查找不成功。
  • 二分查找 先确定待查找记录所在的范围,然后逐步缩小范围,直到找到或确认找不到该记录为止。注意二分法应用的前提是有顺序储存结构的有序表
  1. 基本排序算法
  • 交换类排序
  • 选择类排序
  • 插入类排序

二 程序设计基础

2.1 程序设计方法与风格

程序的设计风格强调清晰第一,效率第二

代码语言:javascript
复制
w=input('please input your weight/Kg: ')#输入用户体重和身高
h=input('please input your height/m: ')
weight=float(w)#input函数默认为输入字符串,因此需要转化为浮点数
height=float(h)
bmi=round((weight/height**2),2)#计算公式,同时用round函数控制小数位
#bmi_str=str(bmi)
#print('your BMI value is :'+bmi_str)#两种不同的输出字符串和数字组合的方法
print ("your BMI value is : ",bmi)
if bmi<18.5:#循环过程中依然强调冒号和缩进
    print('you are too light!')#注意python语言不能层层缩进
elif bmi<25:
    print ('you are very healthy!')
elif bmi<28:
    print('you are over weight.')
elif bmi<32:
    print('you are obesity.')
else :
    print('Severe obesity!!!')

需要考虑到的因素:

  1. 源程序的文档化
  • 符号化的命名
  • 程序的注释:包括序言性注释和功能性注释
  • 视觉组织:利用空格、空行、缩进使得代码层次更为清晰
  1. 数据说明
  • 数据说明的次序规范化;
  • 说明语句中变量安排有序化;
  • 使用注释来说明复杂数据的结构。
  1. 语句的结构
  • 在一行内只写一条语句;
  • 程序编写应优先考虑清晰性
  • 避免过多的临时变量,提高可读性;
  • 尽量使用库函数;
  • 尽量实现模块化,且保持模块功能单一;
  1. 输入和输出

2.2 结构化程序设计

  1. 自顶向下:程序设计时,应先考虑总体,后考虑细节;先考虑全局目标, 后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设 计,逐步使问题具体化。
  2. 逐步求精:对复杂问题,应设计一些子目标作过渡,逐步细化。
  3. 模块化:一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程 序要解决的总目标分解为分目标,再进一步分解为具体的小目标,把每个小目标 称为一个模块。
  4. 限制使用 goto 语句:以免造成程序流程的混乱,使理解和调试程序都产生困难
基本结构
  • 顺序结构:一种简单的程序设计,即按照程序语句行的自然顺序,一条语句 一条语句地执行程序,它是最基本、最常用的结构。
  • 选择结构:又称分支结构,包括简单选择和多分支选择结构,可根据条件, 判断应该选择哪一条分支来执行相应的语句序列。
  • 重复结构:又称循环结构,可根据给定的条件,判断是否需要重复执行某一 相同的或类似的程序段。

2.3 面向对象的程序设计方法,对象,方法,属性及继承与多态性

客观世界中任何一个事物都可以被看成是一个对象,面向对象方法的本质就是主 张从客观世界固有的事物出发来构造系统,提倡人们在现实生活中常用的思维来 认识、理解和描述客观事物,强调最终建立的系统能够映射问题域。也就是说, 系统中的对象及对象之间的关系能够如实地反映问题域中固有的事物及其关系。 面向对象方法的主要优点:

  • 与人类习惯的思维方法一致;
  • 稳定性好;
  • 可重用性好;
  • 易于开发大型软件产品;
  • 可维护性好

面向对象的程序设计主要考虑的是提高软件的可重用性。

对象

一个对象由对象名、属性和操作三部分组一个对象由对象名、属性和操作三部分组成 1) 对象是面向对象方法中最基本的概念,可以用来表示客观世界中的任何实体,对象是实体的抽象。面向对象的程序设计方法中的对象是系统是构成系统的一个基本单位,由一组表示其静态特征的属性和它可执行的一组操作组成。对象是属性和方法的封装体。 2) 属性即对象所包含的信息,它在设计对象时确定,一般只能通过执行对象的操作来改变。 3) 操作描述了对象执行的功能,操作也称为方法或服务。操作是对象的动态属性。

对象的特点

1)标识惟一性。指对象是可区分的,并且由对象的内在本质来区分,而不是 通过描述来区分; 2)分类性。指可以将具有相同属性的操作的对象抽象成类; 3)多态性。指同一个操作可以是不同对象的行为; 4)封装性。从外面看只能看到对象的外部特性,即只需知道数据的取值范围 和可以对该数据施加的操作,根本无需知道数据的具体结构以及实现操作的算 法。对象的内部,即处理能力的实行和内部状态,对外是不可见的。从外面不能 直接使用对象的处理能力,也不能直接修改其内部状态,对象的内部状态只能由 其自身改变。通过对象的封装性可以实现信息隐蔽。 5)模块独立性好。对象是面向对象的软件的基本模块,它是由数据及可以对 这些数据施加的操作所组成的统一体,而且对象是以数据为中心的,操作围绕对 其数据所需做的处理来设置,没有无关的操作。从模块的独立性考虑,对象内部 各种元素彼此结合得很紧密,内聚性强。

其他

1)类是指具有共同属性、共同方法的对象的集合。所以类是对象的抽象,对象是对应类的一个实例。 2)消息是一个实例与另一个实例之间传递的信息。消息的组成包括: 接收消息的对象的名称; 消息标识符,也称消息名; 零个或多个参数* P.S. 在面向对象方法中,一个对象请求另一个对象为其服务的方式是通过发送消息。 3)继承是指能够直接获得已有的性质和特征,而不必重复定义他们。继承分单继承和多重继承。单继承指一个类只允许有一个父类,多重继承指一个类允许有多个父类。

三 软件工程基础

3.1 软件工程基本概念,软件生命周期概念,软件工具与软件开发环境

软件

计算机软件是包括程序、数据及相关文档的完整集合 1)软件是一种逻辑实体,而不是物理实体,具有抽象性; 2)软件的生产与硬件不同,它没有明显的制作过程; 3)软件在运行、使用期间不存在磨损、老化问题; 4)软件的开发、运行对计算机系统具有依赖性,受计算机系统的限制,这导致了软件移植的问题; 5)软件复杂性高,成本昂贵;

软件工程

软件工程是应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序。 软件工程的主要思想是将工程化原则运用到软件开发过程,它包括 3 个要素:方法、工具和过程。方法是完成软件工程 项目的技术手段;工具是支持软件的开发、管理、文档生成;过程支持软件开发的各个环节的控制、管理。

软件生命周期

*软件产品从提出、实现、使用维护到停止使用退役的过程。*软件生命周期分为软件定义、软件开发及软件运行维护三个阶段: 1)软件定义阶段:包括制定计划和需求分析。 制定计划:确定总目标;可行性研究;探讨解决方案;制定开发计划。 需求分析:对待开发软件提出的需求进行分析并给出详细的定义。 2)软开发阶段: 软件设计:分为概要设计和详细设计两个部分。 软件实现:把软件设计转换成计算机可以接受的程序代码。 软件测试:在设计测试用例的基础上检验软件的各个组成部分。 3)软件运行维护阶段:软件投入运行,并在使用中不断地维护,进行必要的扩 充和删改。

软件开发工具

软件开发工具的完善和发展将促使软件开发方法的进步和完善,促进软件开发的高速度和高质量。软件开发工具的发展是从单项工具的开发逐步向集成工具发展的,软件开发工具为软件工程方法提供了自动的或半自动的软件支撑环境。同时,软件开发方法的有效应用也必须得到相应工具的支持,否则方法将难以有效的实施。

软件开发环境

软件开发环境(或称软件工程环境)是全面支持软件开发全过程的软件工具集合。计算机辅助软件工程(CASE,Computer Aided Software Engineering)将各种软件工具、开发机器和一个存放开发过程信息的中心数据库组合起来,形成软件工程环境它将极大降低软件开发的技术难度并保证软件开发的质量。

3.2 结构化分析方法,数据流图,数据字典,软件需求规格说明书

结构化方法的核心和基础是结构化程序设计理论包括1)结构化需求分析方法;2)面向对象的分析方法。 结构化分析方法的实质:着眼于数据流,自顶向下,逐层分解,建立系统的处理流程,以数据流图数据字典判定树为主要工具,建立系统的逻辑模型。

数据流图

以图形的方式描绘数据在系统中流动和处理的过程,它反映了系统必须完成的逻辑功能,是结构化分析方法中用于表示系统逻辑模型的一种工具。

数据流图示例

加工(转换):输入数据经加工变换产生输出。(圆形) 数据流:沿箭头方向传送数据的通道,一般在旁边标注数据流名。(箭头) 存储文件(数据源):表示处理过程中存放各种数据的文件。(双下划线) 源,潭:表示系统和环境的接口,属系统之外的实体。(方框)

数据字典

对所有与系统相关的数据元素的一个有组织的列表,以及精确的、严格的定义,使得用户和系统分析员对于输入、输出、存储成分和中间计算结果有共同的理解。

  • 数据字典的作用是对数据流图中出现的被命名的图形元素的确切解释。
  • 数据字典是结构化分析方法的核心。

3.3 结构化设计方法,总体设计与详细设计

软件设计基础

结构设计:定义软件系统各主要部件之间的关系。 数据设计:将分析时创建的模型转化为数据结构的定义。 接口设计:描述软件内部、软件和协作系统之间以及软件与人之间如何通信。 过程设计:把系统结构部件转换成软件的过程性描述。从工程角度来看,软件设计分两步完成,即概要设计和详细设计。 概要设计:又称结构设计,将软件需求转化为软件体系结构,确定系统级接口、全局数据结构或数据库模式。 详细设计:确定每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节

基本原理

软件设计的基本原理包括:抽象、模块化、信息隐蔽和模块独立性。 1)抽象:一种思维工具,就是把事物本质的共同特性提取出来而不考虑其他细节。 2)模块化:解决一个复杂问题时自顶向下逐步把软件系统划分成一个个较小的、相对独立但又不相互关联的模块的过程。 3)信息隐蔽:每个模块的实施细节对于其他模块来说是隐蔽的。 4)模块独立性:软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他的模块的接口是简单的。 模块的耦合性内聚性是衡量软件的模块独立性的两个定性指标。

总体设计

软件概要设计的基本任务是:1)设计软件系统结构;2)数据结构及数据库设计; 3)编写概要设计文档;4)概要设计文档评审。

详细设计

详细设计是为软件结构图中的每一个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和数据结构的细节。

3.4 软件测试的方法,白盒测试与黑盒测试,测试用例设计,软件测试的实施,单元测试、集成测试和系统测试

使用人工或自动手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。

软件测试方法
  • 静态测试:包括代码检查、静态结构分析、代码质量度量。不实际运行软件,主要通过人工进行。
  • 动态测试:是基于计算机的测试,主要包括白盒测试方法和黑盒测试方法。
白盒测试

白盒测试方法也称为结构测试或逻辑驱动测试。它是根据软件产品的内部工作过程,检查内部成分,以确认每种内部操作符合设计规格要求。 白盒测试的基本原则:保证所测模块中每一独立路径至少执行一次;保证所测模块所有判断的每一分支至少执行一次;保证所测模块每一循环都在边界条件和一般条件下至少各执行一次;验证所有内部数据结构的有效性。

黑盒测试

黑盒测试方法也称为功能测试或数据驱动测试。黑盒测试是对软件已经实现的功能是否满足需求进行测试和验证。黑盒测试主要诊断功能不对或遗漏、接口错误、数据结构或外部数据库访问错误、性能错误、初始化和终止条件错误。黑盒测试不关心程序内部的逻辑,只是根据程序的功能说明来设计测试用例

测试用例

测试用例是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。一个好的测试用例能找到迄今为止尚未发现的错误。

  • 单元测试
  • 集成测试
  • 确认测试
  • 系统测试 四种测试方法详细解释

3.5 程序的调试,静态调试与动态调试

程序调试的任务是诊断和改正程序中的错误,主要在开发阶段进行,调试程序应该由编制源程序的程序员来完成。程序调试的基本步骤: (1)错误定位;(2)纠正错误;(3)回归测试(防止引入新的错误) 静态调试:程序在运行到某一个状态的时候,让它暂停,用工具查看程序此时的运行信息,比如某个变量的数值;查看完成后,让程序继续运行,恢复到正常的工作。 动态调试:在程序中,添加日志信息(log),在程序运行的时候,将log指定的信息输出到调试的电脑上。整个过程不会打断程序的运行。

四、 数据库设计基础

4.1 数据库的基本概念:数据库,数据库管理系统,数据库系统

数据库(database)

数据的集合,具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序所共享。数据库存放数据是按数据所提供的数据模式存放的,具有集成与共享的特点,亦即是数据库集中了各种应用的数据,进行统一的构造和存储,而使它们可被不同应用程序所使用。

数据库管理系统(DBMS)

一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等,是数据库的核心。

数据库系统(DBS)

由数据库(数据)、数据库管理系统(软件)、数据库管理员(人员)、硬件平台(硬件)、软件平台(软件)五个部分构成的运行实体。

4.2 数据模型,实体联系模型及 E-R 图,从 E-R 图导出关系数据模型

数据模型的概念:是数据特征的抽象,它从抽象层次上描述了系统的静态特征、动态行为和约束条件,为数据库系统的信息表示与操作提供一个抽象的框架。主要内容包括: 1)数据结构:数据结构是所研究的对象类型的集合,包括与数据类型、内容、性质有关的对象,以及与数据之间联系有关的对象。它用于描述系统的静态特性。 2)数据操作:数据操作是对数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作的含义、符号、操作规则及实现操作的语句等。它用于描述系统的动态特性。 3)数据的约束条件:数据的约束条件是一组完整性规则的集合。完整性规则是给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符号数据模型的数据库状态及状态的变化,以保证数据的正确、有效和相容。

实体联系模型及 E-R 图

1)实体:现实世界中的事物。(矩形) 2)属性:事物的特性。(椭圆形) 3)联系:现实世界中事-间的关系。(菱形)

示例

数据库管理系统常见的数据模型有层次模型、网状模型和关系模型三种。

4.3 关系代数运算,包括集合运算及选择、投影、连接运算,数据库规范化理论

关系代数

1、关系的数据结构 关系是由若干个不同的元组所组成,因此关系可视为元组的集合。n 元关系是一个 n 元有序组的集合。 关系模型的基本运算:1)插入;2)删除;3)修改;4)查询(包括投影、选择、笛卡尔积运算)。 2、关系操纵 关系模型的数据操纵即是建立在关系上的数据操纵,一般有查询、增加、删除和 修改四种操作。

集合运算及选择、投影、连接运算

(1)并(∪):关系 R 和 S 具有相同的关系模式,R 和 S 的并是由属于 R 或属于 S 的元组构成的集合。 (2)差(-):关系 R 和 S 具有相同的关系模式,R 和 S 的差是由属于 R 但不属于 S 的元组构成的集合。 (3)交(∩):关系 R 和 S 具有相同的关系模式,R 和 S 的交是由属于 R 且属于 S 的元组构成的集合。 (4)广义笛卡尔积(×):设关系 R 和 S 的属性个数分别为 n、m,则 R 和 S 的广义笛卡尔积是一个有(n+m)列的元组的集合。每个元组的前 n 列来自 R 的一个元组,后m 列来自 S的一个元组,记为 R×S。

4. 数据库设计方法和步骤:需求分析、概念设计、逻辑设计和物理设计的相关策略

数据库设计阶段包括:需求分析、概念分析、逻辑设计、物理设计。 数据库设计的每个阶段都有各自的任务: 1)需求分析阶段:这是数据库设计的第一个阶段,任务主要是收集和分析数据,这一阶段收集到的基础数据和数据流图是下一步设计概念结构的基础。 2)概念设计阶段:分析数据间内在语义关联,在此基础上建立一个数据的抽象模型,即形成 E-R 图。(数据库概念设计的过程包括选择局部应用、视图设计和视图集成) 3)逻辑设计阶段:将 E-R 图转换成指定 RDBMS 中的关系模式。 4)物理设计阶段:对数据库内部物理结构作调整并选择合理的存取路径,以提高数据库访问速度及有效利用存储空间。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131839.html原文链接:https://javaforall.cn