第01章 数据库概述

news/2025/3/16 23:22:32/文章来源:https://www.cnblogs.com/kokoa/p/18775956

第01章 数据库概述

1. 为什么要使用数据库

  • 持久化 (Persistence): 把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以“固化”,而持久化的实现过程大多通过各种关系数据库来完成。
  • 持久化的主要作用: 将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。

2. 数据库与数据库管理系统

2.1 数据库的相关概念

  • DB (Database): 即存储数据的“仓库”,其本质是一个文件系统。它保存了一系列有组织的数据。
  • DBMS (Database Management System): 是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制。用户通过数据库管理系统访问数据库中表内的数据。
  • SQL (Structured Query Language): 专门用来与数据库通信的语言。

2.2 数据库与数据库管理系统的关系

数据库管理系统 (DBMS) 可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体用户的数据。

2.3 常见的数据库管理系统排名 (DBMS)

目前互联网上常见的数据库管理软件有 Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access、Sybase、Informix 这几种。以下是 2021 年 DB-Engines Ranking 对各数据库受欢迎程度进行调查后的统计结果:

  • Oracle
  • MySQL
  • Microsoft SQL Server
  • PostgreSQL
  • MongoDB
  • Redis
  • IBM Db2
  • Elasticsearch
  • SQLite
  • Cassandra

2.4 常见的数据库介绍

Oracle

  • 1979 年,Oracle 2 诞生,它是第一个商用的 RDBMS(关系型数据库管理系统)。
  • 2007 年,总计 85 亿美金收购 BEA Systems。
  • 2009 年,总计 74 亿美金收购 SUN。此前的 2008 年,SUN 以 10 亿美金收购 MySQL。意味着 Oracle 同时拥有了 MySQL 的管理权,至此 Oracle 在数据库领域中成为绝对的领导者。

SQL Server

  • SQL Server 是微软开发的大型商业数据库,诞生于 1989 年。C#、.net 等语言常使用,与 WinNT 完全集成,也可以很好地与 Microsoft BackOffice 产品集成。

DB2

  • IBM 公司的数据库产品,收费的。常应用在银行系统中。

PostgreSQL

  • PostgreSQL 的稳定性极强,最符合 SQL 标准,开放源码,具备商业级 DBMS 质量。PG 对数据量大的文本以及 SQL 处理较快。

SQLite

  • 嵌入式的小型数据库,应用在手机端。零配置,SQLite3 不用安装,不用配置,不用启动,关闭或者配置数据库实例。当系统崩溃后不用做任何恢复操作,再下次使用数据库的时候自动恢复。

Informix

  • IBM 公司出品,取自 Information 和 Unix 的结合,它是第一个被移植到 Linux 上的商业数据库产品。仅运行于 unix/linux 平台,命令行操作。性能较高,支持集群,适应于安全性要求极高的系统,尤其是银行,证券系统的应用。

3. MySQL 介绍

3.1 概述

  • MySQL 是一个开放源代码的关系型数据库管理系统,由瑞典 MySQL AB(创始人 Michael Widenius)公司 1995 年开发,迅速成为开源数据库的 No.1。
  • 2008 被 Sun 收购(10 亿美金),2009 年 Sun 被 Oracle 收购。MariaDB 应运而生。(MySQL 的创造者担心 MySQL 有闭源的风险,因此创建了 MySQL 的分支项目 MariaDB)
  • MySQL 版本之后分为社区版和商业版。
  • MySQL 是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
  • MySQL 是开源的,所以你不需要支付额外的费用。
  • MySQL 是可以定制的,采用了 GPL(GNU General Public License)协议,你可以修改源码来开发自己的 MySQL 系统。
  • MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL 支持大型数据库,支持 5000 万条记录的数据库仓库,32 位系统文件最大可支持 4GB,64 位系统支持最大的表文件为 8TB。
  • MySQL 使用标准的 SQL 数据语言形式。
  • MySQL 可以允许运行多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP 和 Ruby 等。

