网站首页 > 技术文章 正文
3.1 数据库设计步骤
数据库设计乃一项系统性工程,通常涵盖如下阶段:
- 需求分析 明晰任务目标。 厘定数据对象及属性。 界定对象间的关系。
- 概念结构设计 绘制实体 - 关系图(E-R 图)。 对现实世界中的实体和关系予以抽象。
- 逻辑结构设计 将 E-R 图转化为数据库表结构。 规划表、字段、主键和外键。
- 物理设计 创建数据库和表。 优化读写性能。
- 性能优化 增进查询效率。
3.2 需求分析(以学生选课系统为例)
3.2.1 任务目标
设计一个学生选课数据库,需达成以下功能:
- 维系学生基本信息(学号、姓名、性别等)。
- 维护课程基本信息(课程编号、名称、学分等)。
- 记载学生选课信息。
- 存储课程成绩。
3.2.2 数据对象及属性
实体 | 属性 | 主属性(唯一标识) |
学生 | 学生编号、学号、姓名、性别、出生日期、班级 | 学生编号 |
课程 | 课程编号、课程名称、学分 | 课程编号 |
选课信息 | 学生编号、课程编号、成绩 | 无(联合主键) |
3.2.3 对象间关系
- 学生与课程:多对多关系(一名学生可选择多门课程,一门课程可被多名学生选取)。
- 学生与选课信息:一对多关系(一个学生对应多条选课记录)。
- 课程与选课信息:一对多关系(一门课程对应多条选课记录)。
3.3 实体 - 关系模型(E - R 图)
3.3.1 E - R 图基本元素
- 实体关系图(E - R 图):自现实世界中抽取出实体类型以及实体之间的联络,阐释现实世界中实体对象彼此间的关系。
- 实体:以矩形作为表征,标注实体的名称(例如“学生”“课程”)。
- 属性:通过椭圆形加以展现,经由无向边连接至实体(诸如“学号”“课程名称”)。
- 关系:运用菱形来表示,标注关系的类别(比如“选课”),并且通过无向边连接实体,标注关系的类型(如1:1、1:n、m:n)。
3.3.2 学生选课系统 E - R 图
3.4 表设计原则与实现
3.4.1 表设计原则
- 一表一实体:每一个表描绘一个实体或者实体之间的关系。
- 避免重复字段:凭借外键关联降低冗余程度。
- 字段原子性:存储原始的数据(例如“出生日期”而非“年龄”)。
- 主键唯一性:每张表都必须具备主键以对表中的记录进行唯一标识。
- 外键关联性:利用外键确保表间的关系。
3.4.2 表结构设计
学生表(student)
字段名 | 数据类型 | 约束 | 说明 |
student_id | VARCHAR | 主键(唯一标识) | 学生编号 |
student_no | VARCHAR | 唯一 | 学号 |
name | VARCHAR | 姓名 | |
gender | CHAR(1) | 性别 | |
birthday | DATE | 出生日期 | |
class | VARCHAR | 班级 |
课程表(course)
字段名 | 数据类型 | 约束 | 说明 |
course_id | VARCHAR | 主键(唯一标识) | 课程编号 |
course_name | VARCHAR | 课程名称 | |
credit | INT | 学分 |
选课表(selection)
字段名 | 数据类型 | 约束 | 说明 |
student_id | VARCHAR | 外键(关联student.student_id) | 学生编号 |
course_id | VARCHAR | 外键(关联course.course_id) | 课程编号 |
grade | DECIMAL | 成绩 | |
主键 | 联合主键(student_id, course_id) | 确保唯一选课记录 |
3.5 SQL 实现示例
3.5.1 创建数据库与表
-- 创建数据库
CREATE DATABASE StudentCourseDB;
USE StudentCourseDB;
-- 创建学生表
CREATE TABLE student (
student_id VARCHAR(20) PRIMARY KEY,
student_no VARCHAR(20) UNIQUE,
name VARCHAR(50),
gender CHAR(1),
birthday DATE,
class VARCHAR(50)
);
-- 创建课程表
CREATE TABLE course (
course_id VARCHAR(20) PRIMARY KEY,
course_name VARCHAR(100),
credit INT
);
-- 创建选课表
CREATE TABLE selection (
student_id VARCHAR(20),
course_id VARCHAR(20),
grade DECIMAL(5, 2),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES student(student_id),
FOREIGN KEY (course_id) REFERENCES course(course_id)
);
3.5.2 数据关联示例
-- 查询某学生的所有课程及成绩:
SELECT c.course_name, s.grade
FROM selection s
JOIN course c ON s.course_id = c.course_id
WHERE s.student_id = '1308013101';
-- 查询某课程的所有学生及成绩:
SELECT st.name, s.grade
FROM selection s
JOIN student st ON s.student_id = st.student_id
WHERE s.course_id = 'D1';
猜你喜欢
- 2025-06-10 如何理解Mysql的索引及他们的原理?
- 2025-06-10 性能测试——测试常见的指标(测试性能指标有哪些)
- 2025-06-10 mysql中的分区表和合并表详解(一个常见知识点)
- 2025-06-10 Oracle优化-建立索引(三)(oracle 索引优化)
- 2025-06-10 MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
- 2025-06-10 你写的 SQL 查询为什么总是慢?揭秘 MySQL 索引机制与联合索引
- 2025-06-10 回表、覆盖索引(sqlserver覆盖索引)
- 2025-06-10 数据库主从复制,读写分离,分库分表,分区详解
- 2025-06-10 如何在在量化交易程序中高效使用sqlite
- 2025-06-10 「Python数据分析」Pandas进阶,使用merge()函数合并数据
- 1508℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 520℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 491℃MySQL service启动脚本浅析(r12笔记第59天)
- 470℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 468℃启用MySQL查询缓存(mysql8.0查询缓存)
- 448℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 428℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 425℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)