优秀的编程知识分享平台

网站首页 > 技术文章 正文

3、关系数据库的设计(关系数据库设计包括哪些)

nanyue 2025-06-10 17:00:39 技术文章 9 ℃

3.1 数据库设计步骤

数据库设计乃一项系统性工程,通常涵盖如下阶段:

  1. 需求分析 明晰任务目标。 厘定数据对象及属性。 界定对象间的关系。
  2. 概念结构设计 绘制实体 - 关系图(E-R 图)。 对现实世界中的实体和关系予以抽象。
  3. 逻辑结构设计 将 E-R 图转化为数据库表结构。 规划表、字段、主键和外键。
  4. 物理设计 创建数据库和表。 优化读写性能。
  5. 性能优化 增进查询效率。

3.2 需求分析(以学生选课系统为例)

3.2.1 任务目标

设计一个学生选课数据库,需达成以下功能:

  1. 维系学生基本信息(学号、姓名、性别等)。
  2. 维护课程基本信息(课程编号、名称、学分等)。
  3. 记载学生选课信息。
  4. 存储课程成绩。

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';
最近发表
标签列表