MySQL-数据库设计与实现

第1关:从概念模型到MySQL实现

任务描述

将已建好的概念模型,变成MySQL物理实现。

相关知识

1.数据库设计的阶段和每阶段的任务;
2.概念模型;
3.逻辑模型及其与概念模型的关系;
4.在DBMS中的物理实现。

数据库设计的阶段和每阶段的任务

数据库的设计大致分为以下几个阶段:
需求分析
根据业务需求,确定应用系统所涉及的数据(信息),以及处理需 求,形成数据字典,包括数据结、数据结构、数据流、数据存储、数据处理过程等文档
概念结构设计
主要工作是对数据建模,对关系数据库应用系统而言,主要是用ER图描述数据及数据间的关系(当然,也有人使用UML类图)。ER图有两种表达方式,一种是陈氏ER图,最早由出生于台湾省高雄市的陈品山(Peter Chen,路易斯安那州立大学教授)提出,教科书主要讲授这种E-R图。图1用陈氏ER图表达了教科书中常用的学生选课系统的概念模型:

学生选课概念模型

图1 学生选修课程
陈氏ER图很占空间,当系统中的实体和属性较多时,从每个代表实体的矩形扩散开去的椭圆形(代表属性)会使整个模型显得混乱、拥挤。于是有了后来的Crow's foot(乌鸦脚)式的E-R图。图2用Crow's foot ER图表达了学生与院系的关示。

crow's foot

图2 Crow's foot ER图
图2反映了院系与学生的一对多联系,两个实体的属性就列在各自实体名的下方。用一条两端带有标记的线连接两个实体,表达二者间的联系,联系名就写在线中间,就样很节省空间。请注意一对多联系多端的形状,很像乌鸦的脚,遂得名Crow's foot(尽管多数鸟类的脚都是这幅模样)。

逻辑结构设计
最主要的工作就是把ER图转换成关系模式。概念结构到逻辑结构 的转变是有成规的,它跟两个实体间的联系相关,教材已经讲得够多了。Crow’s foot式的ER图,有一个好处是,在原图上稍加改动(比如把1端的主码直接添加到多端),就可以变成逻辑结构,再添上主码,外码,索引,并指明每个列在某个DBMS上的类型,很快就能变成物理模型,方便计算机自动创建数据库对象。图3就已经给出了每次个属性的数据类型,定义了外码。

pyiscal model

图3 接近物理模式的Crow's foot模型

物理结构设计
物理结构设计的主要工作,是在逻辑结构的基础上,确定存储结构和存取方法,将所有的数据类型针对具体的DBMS确定化等。

实施与运维
在选定的DBMS上,创建数据对象,初始化数据,试运行,在不断调试过程中完善系统,并持续改进与维护。

扫描二维码关注公众号,回复: 15270604 查看本文章

大多数建模工具,如ERWIN, Navicat, Microsoft Visio, Draw.IO, MySQL Workbench等,都支持Crows’ foot。Visio和draw.io还支持Chen’s ER图。在上述工具中,只有Draw.IO和MySQL Workbench是免费的。ERWIN,Navicat和MySQL Workbench还支持reverse engineering,即逆向工程,根据已建好的数据库,逆向导出模型,不过通常是物理模型。Navicat支持继续逆向到逻辑模型和概念模型。基本上,在逆向工程的基础上,替换掉DMBS的具体数据类型,如把varchar(50)改成string,就是一个逻辑模型,将逻辑模型中所有的外码列去掉,就成了概念模型,概念模型可以不标注数据类型。但在生产环境中,多用软件表达模型,实际从概念模型开始就已开始标注通用的数据类型如:string,integer,float,datetime,boolean等。

编程要求

本关的任务,是根据一个已建好的逻辑模型,完成MySQL的实现。逻辑ER图如图3所示。

订票系统ER图

图3 机票订票系统概念模型ER图
说明:这个图是用draw.io画的,在浏览器地址栏输入draw.io即可调出,不用安装任何软件。

应用背景介绍

这是一个机票订票系统,系统需要考虑以下实体:
1.用户(user)
用户分两类,普通用户可以订票,管理用户有权限维护和管理整个系统的运营。为简单起见,两类用户合并,用admin_tag标记区分。用户的属性(包括业务约束)有:
用户编号: user_id int 主码,自动增加
名字: firstname varchar(50) 不可为空
姓氏: lastname varchar(50) 不可为空
生日: dob date 不可为空
性别: sex char(1) 不可为空
邮箱: email varchar(50)
联系电话: phone varchar(30)
用户名: username varchar(20) 不可空,不可有重
密码: password char(32) 不可空
管理员标志: admin_tag tinyint 缺省值0(非管理员),不能空

