HNU-数据库系统-实验3-数据库设计

数据库系统 课程实验3
数据库设计

计科210X 甘晴void 202108010XXX

目录

文章目录

  • 数据库系统 课程实验3<br>数据库设计
    • 实验目的
    • 实验内容
    • 实验重难点
    • 实验环境
    • 实验过程
      • (0)数据库需求描述
      • (1)数据库概念结构设计
        • E-R图
        • 实体
          • 图书馆library:
          • 图书book:
          • 出版社press:
          • 注册读者reader:
          • 访客visitor:
          • 管理员admin:
        • 关系
          • 借阅borrow
          • 查询query
        • 【初步使用PowerDesigner】
          • ①新建一个“概念模型”文件
          • ②使用工具框绘制实体并连接关系
          • ③编辑实体属性
          • ④编辑关系的特征
          • ⑤检查模型
        • 【操作】
      • (2)数据库逻辑结构设计
        • 【操作】
      • (3)数据库物理结构设计
        • 【操作】
      • (4)SQL语句生成
        • 【操作】
        • 代码
        • 验证
    • 参考文献
    • 实验感悟

实验目的

掌握数据库设计的基本方法及数据库设计工具。

实验内容

掌握数据库设计的基本步骤,包括数据库概念结构设计、逻辑结构设计,物理结构设计,数据库模式 SQL 语句生成。能够使用数据库设计工具进行数据库设计。

实验重难点

实验重点:概念结构设计、逻辑结构设计。

实验难点:逻辑结构设计。逻辑结构设计虽然可以按照一定的规则从概念结构转换而来,但是由于概念结构通常比较抽象,较少考虑更多细节,因此转换而成的逻辑结构还需要进一步调整与优化。逻辑结构承接概念结构和物理结构,处于核心地位,因此是数据库设计的重点和难点。

实验环境

DBMS:8.0.33 MySQL Community Server - GPL

可视化:Navicat Premium 16.1.6

命令行:Navicat自带命令列

Powerdesigner

实验过程

(0)数据库需求描述

设计一个图书馆管理系统,有注册读者,访客,管理员三种身份,需要管理图书的信息以及它的出版与存放地点信息。一个注册读者能借阅多本图书,一本图书(在不同的时间)能被不同读者借阅。一个访客能查询多本图书,一本图书能被多个访客查询。一个管理员管理图书,访客,注册读者(该图书由该管理员经手,该访客或注册读者由该管理员引导)。一本图书只能放在一个图书馆里,一本图书只能由一个出版社所出版。

对于借阅,记录借阅发生的时间,应该归还的时间,是否可以续借,借阅的终端地址。对于查询,记录查询发生的时间,以及查询发生的终端地址。

(1)数据库概念结构设计

E-R图

从需求描述中抽象出用于描述关系的E-R图如下。

在这里插入图片描述

实体

从需求描述中识别出以下6个实体,并分别为它们赋予属性。

图书馆library:
  • 图书馆编号:library_id
  • 图书馆名:library_name
  • 图书馆联系电话:library_tel
  • 图书馆地址:library_address
图书book:
  • 图书编号:book_id
  • 图书名称:book_name
  • 图书作者:book_writer
  • 图书编号:book_pressid
  • 图书出版日期:book_pressdate
  • 图书ISBN:book_isbn
  • 图书价格:book_price
  • 图书副本数量:book_copynum
出版社press:
  • 出版社编号:press_id
  • 出版社名:press_name
  • 出版社联系电话:press_tel
  • 出版社地址:press_address
注册读者reader:
  • 读者编号:reader_id
  • 读者姓名:reader_name
  • 读者性别:reader_sex
  • 读者电话号码:reader_tel
  • 读者邮箱地址:reader_email
  • 读者证件类型:reader_doc
  • 读者证件号码:reader_docid
  • 读者注册日期:reader_registerdate
  • 读者备注:reader_others
访客visitor:
  • 访客编号:visitor_id
  • 访客注册日期:visitor_registerdate
管理员admin:
  • 管理员编号:admin_id
  • 管理员姓名:admin_name
  • 管理员性别:admin_sex
  • 管理员电话号码:admin_tel
  • 管理员邮箱地址:admin_email
  • 管理员入职时间:admin_registerdate
  • 管理员职位:admin_pos
关系

关系在逻辑结构设计时补入完善的ER图中,这里先列出来。

借阅borrow
  • 借阅日期:borrow_date
  • 应归还日期:borrow_expect_returndate
  • 是否可续借:borrow_ifrenew
  • 是否归还:borrow_ifreturn
  • 最终归还日期:borrow_returndate
  • 借阅时间:borrow_time
  • 借阅终端地址:borrow_terminal(3位)
