数据库设计与开发 - 实验1 建立数据库

(高)斯(爱)慕棍哥

实验任务

  • 在华为云上购买ECS服务器,安装OpenGauss数据库
  • 在华为云上购买ECS数据库服务器
  • 使用VirtualBox安装 OpenEuler 虚拟机并连接到其中的OpenGauss数据库
  • 在OpenGauss数据库中创建数据库、数据表
  • 建立“学籍与成绩管理系统”表格;
    • 包含以下信息
      • 课程名称
      • 课程代号
      • 课程类型(必修、选修、任选)
      • 学分
      • 任课教师姓名
      • 教师编号
      • 教师职称
      • 教师所属学院名称
      • 教师所属学院代号
      • 教师所授课程
      • 学生姓名
      • 学生学号
      • 学生所属学院名称
      • 学生所属学院代号
      • 学生所选课程
      • 学生成绩
    • 建立表之间的参照关系
    • 建立适当的索引
    • 在实验三说明建立索引的原因

学籍与成绩管理系统表格设计如下

学生表设计

字段名字段含义字段类型字段长度NULL备注
xm姓名字符8
xh学号字符10PK
ydh所属学院代号字符2✓FK
bj班级字符8✓
chrq出生日期日期✓
xb性别字符2✓

课程表设计

字段名字段含义字段类型字段长度NULL备注
kcbh课程编号字符3PK
kcmc课程名称字符20
kclx课程类型字符2✓
xf学分数字5.1✓

教师表设计

字段名字段含义字段类型字段长度NULL备注
xm姓名字符8
jsbh教师编号字符10PK
zc职称字符6✓
ydh所属学院代号字符2✓FK

学院表设计

字段名字段含义字段类型字段长度NULL备注
ydh学院代号字符2PK
ymc学院名称字符30

授课表设计

字段名字段含义字段类型字段长度NULL备注
kcbh课程编号字符3PK,FK1
bh教师编号字符10PK,FK2

选课表设计

字段名字段含义字段类型字段长度NULL备注
xh学号字符10PK
kcbh课程编号字符3PK,FK1
jsbh教师编号字符10PK,FK1
ch成绩数字5.1✓

实验过程

购买ECS服务器,安装OpenGauss数据库

登录到华为云官网,使用课上注册的学生教育账号登录。进入"弹性云服务器"页面,选择"创建弹性云服务器"。

选择"按需计费"和"按量付费"的方式,选择"云服务器规格",选择"通用型",选择"2核4G"的配置, 网络类型选择按流量计费。 系统选择 Huawei EulerOS 2 操作系统。

选购ECS服务器
选购ECS服务器

购买之后修改密码, 查看服务器公网IP, 使用SSH登录到服务器。

SSH登录到服务器
SSH登录到服务器

登录之后, 建立OpenGauss数据库的安装目录 /opt/software/openGauss, 设置权限为 755 之后, 使用 wget 工具下载OpenGauss数据库安装包。

Warning
warning