2. 旅客(passenger)
用户登录系统不一定是替自己买票,所以用户和旅客信息是分开存储的。属性有:
旅客编号: passenger_id int 自增,主码
证件号码: id char(18) 不可空 不可重
名字:firstname varchar(50) 不可空
姓氏: lastname varchar(50) 不可空
邮箱:mail varchar(50)
电话: phone varchar(20) 不可空
性别: sex char(1) 不可空
生日: dob date

3.机场(airport)
有以下属性:
编号: airport_id int 自增,主码
国际民航组织编码:iata char(3) 不可空,全球唯一
国际航运协会编码: icao char(4) 不可空,全球唯一
机场名称: name varchar(50) 不可空,普通索引
所在城市: city varchar(50)
所在国家: country varchar(50)
纬度: latitude decimal(11,8)
经度: longitude decimal(11,8)
全球每个机场都有唯一IATA编码和ICAO编码,IATA为3个字符,ICAO为4个字符。例如首都机场的(IATA,ICAO)分别为(PEK,ZBAA),大兴机场为(PKX,ZBAD),天河机机场为(WUH,ZHHH)。在飞机登记牌上出发地和到达地均用IATA表示。为能在地图上显示机场位置,需要记录经纬度信息。

4.航空公司(airline)
有以下属性:
编号:airline_id int 自增,主码
名称:name varchar(30) 不可空
国际民航组织编码: iata char(2) 不可空,具全球唯一性
航空公司的IATA编码为2位,如东航为MU,国航为CA,南航为CZ等,航班号一般以所属航空公司的IATA码为前缀。

5.民航飞机(airplane)
有属性:
编号:airplane_id int 自增,主码
机型:type varchar(50) 不可空,如B737-300,A320-500等
座位: capacity smallint 不可空
标识: identifier varchar(50) 不可空

6.航班常规调度表(flightschedule)
舤班一般以周次安排,例如:每周两个班次,周一和周五。
有属性:
航班号: flight_no char(8) 主码
起飞时间: departure time 非空
到达时间: arrival time 非空
飞行时长: duration smalint 非空
周一:monday tinyint 缺省0
周二:tuesday tinyint 缺省0
周三:wednesday tinyint 缺省0
周四:thursday tinyint 缺省0
周五:friday tinyint 缺省0
周六:saturday tinyint 缺省0
周日:sunday tinyint 缺省0
飞行时长一般以分种计。

7.航班表(flight)
航班依航班常规调度表为基准安排。但调度表不是一成不变,也不是每个既定的航都实际起飞,也不总是按既定的时间起飞,所以实飞航班必须单独安排并记录。
要记录的信息有:
飞行编号:flight_id int 自增,主码
起飞时间: departure datetime 非空
到达时间: arrival datetime 非空
飞行时长:duration smallint 非空
有的系统还会实时显示航班经纬度和高度位置,这里我们作了简化,去掉了实时飞行信息。

8.机票(ticket)
用户可替自己或其亲友购买某个航班的机票。机票的属性有:
票号:ticket_id int 自增,主码
坐位号:seat char(4)
价格:price decimal(10,2) 不能空

9.实体间的联系
实体间的联系都清楚地标注在ER图中:

  • 每个航空公司都有一个母港(机场),又叫基地。大的机场可能会是多家公司的基地,小型机场可能不是任何航空公司的基地。
  • 每个航班属于一家航空公司,航空公司可以很多航班。
  • 任何一驾民航飞机属于一家航空公司,航空公司可以有多驾飞机。
  • 每驾飞机可以执飞多个航班,一个飞行航班由一架飞机执飞。
  • 一个航班根据执飞机型可以售出若干机票。一张机票是某个特定航班的机票。
  • 用户可以多次订票,旅客可以多次乘坐飞机。一张机票肯定是某个用户为某个特定的旅客购买的特定航班的机票。即机票信息不仅跟乘坐人有关,同时记录购买人信息(虽然两者有时是同一人)。为简单起见,订购时间没有考虑。
  • 无论常规计划的航班,还是实际飞行航班,都是从某个机场出发,到达另一个机场。但一个机场可以是很多个航班的出发地,也是很多航班的到达地。