查询query
  • 查询时间:query_time
  • 查询终端地址:query_terminal
【初步使用PowerDesigner】

使用PowerDesigner可以很方便的绘制ER图,下面简单叙述该软件的初步操作。

①新建一个“概念模型”文件

在这里插入图片描述

②使用工具框绘制实体并连接关系

【注意】对于相似的实体,千万不要偷懒用ctrl+cv的方法,这个复制过去的不是一个新的副本,它更像是一个链接,用人话说就是,你修改了复制本或者原本,这两个都会跟着一起变化,很烦(多花了好多时间)。一定要自己新建出一个实体去写。

在这里插入图片描述

③编辑实体属性

双击实体,可以编辑实体属性,第一个Name是显示的中文,第二个Code是代码中呈现的。
在这里插入图片描述

点击Attributes设置实体的属性以及一些特征

在这里插入图片描述

词条具体含义如下:

  • Name:实体名字一般为中文(这是显示在图上给人看的)
  • Code:实体代号,一般用英文(这是写在代码里的,一定要用英文,不然无法生成代码)
  • Data Type:实体的数据类型
  • Length:实体的数据长度
  • Domain:域,表示属性取值范围如可以创建10个字符的地址域
  • M:Mandatory强制属性,表示该属性必填。不能为空(相当于NOT NULL)
  • P:Primary Identifer是否是主标识符,表示实体唯一标识符(相当于 PRIMARY KEY UNIQUE)
  • D:Displayed显示出来,默认全部勾选(这个要选上,否则就隐藏了)
④编辑关系的特征

同样地,双击关系,也可编辑相应特征。
在这里插入图片描述

这里可以调节映射关系,是1:1还是1:n还是n:m。

⑤检查模型

实际上可有可无,如果能正常生成,一般是没有问题的。

如果出现这样的错误

在这里插入图片描述

解决办法是把这两个勾去掉,不检查这两项即可。

在这里插入图片描述

【操作】

使用PowerDesigner绘制数据库概念模型图如下

在这里插入图片描述

(2)数据库逻辑结构设计

根据上述E-R图以及实体属性使用PowerDesigner设计数据库逻辑结构。

E-R图向关系模型的转换规则

  • 一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
  • 一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。
  • 一个m:n联系只能转换为一个关系模式三个或三个以上实体间的一个多元联系转换为一个关系模式。
  • 具有相同码的关系模式可合并

(事实上,powerdesigner就是按照这个来的,最终它会合并所有1:1和1:n的关系,并为所有m:n的关系生成一个新的关系表)

【操作】

使用PowerDesigner创建数据库逻辑模型:Tool>Generate Logical Data Model即可生成数据库逻辑模型,直接点击生成即可,不需要做其它修改。生成如下:

在这里插入图片描述

这是它为我们生成的,我们可以看到多出来两个深色的部分,这就是为我们生成的两个新的关系表(这基本上只有在n:m的时候才会生成)。但实际上这还是不符合我们的预期的,比如对于借阅,我肯定要知道借阅发生的时间,应该归还的时间,以及是否可以续借等等这些额外的附加信息,对于查询,我可能想知道查询发生的时间,以及查询发生的终端地址等等,这些就需要我们手动对深色部分的模型作出更改。

对这两个关系表进行更改后,得到模型如下:

在这里插入图片描述

(3)数据库物理结构设计

数据库物理结构首先根据逻辑结构自动转换生成,然后根据应用需求设计数据库的索引结构、存储结构。

选择索引存取方法,数据库会自动为每个关系的主码建立索引。对于该系统,不需要建立其他索引。

【操作】

使用PowerDesigner创建数据库逻辑模型:Tool>Generate Physical Data Model即可生成数据库逻辑模型,这里要注意修改这个数据库为我们自己用的数据库(话说这个MySQL5.0是不是有点老了)。

在这里插入图片描述

结果如下:

在这里插入图片描述

(4)SQL语句生成

这一步可以自动生成SQL代码。

【操作】

使用PowerDesigner创建数据库逻辑模型:Database>GenerateDatabase,即可生成。这里可以设置文件的保存路径和文件名。

在这里插入图片描述

代码

最后生成的代码如下。

