【专业课学习】《数据库原理》第十章习题

181 阅读11分钟

108982453_p0 (1).jpg

10.1 解释下列名词:

(1)数据库设计

针对实际应用,设计规范优化的逻辑模型和物理结构,进而建立相应的数据库及其应用系统,从而科学有效地管理数据,满足用户的应用需求。

(2)数据字典(Data Dictionary, Metadata Repository)

数据字典是数据库中数据的详细描述(文档)。

具体来说,它应包括如下内容:

  • 数据项:数据字典应给出数据库中涉及到的每个基本数据项(符合1NF规范的)及其描述、数据类型、长度、取值范围、取值意义、完整性约束等元数据(metadata)。例如customer_id = {description: "客户的编号"; type: char(4); range: ["C001", "C999"]; format: /^C[0-9]{3}$/; ["该属性作为表Cust的候选键(实体完整性)", "该属性作为表Buy的外键对应(参照完整性)"]}
  • 数据结构(Data Structures):描述不同的数据项是如何组织成一个完整实体的。例如customer_idcustomer_namecustomer_birthday等数据项组成了"客户"这个完整的实体。
  • 数据流(Data Flows):数据结构在系统内部传输的路径(什么数据结构、从哪来、到哪去...)。它蕴含在"数据存储"和"处理过程"描述之中。
  • 数据存储:即数据结构如何保存到数据库里去,及其存储的数据规模、存取频度及存取方式等必要需求说明。例如购书信息={description: "登记客户的购书信息"; from: [table_customers, table_books]; to: table_buys; outputDataStructure: [customer_id, book_id, buy_date]; dataVolume: 60000+条数据; accessFrequency: 100记录/秒;accessMethod: "Random Access"}
  • 处理过程(Processing):给定处理具体数据的方法。例如图书销售利润计算={description: "计算每一本图书的销售利润"; from: [table_books, table_buys];to: view_saleProfit;howToProcess: "根据图书表得到每本书的进价和售价,根据购买表得到每本书卖出多少本,以计算出每本图书的销售利润"}。
(3)游标(Cursor)

在数据库编程中,游标是一种数据库查询的控制结构,它允许逐条处理查询结果集中的数据。游标可以被想象成是一个指向结果集中某一行的指针。通过游标,程序可以一次读取一个数据行,对数据进行处理,然后再移动到下一个数据行。

以下通过一个具体的例子来对游标的概念进行具体说明。

在如下的伪代码中,我们尝试逐个读取某张名为Employees的表中的每一行数据。这时,我们就需要借助游标来实现这个操作。

import some_database_module

# 创建数据库连接和游标
conn = some_database_module.connect("127.0.0.1:2024", "username", "password")
cursor = conn.cursor()

# 执行 SQL 语句来声明和打开游标
createCursorSQL = """
    declare @name char(10), @position char(20);
    declare employee_cursor cursor for 
        select name, position from Employees;
    open employee_cursor;
"""
cursor.execute(createCursorSQL)

# 获取数据
cursor.execute("fetch next from employee_cursor into @name, @position")
result = cursor.fetchone()

while result:
    name, position = result
    print(f"Name: {name}, Position: {position}")
    cursor.execute("fetch next from employee_cursor into @name, @position")
    result = cursor.fetchone()

# 关闭游标和连接
cursor.close()
conn.close()

需要指出的是,游标的具体行为取决于具体的DBMS及其配置。实际上在创建游标时,若DBMS开启了"立即检索所有结果"或类似的模式,那么它就可能会依照select语句中的内容直接查询出多条甚至全部符合条件的记录,并加载进其内存缓冲区中。

在这种情况下,在每次通过fetch移动游标获取下一行数据时,只不过是请求DBMS从该缓冲区中提取出下一行数据,并将其作为一个元组或对象返回给我们的应用程序罢了,而非我们直观上理解的"逐行查询"。

(4)SQLCA(SQL Communication Area, SQL通信区)

SQLCA是一个在执行SQL语句时被维护的数据结构。它用于存放执行SQL语句后需要反馈给应用程序的信息,如操作是否成功,影响的行数等。