请根据上述信息和所给ER图,给出在MySQL实现flight_booking的语句,包括建库,建表,创建主码,外码,索引,指定缺省,不能为空等约束。所有索引采用BTREE。所有约束的名字不作要求。所有的外码与主码同名。但有两处例外: 计划航班和飞行航班都涉及出发机场和到达机场,外码与主码同名会导致同一表有两个同名列。故这两处外码例外处理:出发机场命名为from,到达机场命名为to。
注意:所有的表名字和列名,都没有大写字母。列名存在与关键字同名的情形,请妥善处理。你有可能不能一次通过评测,请考虑你的代码要反复修改再运行的情形。

如果觉得上图不够清晰,可以前往:
https://gitee.com/kylin8575543/db2022-spring
点击下载实训所需要的资料包,也可直接查看本文件:
https://gitee.com/kylin8575543/db2022-spring/blob/master/flightbooking.png

请将语句填写在右侧代码文件,然后提交评测。

测试说明

评测程序将执行你的代码文件,然后检查所有的数据库对象是否与预期结果完全一致(所有约束的名字,包括主码、外码、缺省,unique都不在评测之列)。


开始你的任务吧,祝你成功!

参考代码

 # 请将你实现flight_booking数据库的语句写在下方:
 
drop database if exists flight_booking; 
create database flight_booking; 
use flight_booking;
 
SET NAMES utf8mb4; 
SET FOREIGN_KEY_CHECKS = 0;
 