/*==============================================================*/
/* DBMS name:      MySQL 5.0                                    */
/* Created on:     2023/12/12 21:41:42                          */
/*==============================================================*/drop table if exists admin;drop table if exists book;drop table if exists book_reader;drop table if exists book_visitor;drop table if exists library;drop table if exists press;drop table if exists reader;drop table if exists visitor;/*==============================================================*/
/* Table: admin                                                 */
/*==============================================================*/
create table admin
(admin_id             char(12) not null,admin_name           varchar(30) not null,admin_sex            char(2) not null,admin_tel            varchar(11) not null,admin_email          varchar(50) not null,admin_registerdate   date not null,admin_pos            varchar(30) not null,primary key (admin_id)
);/*==============================================================*/
/* Table: book                                                  */
/*==============================================================*/
create table book
(book_id              char(50) not null,press_id             char(5),admin_id             char(12),library_id           char(5),book_name            varchar(50) not null,book_writer          varchar(30) not null,book_pressid         char(5) not null,book_pressdate       date not null,book_isbn            char(17) not null,book_price           float not null,book_copynum         int not null,primary key (book_id)
);/*==============================================================*/
/* Table: book_reader                                           */
/*==============================================================*/
create table book_reader
(book_id              char(50) not null,reader_id            char(12) not null,borrow_date          date not null,borrow_expect_returndate date not null,borrow_ifrenew       char(1) not null,borrow_ifreturn      char(1) not null,borrow_returndate    date,borrow_time          time not null,borrow_terminal      char(3) not null,primary key (book_id, reader_id)
);/*==============================================================*/
/* Table: book_visitor                                          */
/*==============================================================*/
create table book_visitor
(vistor_id            char(12) not null,book_id              char(50) not null,query_time           time not null,query_terminal       char(3) not null,primary key (vistor_id, book_id)
);/*==============================================================*/
/* Table: library                                               */
/*==============================================================*/
create table library
(library_id           char(5) not null,library_name         varchar(30) not null,library_tel          char(8) not null,library_address      varchar(50) not null,primary key (library_id)
);/*==============================================================*/
/* Table: press                                                 */
/*==============================================================*/
create table press
(press_id             char(5) not null,press_name           varchar(30) not null,press_tel            char(8) not null,press_address        varchar(50) not null,primary key (press_id)
);/*==============================================================*/
/* Table: reader                                                */
/*==============================================================*/
create table reader
(reader_id            char(12) not null,admin_id             char(12),reader_name          varchar(30) not null,reader_sex           char(2) not null,reader_tel           char(11) not null,reader_email         varchar(50) not null,reader_doc           varchar(30) not null,reader_docid         varchar(50) not null,reader_registerdate  date not null,reader_others        varchar(256),primary key (reader_id)
);/*==============================================================*/
/* Table: visitor                                               */
/*==============================================================*/
create table visitor
(vistor_id            char(12) not null,admin_id             char(12),vistor_registerdate  date not null,primary key (vistor_id)
);alter table book add constraint FK_admin_book foreign key (admin_id)references admin (admin_id) on delete restrict on update restrict;alter table book add constraint FK_book_library foreign key (library_id)references library (library_id) on delete restrict on update restrict;alter table book add constraint FK_book_press foreign key (press_id)references press (press_id) on delete restrict on update restrict;alter table book_reader add constraint FK_book_reader foreign key (book_id)references book (book_id) on delete restrict on update restrict;alter table book_reader add constraint FK_book_reader2 foreign key (reader_id)references reader (reader_id) on delete restrict on update restrict;alter table book_visitor add constraint FK_book_visitor foreign key (vistor_id)references visitor (vistor_id) on delete restrict on update restrict;alter table book_visitor add constraint FK_book_visitor2 foreign key (book_id)references book (book_id) on delete restrict on update restrict;alter table reader add constraint FK_admin_reader foreign key (admin_id)references admin (admin_id) on delete restrict on update restrict;alter table visitor add constraint FK_admin_visitor foreign key (admin_id)references admin (admin_id) on delete restrict on update restrict;
验证

使用Navicat访问该sql。

在Navicat左边栏连接本地数据库,新建一个library数据库

在这里插入图片描述

在左边栏右击library>运行SQL文件…

在这里插入图片描述

设置在遇到“错误”继续运行,可能有错误,这是正常现象,因为我们设置了很多非空,而实际上我们还没有导入数据。

成功运行之后可以见到界面如下,我们成功建立了一个数据库。

在这里插入图片描述

使用Navicat自带的数据生成功能生成数据,下面是生成书的作者名字的一个示例。这些每个属性值都是可以我们自己指定规则或者给予引导的,也可以用正则表达式或者枚举来限制生成的结果。