SQLCA通常用于传统的嵌入式SQL编程,比如在C程序中嵌入SQL指令时。但是在很多现代的编程环境中,如Python或Java,这种细节通常被抽象掉,程序员不需要直接与SQLCA交互。

以下是一个便于理解SQLCA作用的伪代码

#include <sqlca.h>
// 其他头文件...

int main() {
  sqlconn("127.0.0.1:2024", "username", "password");
  // 初始化sqlca
  sqlca_init();
  // 执行sql语句
  int ret = sqlexec("select * from customers");
  // 检查sqlcode以确定sql命令是否执行成功
  if (sqlca.sqlcode != 0) {
    printf("SQL error: %s\n", sqlca.sqlerrmc);
    return -1;
  }
  sqlclose();
  return 0;
}
(5)ODBC(Open Database Connectivity)

ODBC提供了一种标准的API方法来访问DBMS。这些API利用SQL来完成其大部分任务。

(6)JDBC(Java DataBase Connectivity)

它是Java程序访问DBMS的标准接口。 使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。

(7)物理结构

物理结构即指数据库的内模式(Internal Schema),它指的是数据库在存储介质上的存储结构和存放位置。

10.2 简述数据库设计的方法和步骤。

数据库设计方法:手工经验法、E-R图法、3NF法、面向对象设计法、统一建模语言UML。

数据库设计步骤(新奥尔良法):

  • (1)需求分析。分析和确定用户的应用需求。需求分析是基础。设计的主要结果是数据字典
  • (2)概念结构设计。数据库设计的关键。根据需求分析的结果,对用户需求进行综合、归纳和抽象,并设计概念模型的过程。概念结构是桥梁。设计结果是E—R图
  • (3)逻辑结构设计。把概念结构转换为DBMS支持的逻辑模型,并对其进行优化。逻辑结构设计是核心。设计结果是规范化的关系模式的集合
  • (4)物理结构设计。为逻辑模型设计合理的物理应用环境。设计内容是存储结构和存取方法。
  • (5)系统实施。利用DBMS和主语言等,根据逻辑结构和物理结构,建立数据库,设计应用程序。设计结果是数据库和应用系统。
  • (6)运行和维护。数据库及其应用系统投入运行,并对其进行评价和维护

10.3 简述需求分析的方法和步骤。

需求分析方法:跟班、座谈、专人介绍、询问、调查表和工作日志。

需求分析步骤: (1)调查组织机构。 (2)调查部门业务活动。 (3)明确用户和系统的要求。 (4)分析表达用户需求,确定系统边界。 (5)建立数据字典,撰写需求分析文档。

10.5 简述概念结构设计的方法和步骤。

概念结构设计方法:

  • 自底向上(子需求→局部概念结构→全局概念结构)
  • 自顶向下(倒过来)、
  • 逐步扩张(核心需求→核心概念结构, 核心概念结构+局部概念结构→全局概念结构)
  • 混合策略(混合使用前几种策略)。