DROP TABLE IF EXISTS airline ; CREATE TABLE airline ( airline_id int NOT NULL AUTO_INCREMENT, name varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, iata char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, airport_id int NOT NULL, PRIMARY KEY ( airline_id ) USING BTREE, UNIQUE INDEX iata_unq ( iata ) USING BTREE, INDEX base_airport_idx ( airport_id ) USING BTREE, CONSTRAINT airline_ibfk_1 FOREIGN KEY ( airport_id ) REFERENCES airport ( airport_id ) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
DROP TABLE IF EXISTS airplane ; CREATE TABLE airplane ( airplane_id int(0) NOT NULL AUTO_INCREMENT, type varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, capacity smallint(0) NOT NULL, identifier varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, airline_id int(0) NOT NULL,
PRIMARY KEY ( airplane_id ) USING BTREE, INDEX airplane_ibfk_1 ( airline_id ) USING BTREE, CONSTRAINT airplane_ibfk_1 FOREIGN KEY ( airline_id ) REFERENCES airline ( airline_id ) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
DROP TABLE IF EXISTS airport ; CREATE TABLE airport ( airport_id int NOT NULL AUTO_INCREMENT, iata char(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, icao char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, city varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, country varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, latitude decimal(11, 8) NULL DEFAULT NULL, longitude decimal(11, 8) NULL DEFAULT NULL, PRIMARY KEY ( airport_id ) USING BTREE, UNIQUE INDEX iata_unq ( iata ) USING BTREE, UNIQUE INDEX icao_unq ( icao ) USING BTREE, INDEX name_idx ( name ) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 
DROP TABLE IF EXISTS passenger ; CREATE TABLE passenger ( passenger_id int NOT NULL AUTO_INCREMENT, id char(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, firstname varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, lastname varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, mail varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, phone varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, sex char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, dob date NULL DEFAULT NULL, PRIMARY KEY ( passenger_id ) USING BTREE, UNIQUE INDEX id_unq ( id ) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 
DROP TABLE IF EXISTS ticket ; CREATE TABLE ticket ( ticket_id int NOT NULL AUTO_INCREMENT, flight_id int NOT NULL, seat char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, passenger_id int NOT NULL, price decimal(10, 2) NOT NULL, user_id int NOT NULL, PRIMARY KEY ( ticket_id ) USING BTREE, INDEX flight_idx ( flight_id ) USING BTREE, INDEX passenger_idx ( passenger_id ) USING BTREE, INDEX ticket_ibfk_3 ( user_id ) USING BTREE, CONSTRAINT ticket_ibfk_1 FOREIGN KEY ( flight_id ) REFERENCES flight ( flight_id ) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT ticket_ibfk_2 FOREIGN KEY ( passenger_id ) REFERENCES passenger ( passenger_id ) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT ticket_ibfk_3 FOREIGN KEY ( user_id ) REFERENCES user ( user_id ) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 
 
DROP TABLE IF EXISTS user ; CREATE TABLE user ( user_id int NOT NULL AUTO_INCREMENT, firstname varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, lastname varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, dob date NOT NULL, sex char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, email varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
phone varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, username varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, password char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, admin_tag tinyint NOT NULL DEFAULT 0, PRIMARY KEY ( user_id ) USING BTREE, UNIQUE INDEX user_unq ( username ) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;
 
 
DROP TABLE IF EXISTS flightschedule ; CREATE TABLE flightschedule ( flight_no char(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `from` int NOT NULL, `to` int NOT NULL, departure time NOT NULL, arrival time NOT NULL, duration smallint NOT NULL,
airline_id int NOT NULL, monday tinyint NULL DEFAULT 0, 
tuesday tinyint NULL DEFAULT 0, 
wednesday tinyint NULL DEFAULT 0, 
thursday tinyint NULL DEFAULT 0, friday tinyint NULL DEFAULT 0, saturday tinyint NULL DEFAULT 0, sunday tinyint NULL DEFAULT 0, 
PRIMARY KEY ( flight_no ) USING BTREE, 
INDEX from_idx ( `from` ) USING BTREE, 
INDEX to_idx ( `to` ) USING BTREE, 
INDEX airline_idx ( airline_id ) USING BTREE, 
CONSTRAINT flightschedule_ibfk_1 FOREIGN KEY ( `from` ) REFERENCES airport ( airport_id ) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT flightschedule_ibfk_2 FOREIGN KEY ( `to` ) REFERENCES airport ( airport_id ) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT flightschedule_ibfk_3 FOREIGN KEY ( airline_id ) REFERENCES airline ( airline_id ) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
DROP TABLE IF EXISTS flight ; CREATE TABLE flight ( flight_id int NOT NULL AUTO_INCREMENT, flight_no char(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `from` int NOT NULL, `to` int NOT NULL,
departure datetime NOT NULL, arrival datetime NOT NULL, duration smallint NOT NULL, airline_id int NOT NULL, airplane_id int NOT NULL, 
PRIMARY KEY ( flight_id ) USING BTREE, 
INDEX from_idx ( `from` ) USING BTREE, 
INDEX to_idx ( `to` ) USING BTREE, 
-- INDEX departure_idx ( departure ) USING BTREE, 
-- INDEX arrivals_idx ( arrival ) USING BTREE, 
INDEX airline_idx ( airline_id ) USING BTREE, 
INDEX airplane_idx ( airplane_id ) USING BTREE, 
INDEX flightno ( flight_no ) USING BTREE, 
CONSTRAINT flight_ibfk_1 FOREIGN KEY ( `from` ) REFERENCES airport ( airport_id ) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT flight_ibfk_2 FOREIGN KEY ( `to` ) REFERENCES airport ( airport_id ) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT flight_ibfk_3 FOREIGN KEY ( airline_id ) REFERENCES airline ( airline_id ) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT flight_ibfk_4 FOREIGN KEY ( airplane_id ) REFERENCES airplane ( airplane_id ) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT flight_ibfk_5 FOREIGN KEY ( flight_no ) REFERENCES flightschedule ( flight_no ) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 
SET FOREIGN_KEY_CHECKS = 1;

第2关:从需求分析到逻辑模型

任务描述

本关任务:
根据应用场景业务需求描述,完成ER图,并转换成关系模式。
提交设计文档

业务功能描述

设计一个影院管理系统。影院对当前的放映厅和电影进行排片,顾客到来后,可以购买任一排场的电影票,进入对应放映厅观看。系统中有以下实体集:

  1. 电影(movie):属性有标识号(movie_ID)、电影名(title)、类型(type)、时长(runtime)、首映日期(release_date)、导演姓名(director)、主演姓名(starring)。
  2. 顾客(customer):属性有标识号(c_ID)、姓名(name)、手机号(phone)。
  3. 放映厅(hall):属性有标识号(hall_ID)、放映模式(mode)、容纳人数(capacity)、位置(location)。
  4. 排场(schedule):属性有标识号(schedule_ID)、日期(date)、时间(time)、票价(price)、票数(number)。
  5. 电影票(ticket):属性有标识号(ticket_ID)、座位号(seat_num)。 实体间的关系描述如下: ①. 顾客和电影票有一对多的购买关系。每位顾客可以买多张电影票,每张电影票被一位顾客购买。 ②. 电影票和排场有多对一的属于关系。一张电影票只属于一个排场,一个排场有多张电影票。 ③. 排场和电影有一对多的放映关系。每个排场放一部电影,每部电影可以在多个排场放映。 ④. 排场和放映厅有一对多的位于关系。每个排场位于一个放映厅,每个放映厅可以安排多个排场。

任务要求

  1. 按上述要求画出E-R图。
  2. 给出对应的关系模式。

如果用建模工具建模,请将模型另存为图片,如果手工画图,请拍照,请在图片上签名,或加上电子签名。图片文件请命名为ersolution.jpg。并将图片文件上传至网上(比如你的github或gitee上的开源项目中,或任何可以直接访问到的地方)。将访问该图片的URL填写在右侧编辑器的第2行,URL应直接定位到该图片(而不是在某个网页里能找到该图片),即点击URL即直接打开图片。

然后,在文件编辑器里写出关系模式。
关系模式的表达格式参考:
学生(学号,姓名,性别,出生日期,院系id),主码:(学号); 外码:(院系id)
不要使用纯中文符号。

测试说明

评测程序会检查你是否提交了文档,由于设计的多解性,评测程序无法给出具体评分,只要提交了文档,并给出了关系模式,即先行赋分。待人工评阅后,根据你的完成情况,酌情在总成绩中扣出一定分值 (或者不扣)。


开始你的任务吧,祝你成功!

代码参考

 请给出ER图文件存放的URL:
https://free.wzznft.com/i/2023/05/18/ersolution.jpg
 以下给出关系模式:

电影(movie)(movie_ID, title, type, runtime, release_date, director, starring), 主码:(movie_ID)

顾客(customer)(c_ID, name, phone), 主码:(c_ID)

放映厅(hall)(hall_ID, mode, capacity, location), 主码:(hall_ID)

排场(schedule)(schedule_ID, date, time, price, number, hall_ID, movie_ID), 主码:(schedule_ID),外码:(hall_ID) 参照放映厅(hall)(movie_ID) 参照电影(movie)

电影票(ticket)(ticket_ID, seat_num, c_ID, schedule_ID), 主码:(ticket_ID),外码:(c_ID) 参照顾客(customer)(schedule_ID) 参照排场(schedule)

图片备份
ER图

第3关:建模工具的使用

任务描述

本关任务:
将一个建好的模型文件,利用MySQL Workbench的forward engineering功能,自动转换成SQL脚本。

相关知识

为了完成本关任务,你需要掌握:
1.常用的建模工具及其特点;
2.学会使用工具建模;
3.Forward Engineering和Reverse Engineering。

建模工具简介

1. ERWIN
erwin Data Modeler行业领先的数据建模解决方案,具有直观的设计和存档功能,支持管理整个企业内任何存储位置的任何数据。但收费较贵,不过,大学学生可以申请erwin Data Modeler Academic Edition,有效期1年。可以去官网下载文档了解具体功能和使用方法:
中文官网:http://www.erwinchina.com/

2.Navicat
Navicat支持几乎所有你常用的DBMS,支持概念模型,逻辑模型和物理模型,可根据模型文件生成任何DBMS的脚本。支持Forward Engineering和Reverse Engineering。
该软件也是收费。
Navicat同时也是用户较多的DBMS客户端管理工具。
中文官网:
https://www.navicat.com.cn/

3.Microsoft Visio

现在,Visio已从Office分离出来,需要单独购买。支持陈氏E-R图和Crow’s foot。可用来表达概念模型,逻辑模型等。

4.Draw.io
这是最容易获得的建模工具,只需要web browser的地址栏里输入URL即可调出:
draw.io
或者:
https://app.diagrams.net/
输入前者会自动跳转到后者。
比较适合建立概念模型和逻辑模型。既支持陈氏ER图,也支持Crow’s footsER图。但它不能跟具体的DBMS连接,不支持正向及逆向工程。

5. MySQL Workbench
MySQL社区版自带的免费工具。也是比较好用的图形界面客户端管理工具。支持正向及逆向工具。
官网可下载使用手册。

编程要求

前往
https://gitee.com/kylin8575543/db2022-spring
下载实训所需要的资料包,或者仅下载本文件:
https://gitee.com/kylin8575543/db2022-spring/raw/master/rbac.mwb

这是一个已经建好的模型文件rbac.mwb,请利用MySQL Workbench建模模块中的Forward engineering功能,自动导出SQL脚本。

Forwar Engineering

线下处理完毕后,请把脚本粘贴到代码文件中。

测试说明

评测程序将执行你的代码文件,然后检查所有的数据库对象是否与预期结果完全一致。你不用修改Workbench导出的脚本。


开始你的任务吧,祝你成功!

代码参考

 # 请将利用MySQL Workbench软件的Modeling工具,经forward engineering 导出的创建schema的SQL语句完整粘到此处:
 
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @OLD_SQL_MODE=@@SQL_MODE, 
SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
 
CREATE SCHEMA IF NOT EXISTS rbac DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci ; 
USE rbac ;
 
 
CREATE TABLE IF NOT EXISTS rbac . aprole (
RoleNo INT NOT NULL COMMENT '角色编号', 
RoleName CHAR(20) NOT NULL COMMENT '角色名', 
Comment VARCHAR(50) NULL DEFAULT NULL COMMENT '角色描述', 
Status SMALLINT NULL DEFAULT NULL COMMENT '角色状态', 
PRIMARY KEY ( RoleNo )) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8mb4 
COLLATE = utf8mb4_0900_ai_ci 
COMMENT = '角色表';
 
CREATE TABLE IF NOT EXISTS rbac . apuser(
    UserID CHAR(8) NOT NULL COMMENT '用户工号',
    UserName CHAR(8) NULL DEFAULT NULL COMMENT '用户姓名', 
    Comment VARCHAR(50) NULL DEFAULT NULL COMMENT '用户描述', 
    PassWord CHAR(32) NULL DEFAULT NULL COMMENT '口令', 
    Status SMALLINT NULL DEFAULT NULL COMMENT '状态',
    PRIMARY KEY ( UserID ), 
    UNIQUE INDEX ind_username ( UserName ASC) VISIBLE) 
    ENGINE = InnoDB 
    DEFAULT CHARACTER SET = utf8mb4
    COLLATE = utf8mb4_0900_ai_ci 
    COMMENT = '用户表';
 
CREATE TABLE IF NOT EXISTS rbac . apgroup (
    UserID CHAR(8) NOT NULL COMMENT '用户编号', 
    RoleNo INT NOT NULL COMMENT '角色编号', 
    PRIMARY KEY ( UserID , RoleNo ), 
    INDEX FK_apGroup_apRole ( RoleNo ASC) VISIBLE, 
    CONSTRAINT FK_apGroup_apRole FOREIGN KEY ( RoleNo ) REFERENCES rbac . aprole ( RoleNo ),
    CONSTRAINT FK_apGroup_apUser FOREIGN KEY ( UserID ) REFERENCES rbac . apuser ( UserID ))
    ENGINE = InnoDB 
    DEFAULT CHARACTER SET = utf8mb4 
    COLLATE = utf8mb4_0900_ai_ci 
    COMMENT = '角色分配表';
 
CREATE TABLE IF NOT EXISTS rbac . apmodule (
    ModNo BIGINT NOT NULL COMMENT '模块编号', 
    ModID CHAR(10) NULL DEFAULT NULL COMMENT '系统或模块的代码', 
    ModName CHAR(20) NULL DEFAULT NULL COMMENT '系统或模块的名称', PRIMARY KEY ( ModNo ))
    ENGINE = InnoDB 
    DEFAULT CHARACTER SET = utf8mb4 
    COLLATE = utf8mb4_0900_ai_ci 
    COMMENT = '功能模块登记表';
 
CREATE TABLE IF NOT EXISTS rbac . apright (
RoleNo INT NOT NULL COMMENT '角色编号', 
ModNo BIGINT NOT NULL COMMENT '模块编号', 
PRIMARY KEY ( RoleNo , ModNo ), 
INDEX FK_apRight_apModule ( ModNo ASC) VISIBLE,
CONSTRAINT FK_apRight_apModule 
FOREIGN KEY ( ModNo ) 
REFERENCES rbac . apmodule ( ModNo ), 
CONSTRAINT FK_apRight_apRole
FOREIGN KEY ( RoleNo ) 
REFERENCES rbac . aprole ( RoleNo ))
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8mb4 
COLLATE = utf8mb4_0900_ai_ci 
COMMENT = '角色权限表';
 
SET SQL_MODE=@OLD_SQL_MODE; 
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; 
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

猜你喜欢

转载自blog.csdn.net/qq_46373141/article/details/130745049
今日推荐