【注意】由于书本我们定义了外键,所以要先人为写好至少一条admin,press,library的信息,否则book没法生成,因为外键是NOT NULL且没法被填充。

在这里插入图片描述

根据对应的规则生成出来关于书的数据(部分)如下(这里就没有去考虑一些细节,只是做做一个范例)。

在这里插入图片描述

对于左边的这些表格都可以做数据生成。

在这里插入图片描述

然后就可以在这个基础上做数据查询更新等等操作了。

如果导入的是真实的数据,就可以做一个真正的图书馆数据库系统。

当然还要加上java或php写的前端,这就不是本次实验涉及的内容了,是大作业需要考虑的了。

参考文献

https://blog.csdn.net/weixin_63246738/article/details/128744120

https://www.imangodoc.com/pFUil7ts.html

https://blog.csdn.net/Aaron503/article/details/128280233

https://blog.csdn.net/qq_51684393/article/details/128413966

实验感悟

实验没有太大的难度,主要的时间花在思考我要做什么,以及探索PowerDesigner的使用上。有几点感悟如下。

需求分析太重要。不得不说一个明确的需求分析真的是太重要太重要了,如果知道想要做什么,有明确的需求的话,完成几个部分的设计真的不是很难的事情。但如果需求分析没有做好,后面真的就没办法开展。

PowerDesigner很好用。这个工具真的是太强大了,首先是很用户友好,对于一个纯新手,看看教程短时间可以上手。此外是逻辑很清晰,看看这张图,左边的栏从上往下依次就是“概念模型”,“逻辑模型”,“物理模型”,最后再生成SQL代码。工具清晰加上思路清晰,就能很快完成任务。

在这里插入图片描述

实验过程有意义。算是完整地走了一遍很简单的数据库雏形设计,挺有价值,为以后大作业奠定了一些基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openGauss学习笔记-188 openGauss 数据库运维-常见故障定位案例-core问题定位

文章目录 openGauss学习笔记-188 openGauss 数据库运维-常见故障定位案例-core问题定位188.1 磁盘满故障引起的core问题188.1.1 问题现象188.1.2 原因分析188.1.3 处理办法 188.2 GUC参数log_directory设置不正确引起的core问题188.2.1 问题现象188.2.2 原因分析188.2.3 处理办…

利用ChatGLM3构建Prompt实现Text2SQL

之前使用ChatGLM3的自定义工具实现了查询MySQL数据库&#xff0c;但感觉功能还是比较受限。 https://blog.csdn.net/weixin_44455388/article/details/135270879?spm1001.2014.3001.5501 使用ChatGLM3实现Text2SQL 前言Text2SQL的构建第一阶段&#xff1a;SQL脚本构建&#xf…

软件工程_复习

软件工程 软件危机(1968 60年代) 产生软件危机的原因: 一方面与软件本身的特点有关,另一方面也和软件开发和维护的方法不正确有关。 与软件本身特点有关: 1.软件不同于硬件,软件是计算机系统中的逻辑部件,缺乏“可见性”,管理和控制软件开发过程相当困难 2.软件在运行过…

Python笔记06-文件操作

文章目录 文件的编码文件读取文件写入文件追加 文件的编码 编码技术即&#xff1a;翻译的规则&#xff0c;记录了如何将内容翻译成二进制&#xff0c;以及如何将二进制翻译回可识别内容。算机中有许多可用编码&#xff1a;UTF-8、GBK、Big5等 不同的编码&#xff0c;将内容翻译…

typescript递归处理

typescript是一种类型强约束的语言&#xff0c;一般来讲定义类型时都要明确指定类型的数据结构。而如果数据结构中涉及到不知道基层嵌套的递归时&#xff0c;就会有一些麻烦。 在 https://stackoverflow.com/questions/51657815/recursive-array-type-typescript 有一个回答…

Java Swing手搓坦克大战遇到的问题和思考

1.游戏中的坐标系颇为复杂 像素坐标系还有行列坐标&#xff0c;都要使用&#xff0c;这之间的互相转化使用也要注意 2.游戏中坦克拐弯的处理&#xff0c;非常重要 由于坦克中心点是要严格对齐到一条网格线&#xff0c;并沿着这条线前进的&#xff0c;如果拐弯不做处理&#…

柠檬Lemon测评机的配置和测试方法

柠檬Lemon测评机的配置和测试方法 只需3步,即可配置好柠檬 第一步:选择g++,点击下一步 第二步:找到g++的目录,添加编译器,点击下一步 第三步:检查结果,点击完成。(此时,配置完成) 只需3步,即可用柠檬做考试测试 第一步:新建比赛