实验教程中购买的服务器是鲲鹏的 ARM 芯片, 所以下载的 OpenGauss 安装包也是 ARM 架构的. 比较坑的是这个安装包在 x86 上基本能跑, 只有一些 Python 包的依赖问题; 安装好之后可执行文件 ELF 格式不对启动不起来, 到这时候我才意识到这一点, 只能遗憾重装系统 :(

下载OpenGauss数据库
下载OpenGauss数据库

根据ECS的名称和内网IP, 修改 cluster-config.xml 文件中的相关配置项.

编辑集群配置
编辑集群配置

使用 tar 命令解压安装包.

解压OpenGauss安装包
解压OpenGauss安装包

使用 gs_preinstall 脚本进行预安装检查.

准备OpenGauss数据库安装环境
准备OpenGauss数据库安装环境

使用 gs_install 命令进行安装.

安装OpenGauss数据库
安装OpenGauss数据库

使用 gs_om -t start 命令启动OpenGauss数据库.

启动OpenGauss数据库
启动OpenGauss数据库

提示 Successfully started. 说明数据库启动成功.

购买ECS数据库服务器

登录到华为云官网,使用课上注册的学生教育账号登录。进入"云数据库RDS"页面,选择"创建云数据库RDS"。

选择"按需计费"的方式,选择"性能规格",类型选择为 “PostgreSQL”, 选择"2核4G"的配置, 选择 “单机实例”。

购买ECS数据库服务器
购买ECS数据库服务器

创建成功后, 使用华为云提供的 DAS 连接工具, 输入用户名与设置的密码, 连接到数据库服务器.

连接到ECS数据库服务器
连接到ECS数据库服务器

使用虚拟机安装OpenGauss数据库

将课程提供的OpenEuler虚拟机镜像导入VirtualBox软件中.

虚拟机启动后, 切换到 omm 用户, 使用 gs_ctl status 命令查看OpenGauss数据库状态.

查看OpenGauss数据库状态
查看OpenGauss数据库状态

使用命令 gsql postgres 连接到其中的OpenGauss数据库,输入用户名与设置的密码,连接到数据库服务器。

使用Docker容器化部署OpenGauss数据库

容器化是一种轻量级的虚拟化技术,它将应用及其依赖项打包到一个独立的单元中,这个单元被称为容器。容器与主机操作系统共享内核,因此比传统的虚拟机更轻量级、更快速。

Docker 是一个开源的应用容器引擎,它基于 Linux 的容器技术,可以将应用及其依赖打包到一个可移植的镜像中,然后发布到任何支持 Docker 的环境中。

  • 提高资源利用率:容器与主机操作系统共享内核,因此比传统的虚拟机更轻量级,可以更有效地利用系统资源。
  • 简化部署:容器将应用及其依赖项打包到一个独立的单元中,可以轻松地在不同的环境中部署。
  • 提高可移植性:容器可以在任何支持 Docker 的环境中运行,从而提高了应用的可移植性。
  • 提高开发效率:容器可以隔离不同的应用,从而避免了应用之间的冲突,提高了开发效率。

云和恩墨公司制作了一个基于 Docker 的 OpenGauss 数据库镜像,用户可以通过 Docker 快速部署 OpenGauss 数据库。

使用 Docker Compose 工具, 从镜像 enmotech/opengauss 部署 OpenGauss 数据库。docker-compose 配置文件如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
version: "3"
services:
  gauss:
    image: enmotech/opengauss:5.0.0
    privileged: true
    restart: always
    user: root
    ports:
      - "5432:5432"
    environment:
      GS_PASSWORD: <DATABASE_PASSWORD>
    volumes:
      - ./data:/var/lib/opengauss

使用命令 docker-compose up -d 启动 OpenGauss 数据库容器。使用命令 docker exec -it <container_name> bash 进入容器。

进入容器后, 切换到 omm 用户, 使用命令 gsql -d postgres 连接到数据库。

连接到Docker容器中的OpenGauss数据库
连接到Docker容器中的OpenGauss数据库

建立数据表及索引

根据实验要求,设计了“学籍与成绩管理系统”中的一系列表格. 创建表格的SQL语句如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
CREATE TABLE IF NOT EXISTS xyb ( -- 创建学院表,存储学院基础信息
    ydh CHAR(2) PRIMARY KEY NOT NULL,  -- 学院代号,主键(不允许空,固定长度2字符)
    ymc CHAR(30) NOT NULL             -- 学院名称(不允许空,固定长度30字符)
);

CREATE TABLE IF NOT EXISTS xs ( -- 创建学生表,存储学生基本信息
    xm CHAR(8) NOT NULL,        -- 姓名(不允许空,固定长度8字符)
    xh CHAR(10) PRIMARY KEY NOT NULL,  -- 学号,主键(不允许空,固定长度10字符)
    ydh CHAR(2),                -- 所属学院代号(允许空,外键,引用xyb.ydh)
    bj CHAR(8),                -- 班级(固定长度8)
    chrq DATE,                  -- 出生日期(允许空)
    xb CHAR(2),                -- 性别(允许空,固定长度2字符)
    FOREIGN KEY (ydh)          -- 外键约束:所属学院代号必须是xyb表中存在的ydh值
        REFERENCES xyb(ydh),
    UNIQUE (xh)                -- 唯一约束:确保学号
);

CREATE TABLE IF NOT EXISTS js ( -- 创建教师表,存储教师信息
    xm CHAR(8) NOT NULL,        -- 姓名(不允许空)
    jsbh CHAR(10) PRIMARY KEY NOT NULL, -- 教师编号,主键(不允许空)
    zc CHAR(6),                -- 职称(允许空,固定长度6字符)
    ydh CHAR(2),                -- 所属学院代号(允许空,外键,引用xyb.ydh)
    FOREIGN KEY (ydh)          -- 外键约束:所属学院代号必须是xyb表中存在的ydh值
        REFERENCES xyb(ydh),
    UNIQUE(jsbh)               -- 唯一约束:确保教师编号值唯一
);

CREATE TABLE IF NOT EXISTS kc ( -- 创建课程表,存储课程信息
    kcbh CHAR(3) PRIMARY KEY NOT NULL, -- 课程编号,主键(不允许空)
    kc CHAR(20) NOT NULL,          -- 课程名称(不允许空)
    lx CHAR(10),                   -- 课程类型(允许空)
    xf NUMERIC(5, 1),               -- 学分(数值类型,总长度5位,小数点后1位)
    UNIQUE(kcbh)
);

CREATE TABLE IF NOT EXISTS sk ( -- 创建授课表,存储课程与班级的关联关系
    kcbh CHAR(3),               -- 课程编号(非主键字段,参与复合主键)
    bh CHAR(10),                -- 教师编号(非主键字段,参与复合主键)
    PRIMARY KEY (kcbh, bh),     -- 复合主键:课程编号 + 教师编号必须唯一组合
    FOREIGN KEY (kcbh)          -- 外键约束:课程编号必须是kc表中存在的kcbh值
        REFERENCES kc(kcbh),
    FOREIGN KEY (bh)            -- 外键约束:班级编号必须是js表中存在的jsbh值
        REFERENCES js(jsbh)       -- js的jsbj字段添加UNIQUE约束以允许外键引用
);

CREATE TABLE IF NOT EXISTS xk ( -- 创建学生选课表,记录选课及成绩
    xh CHAR(10),               -- 学号(主键字段之一)
    kcbh CHAR(3),              -- 课程编号(主键字段之一)
    jsbh CHAR(10),             -- 教师编号(主键字段之一)
    cj NUMERIC(5, 1),          -- 成绩(允许空)
    PRIMARY KEY (xh, kcbh, jsbh), -- 联合主键:学号 + 课程编号 + 教师编号的组合唯一
    FOREIGN KEY (xh)           -- 外键约束:学号必须是xs表中存在的xh值
        REFERENCES xs(xh),
    FOREIGN KEY (kcbh)         -- 外键约束:课程编号必须是kc表中存在的kcbh值
        REFERENCES kc(kcbh),
    FOREIGN KEY (jsbh)         -- 外键约束:教师编号必须是js表中存在的jsbh值
        REFERENCES js(jsbh),
    -- 确保 (kcbh, jsbh) 组合存在于 sk 表中
    FOREIGN KEY (kcbh, jsbh)   -- sk 表的主键字段是 (kcbh, bh),而 jsbh 对应 sk 表的 bh 字段
        REFERENCES sk(kcbh, bh)  -- 因此需要将 jsbh 映射到 sk 的 bh
);

使用Data Studio连接到数据库后, 执行上述SQL语句创建表格. SQL语句运行成功后, 可从Data Studio左侧的数据库树中查看到创建的表格.

创建表格
创建表格

建立数据表之后, 根据数据特点, 针对部分常用的查询进行索引设计, 以提高查询效率. 例如, 在学生表的学号字段上建立索引, 在课程表的课程编号字段上建立索引, 在教师表的教师编号字段上建立索引, 在选课表的学号和课程编号字段上建立联合索引等.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
-- 学生表(xs)
CREATE INDEX idx_xs_ydh ON xs(ydh); --用于按学院快速筛选学生信息(如统计某学院的学生数量)

-- 教师表(js)
CREATE INDEX idx_js_ydh ON js(ydh); --用于按学院筛选教师(如查询某学院的教师列表)

-- 课程表(kc)
CREATE INDEX idx_kc_kc ON kc(kc); -- 按课程名称查询
CREATE INDEX idx_kc_xf ON kc(xf); -- 按学分数筛选课程

-- 学生选课表(xk)
CREATE INDEX idx_xk_kcbh ON xk(kcbh); --按课程编号(kcbh)统计选课人数
CREATE INDEX idx_xk_jsbh ON xk(jsbh); --按教师编号(jsbh)筛选授课记录
CREATE INDEX idx_xk_cj ON xk(cj); --按成绩(cj)排序或统计(如按成绩筛选)

在Data Studio中运行上述SQL语句, 可在左侧的数据库树中查看到创建的索引. 右键点击表格, 选择“查看索引”即可查看到创建的索引.

创建索引
创建索引

实验结论

通过本次实验,我成功完成了数据库环境的搭建和基础数据表的设计与创建,获得了以下实验结论:

  • 多种数据库部署方式对比

    • ECS自建数据库:通过华为云ECS服务器自行安装配置OpenGauss数据库,具有较高的灵活性和可控性,但需要自行管理数据库运行环境和后续维护。
    • 云数据库RDS服务:华为云提供的托管PostgreSQL数据库服务,具有易用性高、运维简单的特点,适合快速部署且无需关注底层运维的场景。
    • 虚拟机本地部署:通过VirtualBox安装OpenEuler并使用其中的OpenGauss数据库,适合学习和开发环境,不依赖网络和云服务,便于本地调试和学习。
  • 数据库设计与实现

    • 成功设计并实现了学籍与成绩管理系统的六张数据表:学生表(xs)、教师表(js)、课程表(kc)、学院表(xyb)、授课表(sk)和学生选课表(xk)。
    • 建立了合理的表间关系,通过主外键约束保证了数据的完整性和一致性。
    • 采用了规范化的数据库设计方法,避免了数据冗余,使数据结构清晰合理。
  • 索引设计

    • 针对查询频率高的字段创建了适当的索引,如学号、课程编号、教师编号等。
    • 为外键字段如ydh(学院代号)建立索引,提高关联查询效率。
    • 为成绩字段cj创建索引,便于成绩统计和排序操作。
    • 索引设计兼顾了查询效率和写入开销的平衡。
  • 数据安全与完整性

    • 通过主键、唯一约束、非空约束等方式确保了数据的唯一性和完整性。
    • 通过外键约束维护了表之间的引用完整性,防止了数据不一致的情况出现。

实验体会

本次实验通过多种方式成功搭建了数据库环境,并完成了学籍与成绩管理系统的数据库设计与创建,为后续的数据操作和应用开发奠定了基础。

  • 掌握了OpenGauss数据库的安装、配置和基本管理方法。
  • 熟悉了SQL语言在数据定义(DDL)方面的应用,包括表的创建和索引的建立。
  • 了解了数据库外键约束的设置和作用。
  • 学会了使用华为云服务部署数据库环境。

实验中使用的多种部署方式各有优缺点,可以根据不同的应用场景灵活选择。数据库设计遵循了规范化原则,合理建立了索引,为系统的高效运行提供了保障。

发表于 2025-04-07
JS
Arrow Up