目录:
一、程序设计基础
1.1程序设计方法与风格
程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。
Wirth公式:程序=算法+数据结构
常用的程序设计方法有结构化设计方法和面向对象的程序设计方法。
程序设计方法与风格是指在进行软件开发时,设计和编写程序的一种方法和风格。它包括了一系列的规范和准则,将程序设计和实现分解为一系列的步骤和技术,以确保程序的可读性、可维护性和可重用性。
常见的程序设计方法和风格包括:
结构化程序设计:结构化程序设计通过将程序划分为模块、函数或子程序,并使用控制结构如顺序、选择和循环来组织代码,提高程序的可读性和模块化程度。
面向对象程序设计:面向对象程序设计通过将程序划分为对象,并使用类、继承、封装和多态等特性来组织代码,提高代码的可重用性和扩展性。
基于组件的程序设计:基于组件的程序设计通过将程序划分为独立的组件,并使用接口和消息传递等机制来组织和通信各个组件,提高代码的可重用性和灵活性。
泛型程序设计:泛型程序设计通过使用参数化类型和算法模板,实现了算法和数据结构的通用性,提高了代码的复用性和效率。
命令式程序设计:命令式程序设计是指通过一系列命令和语句来描述程序的执行过程,具有明确的顺序和控制流程。
声明式程序设计:声明式程序设计是指通过描述问题的性质和约束条件,而不是具体的解决方法,来实现程序的功能。
在选择程序设计方法和风格时,需要根据项目的需求和特点进行综合考虑,选择适合的方法和风格,以提高程序的质量和开发效率。同时,还需要遵循编程规范和最佳实践,以保证代码的一致性和可维护性。
程序设计的风格
程序设计风格指一个人编制程序时所表现出来的特点、习惯和逻辑思路等。
为了程序的测试和维护,要求编写的程序不仅需要程序员自己能看懂,而且也要让别人能看懂。
除非对效率有特殊要求,程序编写要做的清晰第一,效率第二。
要形成良好的程序设计风格,程序设计时要注重以下四点:
源程序文档化 符合名的命名应该有实际的含义;程序中要有注释,要有适当的空格、空行和缩进等,便于阅读和理解。 数据说明规范化 应规范数据说明的顺序,使数据的属性易于查找;一个语句说明多个变量时,各变量应该按字母顺序排列。 语句结构简明化 语句结构应该简单直接,不能为追求效率而使语句复杂化,为了便于阅读和理解,理论上应该一行一个语句;不同层次的语句采用缩进形式,使程序的逻辑结构和功能特征更加清晰;要避免复杂的判定条件,避免多重的循环嵌套。 输入和输出合理化 系统能否被用户接受,往往取决于输入和输出的风格,所以输入、输出的方式和格式应尽可能方便用户的使用。
1.2结构化程序设计
结构化程序设计是一种编程方法论,旨在使程序的结构更加清晰、可读性更高、易于维护。它强调使用特定的结构和规则来组织和安排程序的逻辑流程。
结构化程序设计的主要原则包括:
-
顺序结构:程序按照从上到下的顺序执行,每个语句都依次执行。
-
选择结构:根据条件选择不同的执行路径。常见的选择结构有if-else语句和switch语句。
-
循环结构:根据条件重复执行一段代码。常见的循环结构有for循环、while循环和do-while循环。
-
模块化设计:将程序分解为小的、独立的功能模块,每个模块负责完成一个具体的任务。这样可以提高代码的重用性和可维护性。
-
数据抽象:使用抽象数据类型来封装数据和操作,隐藏内部实现细节。这样可以提高代码的可靠性和可扩展性。
通过遵循这些原则,结构化程序设计可以帮助开发者编写出更可靠、可维护、可扩展的程序。它是许多编程语言和开发方法的基础。
结构化程序设计的四个原则:
自顶向下 自顶向下是指在程序设计时,应遵循先总体后细节,先全局后局部的原则。不要一开始就去追求众多的细节,应该先从总体开始设计,再逐步具体化各个细节。 逐步求精 对于一些比较复杂的问题,需要设计一些子目标作为过渡,将这个复杂的问题逐步细化。 模块化 模块化是把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,我们将这些小目标称为模块。 限制使用goto语句 随意使用goto语句很可能导致程序结构混乱,所以应尽量避免使用goto语句。
结构化程序设计的三大基本结构
结构化程序设计的三大基本结构为:顺序结构、选择结构、循环结构。
顺序结构 顺序结构是简单也是最常见的结构,它需要按照程序语句的顺序,从上到下依次执行程序语句。 选择结构 选择结构又称为分支结构,它包括简单选择结构和多分支选择结构。这种结构需要通过判定条件,分别执行不同的语句,最后输出结果。 循环结构 循环结构是根据某一判定条件,判断是否需要重复执行某一相同或类似的程序段。循环结构分为当型循环结构和直到型循环结构,当型循环结构是先判断后执行循环体,直到型循环结构是先执行循环结构再判断。两种循环结构。
1.3面向对象的程序设计
面向对象的程序设计是一种编程范式,它将程序中的数据和操作封装在对象中,并通过对象之间的消息传递来实现程序的功能。面向对象的程序设计的主要思想是将现实世界中的事物抽象成类,并通过类的实例来表示具体的对象。
在面向对象的程序设计中,每个对象都有自己的属性和行为。属性是对象的状态,行为是对象的操作。对象通过方法来定义和实现自己的行为。
面向对象的程序设计具有以下几个特点:
-
封装:将数据和操作封装在对象中,只对外暴露必要的接口,隐藏内部实现细节,提高代码的可维护性和可重用性。
-
继承:通过继承机制,子类可以继承父类的属性和行为,并可以在此基础上添加、修改或覆盖父类的行为,实现代码的复用和扩展。
-
多态:同一种行为具有多种不同的表现形式。通过多态机制,不同的对象可以对同一消息作出不同的响应。多态提高了代码的灵活性和可扩展性。
面向对象的程序设计可以提高程序的模块化程度,降低代码的耦合度,使程序更易于理解、维护和扩展。它是一种广泛应用的编程范式,被广泛应用于各种编程语言和开发领域。
面对对象的程序设计的五大优点:
面向对象方法的实质就是主张从客观世界固有的事物出发来构造系统,提倡用人类在现实生活中常用的思维方法来认识、理解和描述客观事物,强调最终建立的系统能够映射问题域。目前已成为主流的程序设计方法。
面向对象的程序设计的优点有:
- 与人类习惯的思维方法一致
- 稳定性好
- 可重用性好
- 易于开发大型软件产品
- 可维护性好
面向对象的程序设计的缺点:
面向对象的程序设计具有一些缺点,包括过度设计和复杂性、性能问题、内存占用量较大、代码的可读性和可理解性降低、以及灵活性和可扩展性受限。
面向对象的程序设计的五大基本要素
关于面向对象的程序设计,对其概念有许多不同的看法和定义,但是都涵盖了对象、类和实例、消息、继承、多态性五个基本要素。
1.对象
对象是面向对象方法中最基本的概念,对象可以用来表示客观世界中的任何实体。一个对象通常可由对象名、属性和操作三部分组成。
对象有以下五个特点:
标识唯一性 每个对象都有自身唯一的标识,通过这个标识,可找到相应的对象 分类性 指可以将具有相同属性和操作的对象抽象成类 多态性 指同一个操作可以是不同对象的行为 封装性 指从外面只能看到对象的外部特性,对象的内部对外是不可见 模块独立性好 由于完成对象功能所需的元素都被封装在对象内部,所以模块独立性好
2. 类和实例
具有共同属性、共同方法的对象的集合即为类。类是关于对象的抽象描述,描述了属于该对象类型的所有对象的性质。对象则是类的具体化,是类的实例。
3.消息
消息传递是对象间通信的手段,一个对象通过发送消息向另一个对象请求服务。
4.继承
继承是类之间共享属性和操作的机制,能够直接获得已有的性质和特征,不必重复地定义。即在已有的类(父类)基础上,定义新的类(子类),子类在继承了父类所有的特性后,还可以定义自己的特性。
继承分为单继承和多重继承,即一个子类可以有一个或多个父类。
继承具有传递性,如果类A继承类B,类B继承类C,那么类A继承类C。
5.多态性
对象根据所接收的消息做出动作,同样的消息被不同的对象接收时可能会导致完全不同的行动,该现象称为多态性。
二、软件工程基础
1.1软件工程的基本概念
软件工程基础指的是软件工程的基本概念、原理和方法论。在软件工程领域,软件工程基础是建立软件开发过程的基础,是进行软件开发工作的前提。
软件工程基础包括以下几个方面:
-
软件开发生命周期:软件开发生命周期包括需求分析、设计、编码、测试、部署和维护等阶段。软件工程基础需要了解每个阶段的目标、任务和方法。
-
需求工程:需求工程是软件开发过程的第一步,它涉及到识别用户需求、分析和规划需求、建立需求规格等。软件工程基础需要了解需求工程的方法和技术。
-
软件设计:软件设计是将需求转化为具体的软件设计方案,包括软件结构设计、接口设计和数据设计等。软件工程基础需要了解软件设计的原则和方法。
-
软件测试:软件测试是验证软件是否符合需求和规格的过程,包括单元测试、集成测试和系统测试等。软件工程基础需要了解软件测试的技术和方法。
-
软件项目管理:软件项目管理涉及到项目计划、进度控制、资源管理和风险管理等。软件工程基础需要了解软件项目管理的原则和方法。
软件工程基础还包括软件质量保证、软件配置管理、软件工程工具和软件开发团队管理等方面的知识。通过学习软件工程基础,可以帮助软件工程师更好地进行软件开发工作,提高软件开发的质量和效率。
软件
软件的定义
计算机软件与计算机系统的操作有关的程序、规程、规则及任何与之有关的文档和数据。
它由两部分组成:
一是机器可执行的——程序及其有关数据;
二是机器不可执行的——与软件开发、运行、维护、使用等有关的文档。
软件的特点:
- 软件是一种逻辑实体,具有抽象性。
- 软件的生产与硬件不同,它没有明显的制作过程。
- 软件在运行、使用期间不存在磨损、老化问题。
- 软件的开发、运行对计算机系统具有依赖性。
- 软件复杂性高,成本昂贵。
- 软件开发涉及诸多的社会因素。
软件危机
软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致在软件开发与维护过程中出现一系列严重问题的现象。
软件危机主要表现在以下几个方面:
- 成本超支:软件项目在开发过程中经常出现成本超支的情况,原因包括需求变更、开发进度延迟、技术问题等。
- 进度延迟:软件开发项目经常无法按时完成,导致项目延期。原因可能包括需求不明确、技术问题、人员不足等。
- 质量问题:软件开发过程中出现的质量问题会导致软件产品无法正常运行或存在安全漏洞。例如,程序错误、系统崩溃等。
- 缺乏可维护性:软件项目完成后,可能会面临维护和升级的需求。如果软件代码质量差、文档不完善等,会导致维护困难。
- 需求变更:软件开发过程中,客户需求可能会频繁变化。如果软件开发团队无法及时适应这些变化,就会导致项目失败。
- 人员不足:软件开发过程需要有足够的开发人员和技术人员支持,如果人员不足,就会导致项目进度延迟或质量问题。
- 技术问题:软件开发过程中可能会遇到技术难题,如果没有足够的技术解决方案或专业知识,就会导致项目失败。
软件工程
- 为了缓解软件危机,提出了软件工程的概念,并开辟了新的领域——软件工程学。
- 软件工程是应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序。
- 软件工程包括三个要素:方法、工具和过程。
- 方法是完成软件工程项目的技术手段。
- 工具用来支持软件开发、管理和文档生成。
- 过程用来支持软件开发的各个环节控制、管理。
软件过程
- 软件过程是指输入转化为输入的一组彼此相关的资源和活动。
- 软件过程通常包含以下4个基本活动:
- 软件规格说明:规定软件的功能和运行时的限制。
- 软件开发或软件设计与实现:开发出满足规则说明的软件。
- 软件确认:确认软件能够满足客户提出的要求。
- 软件演进:为满足客户变更要求,在使用的过程中,软件必须不断进行演进。
软件生命周期
软件的生命周期是指软件产品从提出、实现、使用维护到停止使用退役的过程。
软件生命周期可分为软件定义、软件开发和软件运行维护三个阶段。
软件生命周期是指软件从概念到废弃的整个过程。它包括需求分析、设计、编码、测试、部署、运维和最终终止使用等阶段。
需求分析阶段:确定软件的功能需求和性能要求,收集用户需求,编写需求规格说明书。
设计阶段:根据需求分析的结果,设计软件的架构、模块和界面等,编写设计文档。
编码阶段:根据设计文档,使用合适的编程语言和工具,将设计转化为可执行的代码。
测试阶段:对编码完成的软件进行功能测试、性能测试和安全测试等,发现并修复错误。
部署阶段:将软件安装部署到用户的计算机、服务器或云平台等,进行配置和集成。
运维阶段:对已部署的软件进行监控、维护和更新,确保其持续稳定运行。
终止使用阶段:当软件不再被需要时,可以进行软件升级、迁移、替换或废弃等操作。
软件生命周期管理可以帮助软件开发团队更好地组织和控制软件开发过程,提高开发效率和软件质量。
1.2需求分析
需求分析的目标是让软件系统确定要“做什么”,它是软件生命周期中的一个重要环节,目的是了解用户对软件在功能、性能和设计等方面的期望。
需求分析产生的主要文档是需求规格说明书。
需求分析阶段的主要工作:
阶段名称 | 主要工作内容 |
需求获取 | 确定对目标系统的各方面的需求 |
需求分析 | 对需求进行分析,得出解决方案和逻辑模型 |
编写需求规格说明书 | 需求规格说明书应重点描述软件目标,内容应包含软件的功能需求、外部接口、属性及约束条件等。 需求规格说明书为用户与开发人员之间的交流提供了方便,它是软件开发工作的基础和依据,也是软件验收的标准。它是需求分析的阶段成果。 |
需求评审 | 对需求分析阶段的工作进行评审,验收需求文档的一致性、可行性、完整性和有效性 |
需求分析的方法主要有结构化分析方法和面向对象的分析方法。
结构化分析方法
结构化分析方法是常用的需求分析方法,它着眼于数据流,自顶向下,逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具,建立系统的逻辑模型。
结构化分析方法常用的工具包括数据字典(DD)、数据流图(DFD)、判定树和判定表。其中最为常用的是数据字典和数据流图。数据字典是结构化分析的核心。
数据字典是指记录了数据库中各个数据表、字段以及其相关属性和定义的文档或文件。它是数据库设计的一部分,用于记录数据库中存储的数据的结构和含义,以及数据之间的关系。
数据流图是一种表示系统功能、过程和数据流动的图形化工具。它用于描述系统的输入、输出和处理流程,以及数据在系统内部的流动路径。
1.3软件设计
软件设计的基本概念
- 经过需求分析,软件系统确定了要“做什么”的目标,进而进入软件设计,来解决和确定“怎么做”的问题。软件设计可以认为是把软件需求转换为软件表示的过程。
- 软件设计是指设计和实现一个软件系统的过程。它涉及到对软件系统的需求分析、系统架构设计、模块设计、接口设计、数据库设计等方面的工作。
- 从工程管理角度看,软件设计分为概要设计和详细设计两步。
软件设计的基本原理
软件设计过程中应遵循软件过程的基本原理,软件设计的基本原理和有关概念可概括为:
抽象 抽象是人类认识复杂问题时使用的有效思维工具,它的原理是把事物的共同特性提取出来,并忽略它们的细节和差异 模块化 把一个待开发的软件分解成若干个小的、简单的部分,模块化是将软件系统自顶向下、逐步划分成若干模块的过程 信息隐藏 信息隐藏是指一个模块内包含的信息(过程或数据),对于不需要这些信息的其它模块来说是不能访问的。 模块的独立性 模块的独立性是指每一个模块仅完成一个相对独立的特定子功能,并且与其他模块之间的关系尽量简单。内聚性和耦合性是度量模块独立程度的两个标准。
内聚性是对一个模块内部各个元素之间彼此结合的紧密程度的度量。
耦合性是对模块之间相互连接的紧密程度的度量。
一个好的软件,应该尽量做到高内聚,低耦合。
概要设计
概要设计,又称为结构设计,将软件需求转化为软件体系结构,确定系统接口、全局数据结构和数据库模式。
概要设计的基本任务为:1.设计软件系统结构;
2.数据结果及数据库设计;
3.编写概要设计文档;
4.概要设计文档评审。
概要设计文档包含:1.概要设计说明书;
2.数据库设计说明书;
3.集成测试计划。
概要设计的工具
在概要设计阶段,常用的软件结构设计工具是结构图,也可以称为程序结构图或系统结构图。它是用来描述软件系统的层次和分块结构关系,反映整个系统的功能实现以及模块与模块之间的联系和通信的。
结构图是一种图形化表示系统、程序或组织结构的图表。它使用不同形状的图形和线条来表示不同的组成部分和它们之间的关系。结构图可以显示系统的层次关系、组织的架构、程序的模块和函数的调用关系等。它可以帮助人们更清晰地理解系统的组成和运行方式,方便系统设计、开发和管理。常见的结构图包括组织结构图、程序结构图、数据流程图、类图等。
结构图的几个概念 上级模块 调用其他模块的模块。 从属模块 被其他模块调用的模块。 扇入数 调用一个给定模块的模块个数,即调用上级模块的个数。 扇出数 一个模块直接调用的其他模块数,即调用下级模块的个数。 深度 表示控制的层数。 宽度 整体控制跨度的表示。 原子模块 树中位于叶子结点的模块。
详细设计
详细设计,又称为过程设计,是为每一个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和数据结构的细节。
详细设计常用的工具有:
图形工具:程序流程图、N-S图、PAD图、HIPO图
表格工具:判定表
语言工具:PDL(伪码)
1.4软件测试
软件测试的目的
- 软件测试的目的是为了发现程序中的错误,提高用户体验。
- 一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例;
- 一个成功的测试用例是发现了至今为止尚未发现的错误的测试。
软件测试的准则
- 所有测试都应追溯到需求。
- 严格执行测试计划,排除测试的随意性。
- 充分注意测试中的群集现象。
- 程序员应避免检查自己编写的程序。
- 穷举测试是不可能的。
- 妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。
软件测试的方法
从是否需要执行被测试软件的角度,可划分为静态测试和动态测试两种方法。
静态测试 利用人的逻辑思维优势去发现软件的逻辑设计和编码错误,并不实际运行软件。 动态测试 基于计算机的测试,是为了发现错误而执行程序的过程 从功能的角度,可划分为黑盒测试和白盒测试方法。
白盒测试也称为结构测试或逻辑驱动测试,黑盒测试也称为功能测试或数据驱动测试。
黑盒测试 它依据程序的需求和功能规格说明,检查程序的功能是否符合它的功能说明。不考虑内部结构。
黑盒测试的测试方法主要有等价类划分法、边界值分析法、错误推测法等。
白盒测试 它把测试对象看作是可见的盒子,依据程序的内部逻辑,对程序所有的逻辑路径进行测试。
白盒测试的测试方法主要有逻辑覆盖、基本路径测试等。
软件测试的步骤
单元测试——集成测试——确认测试——系统测试
- 单元测试:
- 在软件开发中,单元测试是一种测试方法,用于验证代码的功能是否正常。单元测试是指对软件中的最小可测试单元进行测试,通常是一个函数、方法或类的单独测试。单元测试的目的是确保软件的每个组成部分都能够独立地按照预期方式工作。单元测试通常由开发人员编写,并且是自动化测试的一部分。它可以帮助开发人员快速地发现和修复代码中的错误,提高代码的质量和可靠性。单元测试能够减少整体测试过程中的错误和问题,提高软件开发的效率和可维护性。
- 集成测试:
- 集成测试是软件开发过程中的一个阶段,用于测试已经开发的各个模块之间的集成情况。在集成测试阶段,开发人员将已经完成的模块进行整合,然后测试整个系统的功能和性能是否符合预期。
集成测试有以下几个目标:
验证模块之间的接口是否正确,确保各个模块可以正确地传递数据和信息。
检查整个系统的功能是否正常工作,包括各个模块的交互和协作。
测试系统的性能表现,包括响应时间、吞吐量等。
发现和解决集成问题,例如模块之间的冲突、数据传递错误等。
- 集成测试可以分为两种类型:自顶向下集成测试和自底向上集成测试。
- 自顶向下集成测试是先测试系统的高层模块,然后逐步向下测试低层模块,直到整个系统被完全集成。
- 自底向上集成测试是先测试系统的低层模块,然后逐步向上测试高层模块,直到整个系统被完全集成。
- 在集成测试中,常用的测试技术包括黑盒测试和白盒测试。
- 黑盒测试是基于系统的需求和功能规格进行测试,不考虑系统的内部实现细节。
- 白盒测试是基于系统的内部结构和实现细节进行测试,可以检查各个模块之间的数据流和控制流。
- 集成测试的结果可以用来评估系统的质量和稳定性,发现和修复潜在的问题,保证系统的正确性和可靠性。
1.5程序调试
- 程序调试的目的
- 程序调试的目的是诊断和改正程序中的错误。
- 在对程序进行了成功的测试之后,将进入程序的调试(通常称debug,即排错)。它与软件测试不同,软件测试是尽可能多地发现软件中的错误。先要发现软件的错误,然后借助于一定的调试工具去执行找出软件错误的位置并改正错误。软件测试贯穿整个软件生命周期,调试主要在开发阶段。
程序调试的基本步骤:
- 错误定位,确定错误的位置,找出错误的内在原因。
- 修改设计和代码,用以排除错误。
- 需要进行回归测试,防止引进新的错误。
程序调试的方法有:
强行排除法:传统方法,使用较多但效率较低。
回溯法:比较适用于规模较小的程序排错。
原因排错法:通过演绎、归纳和二分法来实现。
三、数据库设计基础
1.1数据库系统的基本概念
三个基本概念
- 数据库(DB):
长期存储在计算机内的、有组织的、可共享的数据集合。两大特点:集成、共享。
- 数据库系统(DBS):
是以数据库为核心运行的实体。包含数据库、数据库管理系统、数据库管理员、硬件平台、软件平台5个部分。
- 数据库管理系统(DBMS):
是数据库的管理工具,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等。
- 关系:数据库系统(DBS)包含数据库(DB)和数据库管理系统(DBMS),而数据库管理系统(DBMS)是数据库系统的核心。
数据库管理发展的三个阶段
人工管理阶段 文件系统阶段 数据库系统阶段 背景 软件背景 没有操作系统 文件系统 数据库管理系统 特点 数据管理者 人 文件系统 数据库管理系统 数据共享程度 无共享、冗余度大 共享性差、冗余度大 共享性大、冗余度小 数据独立性 不独立,完全依赖程序 独立性差 高度的物理独立性,一定的逻辑独立性 数据结构化 无结构 记录内有结构,整体无结构 整体结构化,用数据模型描述
数据库管理的特点
数据的集成性 数据库系统实现了整体数据的结构化。 数据的高共享性和低冗余性 数据的集成性使得数据可以被多个应用所共享,数据的共享又极大地减少了数据的冗余性。 数据独立性 数据的独立性是指数据与程序之间的相互不依赖性,一般分为物理独立性和逻辑独立性。 数据统一管理与控制 数据的完整性检查、数据的安全性保护和并发控制是统一管理数据的三个手段。数据的完整性检查用以确保数据的正确性;数据的安全性保护用以防止非法访问;并发控制用以控制多个应用的并发访问所产生的相互干扰,以保证其正确性。
数据库系统的体系结构
- 数据库系统的体系结构主要有三级模式和两级映射。
- 三级模式:
- 外模式(也称为子模式或用户模式,用户的数据视图)
- 概念模式(是全局数据逻辑结构的描述)
- 内模式(又称为物理模式,是数据物理结构和存储方式的描述)
- 两级映射:
- 外模式到概念模式的映射
- 概念模式到内模式的映射
- 一个数据库只有一个概念模式和一个内模式,但可以有多个外模式。
- 两级映射的提出,极大地提高了数据库的逻辑独立性和物理独立性。
1.2数据模型
数据模型的概念
- 数据模型是数据特征的抽象,从抽象层次上描述了系统的静态特征、动态行为和约束条件为数据库系统的信息表示与操作提供了一个抽象的框架。
- 数据模型的三要素是数据结构、数据操作和数据约束。
数据模型的类型
根据不同应用层次,将数据模型分为概念数据模型(简称为概念模型)、逻辑数据模型(简称为数据模型)和物理数据模型(简称为物理模型)三种类型。
类型 | 概念数据模型 | E-R模型 |
逻辑数据模型 | 层次模型 | |
网状模型 | ||
关系模型 | ||
物理数据模型 | —— |
E-R模型
E-R模型是被广泛使用的一种概念数据模型,也称为实体关系模型,是将现实世界的要求转化为实体、联系、属性等基本概念,以及它们之间的两种基本联系,并可以用E-R图直观地表示出来。
E-R模型三大基本概念:
实体:指客观存在并且可以相互区别的事务,是概念世界中的基本单位。
联系:指实体之间的对应关系,反映现实世界事物之间的相互关联。
属性:描述实体的特征,一个实体一般有多个属性。
实体间联系的个数可以是单个也可以是多个,一般将这种联系分为三种类型,分别是一对一(1:1)联系、一对多(1:m)联系和多对多(m:n)联系。
联系类型 | 案例 |
一对一(1:1) | 如院长和学校的联系,一个大学与一个院长一 一对应 |
一对多(1:m) | 如宿舍房间与学生的联系,一个宿舍房间有多个学生,一个学生只能属于某个宿舍房间。 |
多对多(m:n) | 如教师和学生的联系,一个教师可以教多个学生,一个学生又可以受教于多个老师。 |
层次模型
层次模型是逻辑数据模型的一种,是用树形结构来表示实体间联系的模型,这种模型的现实世界中很常见,例如家族关系结构图、职位结构等。它们都是自顶向下,层次分明的。
网状模型
网状模型是指用网络结构表示实体类型及其实体之间联系的模型,它是层次模型的拓展,各个从属级之间呈交叉的关系。允许一个结点可以有多个父结点,也允许一个或者多个结点没有父结点。
关系模型
关系模型是最常见的数据模型之一,它使用一张二维表来表示,简称表。
二维表一般满足下而7个性质:
- 元组个数有限性:二维表中元组个数是有限的:
- 元组的唯一性:二维表中元组均不相同:
- 元组的次序无关性: 元组的次序可以任意调换:
- 元组分量的原子性:元组的分量是不可分割的基本数据项:
- 属性名唯一性:二维表中属性名各不相同:
- 属性的次序无关性:属性与次序无关,可以任意交换:
- 分量值域的同一性:属性的分量具有与该属性相同的值城。
关系模型的完整性约束包括实体完整性约束,参照完整性约束和用户的完整性约束。
- 实体完整性约束:数据库完整性的最基本要求,它要求关系中主键的属性不能为空;
- 参照完整性约束:关系之间相关联的基本约束,它要求关系不能引用不存在的元组;
- 用户定义的完整性约束:由用户设置具体数据环境和应用环境的约束,它反映了具体应用数据的语义要求。
1.3关系代数
1.4数据库设计与管理
数据库设计一般采用生命周期法,分为需求分析、概念设计、逻辑设计和物理设计。
需求分析
(需求说明书)
概念设计
(概念数据模型,主要为E-R模型)
【用户数据模型,视图集成设计法——视图设计】
逻辑设计
(逻辑数据模型,主要为关系模型)
【DBMS模型,转换规则、规范化理论】
物理设计
(物理数据模型)
【DBMS条件支持,硬件、OS等】
逻辑设计阶段的主要任务是将E-R模型转换成关系模型。
E-R模型和关系模型的转换规则,如下表:
E-R模型 | 关系模型 |
实体 | 元组 |
属性 | 属性 |
联系 | 关系 |
实体集 | 关系 |
规范化理论(逻辑阶段) 规范化理论是数据库设计中的一个重要概念,它是指通过一系列的规范化步骤,将不符合特定范式要求的关系模式转化为符合范式要求的规范化模式。在逻辑设计阶段,规范化理论被广泛应用于关系数据库的设计和优化。规范化理论的目标是消除数据冗余和不一致性,提高数据库的逻辑结构。它将关系模式分解为多个更小的关系模式,每个模式都具有良好的结构和特定的功能。通过规范化,可以消除冗余数据,提高数据存储效率,并确保数据的一致性和完整性。
规范化理论一般包括以下几个范式:
-
第一范式(1NF):确保每个属性都是原子的,即不可再分。
-
第二范式(2NF):确保每个非主属性完全依赖于主键,并消除部分依赖。
-
第三范式(3NF):确保每个非主属性不传递依赖于主键,并消除传递依赖。
-
BCNF(巴斯-科德范式):消除主属性对于主键的部分依赖。
除了以上范式之外,还有更高级的范式如第四范式(4NF),第五范式(5NF)等,它们进一步消除关系模式中的冗余和依赖关系。
通过应用规范化理论,可以有效地设计出高效、灵活和易于维护的数据库模式,在逻辑设计阶段为数据库系统的实现和使用奠定坚实的基础。