数据库设计问题

问题:

某学校要设计一个数据库,学校的业务规则概括如下:

  • 学校内班级若干,每个班级内又有学生若干。
  • 学校开设课程若干,只有某些特定的班级能上指定的课程。
  • 学生选修某些课程,但是在自身班级下的课程是必修。
  • 学校定期组织考试,成绩囊括所有学生所有课程的考试成绩。

解决:

使用三大范式实现数据库设计规范化:

1、确认实体:

系 科目 学生 成绩

2、标出属性:

系:系编号(PK) 系名称
科目:科目编号(PK) 科目名称 学习时长 系编号
学生:学号(PK) 密码 姓名 性别 系编号 联系电话 生日 邮箱 身份证号码 住址
成绩:学号(FK) 科目号(FK) 考试日期 考试成绩

3、找出关系:

1系>>>N学生
1系>>>N科目
1学生>>>N成绩
1科目>>>N成绩
N学生<<<>>>N科目

4、画E-R图:

在这里插入图片描述

5、画模型图:

在这里插入图片描述

代码建库步骤如下:
// 建库 MySchool_db
CREATE DATABASE Myschool_db;

在这里插入图片描述
在这里插入图片描述

// 建表(先主后从)
// 创建年级表
CREATE TABLE grade(
	GradeID INT  NOT NULL AUTO_INCREMENT COMMENT '年级编号',
	GradeName VARCHAR(50) NOT NULL COMMENT '年级名称',
	PRIMARY KEY (GradeID)
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

在这里插入图片描述

// 创建科目表
DROP TABLE IF EXISTS subject;
CREATE TABLE subject  (
  SubjectNo int NOT NULL AUTO_INCREMENT COMMENT '课程编号',
  SubjectName varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '课程名称',
  ClassHour int NULL DEFAULT NULL COMMENT '学时',
  GradeID int NULL DEFAULT NULL COMMENT '年级编号',
  PRIMARY KEY (SubjectNo)
) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci

在这里插入图片描述

// 创建学生表
DROP TABLE IF EXISTS student;
CREATE TABLE student  (
  StudentNo int(0) NOT NULL COMMENT '学号',
  LoginPwd varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  StudentName varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学生姓名',
  Sex tinyint(1) NULL DEFAULT NULL COMMENT '性别,取值0或1',
  GradeId int(0) NULL DEFAULT NULL COMMENT '年级编号',
  Phone varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话,允许为空,即可选输入',
  Address varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址,允许为空,即可选输入',
  BornDate datetime(0) NULL DEFAULT NULL COMMENT '出生时间',
  Email varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱账号,允许为空,即可选输入',
  IdentityCard varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '身份证号',
  PRIMARY KEY (StudentNo) USING BTREE,
  UNIQUE INDEX IdentityCard(IdentityCard) USING BTREE,
  INDEX Email(Email) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

在这里插入图片描述

// 创建成绩表
CREATE TABLE `result`  (
  `StudentNo` int(0) NOT NULL COMMENT '学号',
  `SubjectNo` int(0) NOT NULL COMMENT '课程编号',
  `ExamDate` datetime(0) NOT NULL COMMENT '考试日期',
  `StudentResult` int(0) NOT NULL COMMENT '考试成绩',
  INDEX `SubjectNo`(`SubjectNo`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci

在这里插入图片描述

// 为subject表添加外键约束
ALTER TABLE subject ADD CONSTRAINT fk_subgra FOREIGN KEY (GradeID) REFERENCES grade (GradeID);
//为student表添加外键约束
ALTER TABLE student ADD CONSTRAINT fk_stugra FOREIGN KEY (GradeID) REFERENCES grade (GradeID);
结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这里实验就基本做完啦!

相关推荐

  1. 数据库开发与设计过程中的问题分析总结

    2024-01-22 09:54:03       60 阅读
  2. 设计数据库

    2024-01-22 09:54:03       32 阅读
  3. 数据库设计范式(数据库设计规则)

    2024-01-22 09:54:03       70 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-22 09:54:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-22 09:54:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-22 09:54:03       87 阅读
  4. Python语言-面向对象

    2024-01-22 09:54:03       96 阅读

热门阅读

  1. MySQL 简介

    2024-01-22 09:54:03       48 阅读
  2. Kafka 生产者投递内存池源码刨铣

    2024-01-22 09:54:03       51 阅读
  3. 如何发布自己的npm包

    2024-01-22 09:54:03       47 阅读
  4. wamp环境的组成

    2024-01-22 09:54:03       58 阅读
  5. MySQL视图

    2024-01-22 09:54:03       54 阅读
  6. linux 的nobody是什么用户? 对安全有没有影响?

    2024-01-22 09:54:03       54 阅读
  7. Vue记录

    Vue记录

    2024-01-22 09:54:03      51 阅读
  8. 2024 年 Vue.js 会发生什么

    2024-01-22 09:54:03       55 阅读
  9. v-model绑定vuex的state怎么实现?

    2024-01-22 09:54:03       55 阅读