SpringCloud系列篇:核心组件之注册中心组件

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.注册中心组件是什么 二.注册中心…

大模型机器人原理解析:如何从RT/RT2、Berkeley Gello到发展到斯坦福Mobile ALOHA、Google家务机器人

前言 23年7月&#xff0c;我在朋友圈评估Google的RT2说道&#xff1a; “大模型正在革新一切领域啊&#xff0c;超帅&#xff0c;通过大模型不仅能理解“人话”&#xff0c;还能对“人话”进行推理&#xff0c;并转变为机器人能理解的指令&#xff0c;从而分阶段完成任务。回…

opencv006图像处理之仿射变换(旋转,缩放,平移)

空间变换中的仿射变换对应着五种变换&#xff0c;平移&#xff0c;缩放&#xff0c;旋转&#xff0c;翻转&#xff0c;错切。而这五种变化由原图像转变到变换图像的过程&#xff0c;可以用仿射变换矩阵进行描述。而这个变换过程可以用一个2*3的矩阵与原图进行相乘得到。关键就是…

5年经验之谈 —— 探索自动化测试用例设计粒度!

自动化测试用例的粒度指的是测试用例的细致程度&#xff0c;即每个测试用例检查的功能点的数量和范围。 通常&#xff0c;根据测试用例的粒度&#xff0c;可以被分为3种不同的层次&#xff0c;从更低层次的细粒度到更高层次的粗粒度。 第一种&#xff1a;单元测试 - 细粒度 单…

16、Kubernetes核心技术 - 节点选择器、亲和和反亲和

目录 一、概述 二、节点名称 - nodeName 二、节点选择器 - nodeSelector 三、节点亲和性和反亲和性 3.1、亲和性和反亲和性 3.2、节点硬亲和性 3.3、节点软亲和性 3.4、节点反亲和性 3.5、注意点 四、Pod亲和性和反亲和性 4.1、亲和性和反亲和性 4.2、Pod亲和性/反…

chatGPT带你学习设计模式 (二)抽象工厂模式(创建型模式) GURU

深入理解抽象工厂模式 引言 在面向对象编程中&#xff0c;对象的创建是一个常见且关键的挑战。尤其在需要管理一系列相关对象的创建时&#xff0c;传统的对象创建方法&#xff08;如直接使用 new 关键字&#xff09;可能导致代码的高耦合和低灵活性。这时&#xff0c;抽象工厂…

jmeter连接数据库

下载jdbc 在浏览器输入 mysql jdbc官网 &#xff1b; 网址&#xff1a;MySQL :: MySQL Connectors 点击 Download 查看自己mysql服务的版本&#xff0c;找到对应版本的jdbc 所以下载5版本的jdbc 安装jdbc&#xff08;绿色版安装&#xff09; 操作jmeter 打开jmeter&#xff0…

前端框架中的状态管理(State Management)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

GEE:随机数

作者&#xff1a;CSDN _养乐多_ 本文将介绍在 Google Earth Engine&#xff08;GEE&#xff09;上生成随机数的 API&#xff0c;可以指定随机数的生成范围、类型&#xff08;整型、浮点型&#xff09;、分布方式&#xff08;均匀分布、正态分布&#xff09;。 文章目录 一、随…

基于springboot的基于协同过滤算法的东北特产销售系统的设计与实现

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的基于协同过滤算法的东北…

2024年度 ROTS - 实时操作系统 Top 15

RTOS&#xff08;实时操作系统&#xff09;。 这里说的 RTOS 并非新星球大战电影中的机器人&#xff0c;而是物联网设备、航空系统、空中交通管制等背后的无声协调者&#xff0c;就在地球上。 RTOS&#xff0c;或称实时操作系统&#xff0c;设计它们是为了更好的管理资源&…

MySQL5.7 InnoDB 内存结构

官网地址&#xff1a;MySQL :: MySQL 5.7 Reference Manual :: 14.5 InnoDB In-Memory Structures 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. MySQL 5.7 参考手册 / ... / 缓冲池 14.5.1 缓冲池 缓冲池是…

20240106-换一种思维,工作也不过就是一种挣钱的方式而已了

今天在车上一个百度的同事聊抱怨说&#xff1a;累了&#xff0c;真的累了&#xff0c;干不动了&#xff0c;想跑路了&#xff0c;不想打工了。我们之前也会经常聊到和吐槽这种事情&#xff0c;但是我最近由于思维的一些改变&#xff0c;所以就想到把这个事情记录下来。 在大厂…