良好的数据库设计是高效应用的基础,需要遵循规范化原则。
数据库规范化
- 第一范式(1NF):每列都是原子性的,不可再分
- 第二范式(2NF):满足1NF,且非主键列完全依赖于主键
- 第三范式(3NF):满足2NF,且消除传递依赖
实体关系模型
-- 学生表
CREATE TABLE students (
student_id INT PRIMARY KEY AUTO_INCREMENT,
student_no VARCHAR(20) UNIQUE NOT NULL,
name VARCHAR(50) NOT NULL,
gender ENUM('男', '女'),
birth_date DATE,
enrollment_date DATE
);
-- 课程表
CREATE TABLE courses (
course_id INT PRIMARY KEY AUTO_INCREMENT,
course_code VARCHAR(20) UNIQUE NOT NULL,
course_name VARCHAR(100) NOT NULL,
credit INT NOT NULL,
teacher_id INT
);
-- 教师表
CREATE TABLE teachers (
teacher_id INT PRIMARY KEY AUTO_INCREMENT,
teacher_no VARCHAR(20) UNIQUE NOT NULL,
name VARCHAR(50) NOT NULL,
title VARCHAR(50),
department VARCHAR(100)
);
-- 选课关系表(多对多关系)
CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY AUTO_INCREMENT,
student_id INT NOT NULL,
course_id INT NOT NULL,
enrollment_date DATE DEFAULT (CURRENT_DATE),
score DECIMAL(5,2) CHECK (score >= 0 AND score <= 100),
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id),
UNIQUE KEY uk_student_course (student_id, course_id)
);
-- 添加外键到课程表
ALTER TABLE courses
ADD CONSTRAINT fk_teacher
FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id);
表关系类型
- 一对一关系:一个表中的一条记录对应另一个表中的一条记录
- 一对多关系:一个表中的一条记录对应另一个表中的多条记录
- 多对多关系:通过中间表实现两个表的多对多关系
表设计最佳实践
-- 1. 使用有意义的表名和列名
-- 2. 使用适当的整数类型做主键
-- 3. 为常用查询字段创建索引
-- 4. 避免NULL值,使用DEFAULT
-- 5. 使用ENUM或SET替代字符串常量
-- 6. 大文本字段单独存放
-- 7. 考虑未来扩展性
-- 8. 记录创建和更新时间
-- 示例:完整的学生信息表
CREATE TABLE student_info (
id INT PRIMARY KEY AUTO_INCREMENT,
student_code VARCHAR(20) UNIQUE NOT NULL,
name VARCHAR(50) NOT NULL,
id_card VARCHAR(18) UNIQUE,
gender TINYINT DEFAULT 0 COMMENT '0:未知 1:男 2:女',
birth_date DATE,
phone VARCHAR(20),
email VARCHAR(100),
address VARCHAR(200),
status TINYINT DEFAULT 1 COMMENT '1:在读 2:毕业 3:休学',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_name (name),
INDEX idx_status (status),
INDEX idx_phone (phone)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
提示: 这是一个重要的概念,需要特别注意理解和掌握。
注意: 这是一个常见的错误点,请避免犯同样的错误。
评论
请 登录 后发表评论