3.2 MySQL 发展史重大事件

  • 1979 年: Michael Widenius 用 BASIC 设计了一个报表工具 Unireg,这是一个简单而简单的表格的存储引擎,是存储引擎解决的服务,但不支持 SQL。
  • 1996 年: Michael Widenius 和 David Axmark 一起协作,写出 MySQL 的第一个版本,此时还只是小范围使用,几个月后直接发布了 3.11 版本。
  • 1999 年: MySQL 与 Sleepycat 公司合作,MySQL 提供了支持事务的 BerkeleyDB 存储引擎。后来由于这个引擎的许多问题,MySQL 5.1 以后不再被介绍到其他地方了。
  • 2001 年: MySQL 开始集成 InnoDB 存储引擎。
  • 2005 年: MySQL 5.0 发布,这是一个里程碑的版本,实现了许多功能特性。同年 5 月,Oracle 收购了开发 InnoDB 存储引擎的 Innobase Oy 公司,预示着不久后对 MySQL 的收购。
  • 2009 年: Oracle 公司以 74 亿美元收购 Sun 公司,自此 MySQL 数据库进入 Oracle 时代。
  • 2015 年: MySQL 5.6 GA 版本发布。
  • 2016 年 9 月: MySQL 发布里程碑版本 MySQL 8.0.0。
  • 2018 年 4 月: MySQL 8.0.11 GA 版本正式发布。

3.3 关于 MySQL 8.0

MySQL 从 5.7 版本直接跳跃发布了 8.0 版本,可见这是一个令人兴奋的里程碑版本。MySQL 8 版本在功能上做了显著的改进与增强,开发者对 MySQL 的源代码进行了重构,最突出的一点是对 MySQL Optimizer 优化器进行了改进。不仅在速度上得到了改善,还为用户带来了更好的性能和更棒的体验。

3.4 为什么选择 MySQL?

  • 开放源代码,使用成本低。
  • 性能卓越,服务稳定。
  • 软件体积小,使用简单,并且易于维护。
  • 历史悠久,社区用户非常活跃,遇到问题可以寻求帮助。
  • 许多互联网公司在用,经过了时间的验证。

3.5 Oracle vs MySQL

  • Oracle: 更适合大型跨国企业的使用,因为他们对费用不敏感,但是对性能要求以及安全性有更高的要求。
  • MySQL: 由于其体积小、速度快、总体拥有成本低,可处理上千万条记录的大型数据库,尤其是开放源码这一特点,使得很多互联网公司、中小型网站选择了 MySQL 作为网站数据库(Facebook, Twitter, YouTube, 阿里巴巴/蚂蚁金服, 去哪儿, 美团外卖, 腾讯)。

4. RDBMS 与非 RDBMS

4.1 关系型数据库 (RDBMS)

4.1.1 实质

  • 这种类型的数据库是最古老的数据库类型,关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。
  • 关系型数据库以行(row)列(column)的形式存储数据,以便于用户理解。这一系列的行和列被称为表。

4.1.2 优势

  • 复杂查询: 可以用 SQL 语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  • 事务支持: 使得对于安全性能很高的数据访问要求得以实现。

4.2 非关系型数据库 (非 RDBMS)

4.2.1 介绍

  • 非关系型数据库,可看成传统关系型数据库的功能简化版本,基于键值对存储数据,不需要经过 SQL 层的解析,性能非常高。同时,通过减少不常用的功能,进一步提高性能。
  • 目前基本上大部分主流的非关系型数据库都是免费的。

4.2.2 非关系型数据库的分类

  • 键值型数据库: 通过 Key-Value 键值的方式来存储数据,其中 Key 和 Value 可以是简单的对象,也可以是复杂的对象。典型产品:Redis。
  • 文档型数据库: 可存放并获取文档,可以是 XML、JSON 等格式。典型产品:MongoDB。
  • 搜索引擎数据库: 应用在搜索引擎领域的数据存储形式,核心原理是“倒排索引”。典型产品:Solr、Elasticsearch。
  • 列式数据库: 将数据按照列存储到数据库中,适合于分布式文件系统。典型产品:HBase。
  • 图形数据库: 存储图形关系的数据库,利用图这种数据结构存储了实体(对象)之间的关系。典型产品:Neo4J。

