数据库介绍
什么是数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
数据库的基本特征
- 数据结构化:数据按照一定的数据模型组织和描述
- 数据共享性:多个用户可以同时访问和使用数据
- 数据独立性:数据与应用程序相互独立
- 数据持久性:数据长期保存在存储设备中
- 数据完整性:保证数据的正确性和一致性
数据库类型
关系型数据库
关系型数据库基于关系模型来组织数据,使用表格(二维表)来存储数据。
特点:
- 数据以表格形式存储
- 每个表有固定的列(字段)和行(记录)
- 支持SQL语言操作
- 数据之间存在关系约束
常见的关系型数据库:
- MySQL
- PostgreSQL
- SQLite
- Oracle
- SQL Server
- MariaDB
非关系型数据库
非关系型数据库不使用传统的表格结构,而是使用键值对、文档、列族或图形等方式存储数据。
类型:
- 键值存储:Redis、Memcached
- 文档存储:MongoDB、CouchDB
- 列族存储:Cassandra、HBase
- 图形数据库:Neo4j、ArangoDB
关系型数据库基本概念
实体(Entity)
现实世界中可以区分的事物,如学生、课程、教师等。
属性(Attribute)
实体的特性或特征,如学生有姓名、年龄、学号等属性。
关系(Relationship)
实体之间的联系,如学生和课程之间的"选课"关系。
主键(Primary Key)
唯一标识表中每条记录的字段,不能重复且不能为空。
-- 学生表中的学号作为主键
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);
外键(Foreign Key)
用于建立两个表之间关系的字段,引用另一个表的主键。
-- 选课表中的学生ID作为外键,引用学生表的主键
CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY,
student_id INT,
course_id INT,
FOREIGN KEY (student_id) REFERENCES students(student_id)
);
数据库设计原则
三范式(3NF)
- 第一范式(1NF):确保每列都是原子性的,不可再分割
- 第二范式(2NF):在1NF基础上,非主键列完全依赖于主键
- 第三范式(3NF):在2NF基础上,非主键列之间不存在传递依赖
设计原则
- 避免数据冗余:相同数据不要重复存储
- 保证数据一致性:通过约束确保数据的有效性
- 提高查询效率:合理设计索引和表结构
- 便于扩展:考虑未来的需求变化
数据库管理系统(DBMS)
数据库管理系统是用于管理数据库的软件,提供数据的定义、操作、控制等功能。
主要功能
- 数据定义语言(DDL):创建、修改、删除数据库对象
- 数据操作语言(DML):插入、更新、删除数据
- 数据查询语言(DQL):查询和检索数据
- 数据控制语言(DCL):控制用户权限和访问
- 事务控制语言(TCL):管理数据库事务
MySQL的优势
- 开源免费:无需支付许可费用
- 性能优秀:适合高并发访问
- 易于使用:学习曲线平缓
- 社区支持:丰富的文档和解决方案
- 兼容性好:支持多种操作系统和编程语言
- 扩展性强:支持主从复制、集群等功能
数据库在Web应用中的作用
数据存储
- 用户信息(用户名、密码、邮箱等)
- 内容数据(文章、商品、评论等)
- 配置信息(系统设置、用户偏好等)
- 日志数据(访问日志、操作日志等)
数据管理
- 用户的增删改查操作
- 内容的发布、编辑、删除
- 统计分析和报表生成
- 数据备份和恢复
业务逻辑支持
- 用户认证和授权
- 购物车和订单处理
- 评论和评分系统
- 搜索和推荐功能
实践示例:设计学生管理系统数据库
需求分析
我们需要管理学生的基本信息和课程成绩:
- 学生信息:学号、姓名、性别、年龄、班级
- 课程信息:课程编号、课程名称、学分、教师
- 成绩信息:学生、课程、分数、学期
数据库设计
-- 创建学生表
CREATE TABLE students (
student_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
gender ENUM('男', '女') NOT NULL,
age INT,
class_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建班级表
CREATE TABLE classes (
class_id INT PRIMARY KEY AUTO_INCREMENT,
class_name VARCHAR(50) NOT NULL,
grade VARCHAR(20) NOT NULL
);
-- 创建课程表
CREATE TABLE courses (
course_id INT PRIMARY KEY AUTO_INCREMENT,
course_name VARCHAR(100) NOT NULL,
credits DECIMAL(3,1) NOT NULL,
teacher_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建教师表
CREATE TABLE teachers (
teacher_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
department VARCHAR(50) NOT NULL
);
-- 创建成绩表
CREATE TABLE scores (
score_id INT PRIMARY KEY AUTO_INCREMENT,
student_id INT NOT NULL,
course_id INT NOT NULL,
score DECIMAL(5,2) NOT NULL,
semester VARCHAR(20) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
-- 添加外键约束
ALTER TABLE students
ADD FOREIGN KEY (class_id) REFERENCES classes(class_id);
ALTER TABLE courses
ADD FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id);
总结
数据库是现代Web应用的核心组件,理解数据库的基本概念和设计原则对于开发高质量的应用程序至关重要。MySQL作为最受欢迎的开源关系型数据库,为PHP开发者提供了强大而可靠的数据存储解决方案。
在本节中,我们学习了:
- 数据库的基本概念和类型
- 关系型数据库的核心术语
- 数据库设计原则
- MySQL的优势和应用场景
- 实际的数据库设计案例
这些知识将为后续学习SQL语言和PHP数据库编程打下坚实的基础。