概念结构设计步骤:

  • 概念模型的抽象(数据字典→属性、实体、联系
  • 局部 E-R 图设计
  • 全局E-R图设计(把局部E-R图集成为全局E-R图)
  • 概念结构的优化

10.6 简述全局E-R图的集成方法及其冲突。

集成方法:

  • 整体集成法:一次性集成所有局部E-R图,适合中小型应用
  • 逐步集成法:先集成核心功能的局部E-R图,再集成其他,适合大型应用。

集成冲突:

  • 属性冲突:例如在不同的局部E-R图中,客户性别的域分别为{男,女}和{T,F}
  • 命名冲突:例如相同名称的实体在不同的E-R图中具有不同的含义
  • 结构冲突:同一个实体所包含的属性不同,例如在一张局部E-R图中客户实体包含属性{户号,姓名,年龄},而在另一张图中客户实体包含属性{户号,姓名,电话,QQ}

10.7 简述逻辑结构设计的内容。

(1)概念模型向逻辑模型的转换,即E-R图向关系模式(数据表)的转换

(2)逻辑模型完整性设计,即关系模式的完整性设计

(3)逻辑模型规范化,即关系模式的规范化和优化

(4)外模式设计,即面向用户的子模式设计及其视图实现

10.8 简述物理结构设计的内容。

  1. 存取方法(Access Method, 例如为数据表设置索引索引以实现随机访问)
  2. 存储结构(Storage Structure, 数据及其逻辑结构在计算机中的表示形式,例如以B+树的形式来布局实际的数据库物理文件结构)
  3. 存放位置(放在哪个硬盘的哪个目录下)
  4. 存储介质(机械硬盘还是固态硬盘...)
  5. 评价物理结构设计是否合理

10.9 解释聚簇索引(Clustered Index),简述聚簇索引与非聚簇索引的区别。

聚簇索引:数据库中一种特殊类型的索引,它直接影响数据在磁盘上的物理存储。在使用聚簇索引的数据库表中,行数据实际上是按照索引键(即聚簇索引列)的顺序存储的。这意味着聚簇索引决定了数据的物理排序

下面是一个具体的例子,以加深对聚簇索引的理解:

假设你有一个学生信息表,包含学生ID、姓名、年龄和班级等信息。如果你按照学生ID创建聚簇索引,那么学生记录会按照学生ID的顺序物理存储在磁盘上。当你查询特定ID的学生信息时,数据库可以快速定位到这个学生的数据,因为数据是顺序存储的。

聚簇索引与非聚簇索引区别:

  • 前者的顺序与数据的物理存储顺序一致;后者的顺序与数据物理顺序无关。
  • 一个关系只能有一个聚簇索引;非聚簇索引则可以有多个。
  • 维护前者的开销较大、灵活性差,但查找时访问速度更快;维护后者的开销较小、灵活性好,但查找时由于需要进行额外的跳转,查找时访问速度稍慢。
  • 前者适合于更新较少的应用,而后者则适合于更新较多的应用。
  • 前者适用于经常需要大范围扫描的列(主键);后者适用于需要快速查找少量特定记录的情况,尤其是当这些列不是表的主要查询列时。
  • 前者B+树的叶节点就是数据节点;后者B+树的叶节点是索引节点,其指针指向对应的元组(数据块)。

ClusteredIndexTable-2048x997.png

10.10 对于嵌入式SQL,如何区分SQL语句和主语言语句?

在嵌入式SQL中,SQL语句通常会被特定的标记或关键字包围,这样编译器或预处理器就可以区分SQL语句和宿主语言(比如C语言)的语句。

对于C语言中的嵌入式SQL,通常使用EXEC SQL前缀来开始一个SQL语句。这样的语句告诉预处理器,随后的内容是需要被特别处理的SQL语句。预处理器会识别这些SQL语句,并将它们转换成相应的C语言调用数据库访问库的代码。

下面是一个区分嵌入式SQL语句与C语句的例子:

#include <stdio.h>
#include <sqlca.h>

int main() {
    /* C 语言变量声明 */
    EXEC SQL BEGIN DECLARE SECTION;
    int customer_id;
    char account_name[30];
    EXEC SQL END DECLARE SECTION;
    /* 嵌入式SQL语句,以 EXEC SQL 开头 */
    EXEC SQL CONNECT TO my_database USER my_user USING my_password;
    EXEC SQL SELECT account_name INTO :account_name FROM accounts 
        WHERE id = :customer_id;
    /* C 语言语句打印查询到的账户名 */
    printf("Account Name: %s\n", account_name);
    /* 关闭数据库连接 */
    EXEC SQL COMMIT WORK RELEASE;
    return 0;
}

10.11 解释系统评价。简述系统评价的内容。

系统评价:通过对系统运行过程和绩效的审查,检查系统功能和性能是否达到预期的目标, 是否充分利用了系统的各种资源,管理工作是否完善,并且给出系统调整和改进的建议。

内容:目标与功能评价、性能评价、经济效益评价和撰写评价报告等。

10.12 简述数据库维护的内容。

实际上这个问题与第一章介绍的DBA的职责是重复的。