4.2.3 NoSQL 的演变

  • NoSQL 对 SQL 做出了很好的补充,比如实际开发中,有很多业务需求,其实并不需要完整的关系型数据库功能,非关系型数据库的功能就足够使用了。这种情况下,使用性能更高、成本更低的非关系型数据库当然是最明显的选择。比如:日志收集、排行榜、定时器等。

4.3 小结

  • NoSQL 的分类很多,即便如此,在 DBMS 排名中,还是 SQL 阵营的比重更大,影响力前 5 的 DBMS 中有 4 个是关系型数据库,而排名前 20 的 DBMS 中也有 12 个是关系型数据库。所以说,掌握 SQL 是非常有必要的。

5. 关系型数据库设计规则

5.1 表、记录、字段

E-R(entity-relationship,实体-联系)模型中有三个主要概念是: 实体集属性联系集

一个实体集(class)对应于数据库中的一个表(table),

一个实体(instance)则对应于数据库表 中的一行(row),也称为一条记录(record)。

一个属性(attribute)对应于数据库表中的一列 (column),也称为一个字段(field)。

  • 表 (Table): 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
  • 记录 (Record): 表中的一行数据,也称为一条记录。
  • 字段 (Field): 表中的一列数据,也称为一个字段。

ORM 思想 (Object Relational Mapping) 体现:

  • 数据库中的一个表 <---> Java 或 Python 中的一个类
  • 表中的一条数据 <---> 类中的一个对象(或实体)
  • 表中的一个列 <---> 类中的一个字段、属性 (field)

5.2 表的关联关系

  • 一对一关联 (one-to-one): 在实际的开发中应用不多,因为一对一可以创建成一张表。

    • 举例:设计 学生表:学号、姓名、手机号码、班级、系别、身份证号码、家庭住址、籍贯、紧急 联系人、...
      • 拆为两个表:两个表的记录是一一对应关系。
      • 基础信息表(常用信息):学号、姓名、手机号码、班级、系别
      • 档案信息表(不常用信息):学号、身份证号码、家庭住址、籍贯、紧急联系人、...
    • 两种建表原则:
      • 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一。
      • 外键是主键:主表的主键和从表的主键,形成主外键关系。
  • 一对多关联 (one-to-many): 常见实例场景:客户表和订单表,分类表和商品表,部门表和员工表。

    • 举例:
      • 员工表:编号、姓名、...、所属部门
      • 部门表:编号、名称、简介
    • 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
  • 多对多关联 (many-to-many): 要表示多对多关系,必须创建第三个表,该表通常称为联接表,它将多对多关系划分为两个一对多关系。

    举例1:学生-课程 学生信息表:一行代表一个学生的信息(学号、姓名、手机号码、班级、系别...)

  • 自我引用 (Self reference): 表中的某个字段引用同一表中的另一个字段。

5.3 表的关联关系示例

5.3.1 一对一关联示例

  • 学生表:
    • 学号、姓名、手机号码、班级、系别
  • 档案信息表:
    • 学号、身份证号码、家庭住址、籍贯、紧急联系人

5.3.2 一对多关联示例

  • 员工表:
    • 编号、姓名、所属部门
  • 部门表:
    • 编号、名称、简介

5.3.3 多对多关联示例

  • 学生信息表:
    • 学号、姓名、手机号码、班级、系别
  • 课程信息表:
    • 课程编号、课程名称
  • 学生选课表:
    • 学号、课程编号、成绩

5.3.4 自我引用示例

  • 员工表:
    • 员工编号、姓名、部门编号、主管编号

