网站首页 > 技术文章 正文
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()函数合并数据
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)