注:学习MySQL时的笔记,笔记来源是尚硅谷的课件

  • 学习的视频:02-为什么使用数据库及数据库常用概念_哔哩哔哩_bilibili

  • 课件整理:deepseek

  • [MySQL基础课件笔记目录]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900045.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】20250316

【每日一题】曲线 \(\displaystyle y=3(x^2+x-\sqrt{4x^2+3})e^{-2x^2}\) 在点 \((-1,0)\) 处的切线方程为_________.如图所示,取一段长为 \(12\) 的绳子,如果把这段绳子的两个端点分别固定在画图板上不同的两点 \(F_1\) 和 \(F_2\) 处,当绳长大于 \(F_1\) 和 \(F_2\) 之间…

foobar2000 v2.24.3 汉化版

foobar2000 v2.24.3 汉化版 -----------------------【软件截图】---------------------- -----------------------【软件介绍】---------------------- foobar2000 是一个 Windows 平台下的高级音频播放器.包含完全支持 unicode 及支持播放增益的高级标签功能. 特色: * 支持的…

拉格朗日插值算法

首先介绍下作用 在平面上给定 n 个点,求一条多项式图像穿过所有的点 (每个点横坐标不同)由浅入深,首先想一个悬浮点 1 ,它在除 1 以外给定的点的横坐标上函数值都是 0 。已知它的横坐标 \(x_1\) , 怎么用函数图像表示 我们一拍脑袋发现,可以这么表示 \[f1(x) = \prod_{i =…

本地部署Gemma3模型

本地部署Gemma3模型 1. 拉取并运行 Ollama 容器 # 拉取 Ollama 镜像 docker pull ollama/ollama# 运行 Ollama 容器 docker run -d --gpus all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama2. 进入容器并部署 Gemma3 模型(默认4B版 ) # 进入 Ollama 容…

Anaconda中启动Jupyter lab的方法

Anaconda中启动Jupyter lab的方法: 1、在Anaconda Prompt中,使用命令来启动:jupyter lab 2、在Anaconda界面中点击Jupyter lab下方的launch按钮启动,如下图所示:

React+Next.js+MaterialUI+Toolpad技术栈学习——安装

今天跟大家分享一个React+Next.js+MaterialUI技术栈的前端框架Toolpad。相关资源MaterialUI Toolpad框架效果安装运行安装命令npx create-toolpad-app@latest your-app cd your-app npm run dev文件结构 无身份认证 ├── app │ ├── (dashboard) │ │ ├── layou…

测试驱动开发(TDD)浅析

测试驱动开发(TDD:Test Driven Development)是敏捷开发中的一项核心实践,推崇通过测试来驱动整个开发的进行。TDD有别于传统“先编码,后测试”的开发过程,而是要求在编写业务代码之前,先编写测试用例。TDD的概念大致在上世纪90年代随着极限编程(XP:Extreme Programmin…

(18).命令模式

命令模式 命令模式的核心思想是将请求封装为个对象,将其作为命令发起者和接收者的中介,而抽象出来的命令对象又使得能够对一系列请求进行操作,如对请求进行排队,记录请求日志以及支持可撤销的操作等。命令模式参与者:◇命令的执行者(接收者Receiver):它单纯的只具体实现了功…

学嵌入式C语言,看这一篇就够了(5)

C语言的运算符 学习编程语言,应该遵循“字-->词-->句-->段--->章”,对于一条有意义的语句而言,是离不开标点符号的运算符指明要进行的运算和操作,操作数是指运算符的操作对象,根据运算符操作数的数目不同,C语言标准把运算符分为三种:单目运算符(一元运算符…

20242313 2024-2025-2 《Python程序设计》实验一报告

20242313 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级:2423 姓名:曾海鹏 学号:20242313 实验教师:王志强 实验日期:2025年3月16日 必修/选修:公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序,并…

nn.Embedding()函数详解

nn.Embedding()函数详解 nn.Embedding()函数:随机初始化词向量,词向量在正态分布N(0,1)中随机取值 输入: torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False, _weight=None) num…