|
11 | 11 |
|
12 | 12 | ## 什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员? |
13 | 13 |
|
14 | | -- **数据库** : 数据库(DataBase 简称 DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。 |
15 | | -- **数据库管理系统** : 数据库管理系统(Database Management System 简称 DBMS)是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库。 |
16 | | -- **数据库系统** : 数据库系统(Data Base System,简称 DBS)通常由软件、数据库和数据管理员(DBA)组成。 |
17 | | -- **数据库管理员** : 数据库管理员(Database Administrator, 简称 DBA)负责全面管理和控制数据库系统。 |
| 14 | +这四个概念描述了从数据本身到管理整个体系的不同层次,我们常用一个图书馆的例子来把它们串联起来理解。 |
| 15 | + |
| 16 | +- **数据库 (Database - DB):** 它就像是图书馆里,书架上存放的所有书籍和资料。从技术上讲,数据库就是按照一定数据模型组织、描述和储存起来的、可以被各种用户共享的结构化数据的集合。它就是我们最终要存取的核心——信息本身。 |
| 17 | +- **数据库管理系统 (Database Management System - DBMS):** 它就像是整个图书馆的管理系统,包括图书的分类编目规则、借阅归还流程、安全检查系统等等。从技术上讲,DBMS 是一种大型软件,比如我们常用的 MySQL、Oracle、PostgreSQL 软件。它的核心职责是科学地组织和存储数据、高效地获取和维护数据;为我们屏蔽了底层文件操作的复杂性,提供了一套标准接口(如 SQL)来操纵数据,并负责并发控制、事务管理、权限控制等复杂问题。 |
| 18 | +- **数据库系统 (Database System - DBS):** 它就是整个正常运转的图书馆。这是一个更大的概念,不仅包括书(DB)和管理系统(DBMS),还包括了硬件、应用和使用的人。 |
| 19 | +- **数据库管理员 (Database Administrator - DBA ):** 他就是图书馆的馆长,负责整个数据库系统正常运行。他的职责非常广泛,包括数据库的设计、安装、监控、性能调优、备份与恢复、安全管理等等,确保整个系统的稳定、高效和安全。 |
| 20 | + |
| 21 | +DB 和 DBMS 我们通常会搞混,这里再简单提一下:**通常我们说“用 MySQL 数据库”,其实是用 MySQL(DBMS)来管理一个或多个数据库(DB)。** |
| 22 | + |
| 23 | +## DBMS 有哪些主要的功能 |
| 24 | + |
| 25 | +DBMS 通常提供四大核心功能: |
| 26 | + |
| 27 | +1. **数据定义:** 这是 DBMS 的基础。它提供了一套数据定义语言(Data Definition Language - DDL),让我们能够创建、修改和删除数据库中的各种对象。这不仅仅是定义表的结构(比如字段名、数据类型),还包括定义视图、索引、触发器、存储过程等。 |
| 28 | +2. **数据操作:** 这是我们作为开发者日常使用最多的功能。它提供了一套数据操作语言(Data Manipulation Language - DML),核心就是我们熟悉的增、删、改、查(CRUD)操作。它让我们能够方便地对数据库中的数据进行操作和检索。 |
| 29 | +3. **数据控制:** 这是保证数据正确、安全、可靠的关键。通常包含并发控制、事务管理、完整性约束、权限控制、安全性限制等功能。 |
| 30 | +4. **数据库维护:** 这部分功能是为了保障数据库系统的长期稳定运行。它包括了数据的导入导出、数据库的备份与恢复、性能监控与分析、以及系统日志管理等。 |
| 31 | + |
| 32 | +## 你知道哪些类型的 DBMS? |
| 33 | + |
| 34 | +### 关系型数据库 |
| 35 | + |
| 36 | +除了我们最常用的关系型数据库(RDBMS),比如 MySQL(开源首选)、PostgreSQL(功能最全)、Oracle(企业级),它们基于严格的表结构和 SQL,非常适合结构化数据和需要事务保证的场景,例如银行交易、订单系统。 |
| 37 | + |
| 38 | +近年来,为了应对互联网应用带来的海量数据、高并发和多样化数据结构的需求,涌现出了一大批 NoSQL 和 NewSQL 数据库。 |
| 39 | + |
| 40 | +### NoSQL 数据库 |
| 41 | + |
| 42 | +它们的共同特点是为了极致的性能和水平扩展能力,在某些方面(通常是事务)做了妥协。 |
| 43 | + |
| 44 | +**1. 键值数据库,代表是 Redis。** |
| 45 | + |
| 46 | +- **特点:** 数据模型极其简单,就是一个巨大的 Map,通过 Key 来存取 Value。内存操作,性能极高。 |
| 47 | +- **适用场景:** 非常适合做缓存、会话存储、计数器等对读写性能要求极高的场景。 |
| 48 | + |
| 49 | +**2. 文档数据库,代表是 MongoDB。** |
| 50 | + |
| 51 | +- **特点:** 它存储的是半结构化的文档(比如 JSON/BSON),结构灵活,不需要预先定义表结构。 |
| 52 | +- **适用场景:** 特别适合那些数据结构多变、快速迭代的业务,比如用户画像、内容管理系统、日志存储等。 |
| 53 | + |
| 54 | +**3. 列式数据库,代表是 HBase, Cassandra。** |
| 55 | + |
| 56 | +- **特点:** 数据是按列族而不是按行来存储的。这使得它在对大量行进行少量列的读取时,性能极高。 |
| 57 | +- **适用场景:** 专为海量数据存储和分析设计,非常适合做大数据分析、监控数据存储、推荐系统等需要高吞吐量写入和范围扫描的场景。 |
| 58 | + |
| 59 | +**4. 图形数据库,代表是 Neo4j。** |
| 60 | + |
| 61 | +- **特点:** 数据模型是节点(Nodes)和边(Edges),专门用来存储和查询实体之间的复杂关系。 |
| 62 | +- **适用场景:** 在社交网络(好友关系)、推荐引擎(用户-商品关系)、知识图谱、欺诈检测(资金流动关系)等场景下,表现远超关系型数据库。 |
| 63 | + |
| 64 | +### NewSQL 数据库 |
| 65 | + |
| 66 | +由于 NoSQL 不支持事务,很多对于数据安全要去非常高的系统(比如财务系统、订单系统、交易系统)就不太适合使用了。不过,这类系统往往有存储大量数据的需求。 |
| 67 | + |
| 68 | +这些系统往往只能通过购买性能更强大的计算机,或者通过数据库中间件来提高存储能力。不过,前者的金钱成本太高,后者的开发成本太高。 |
| 69 | + |
| 70 | +于是,**NewSQL** 就来了! |
| 71 | + |
| 72 | +简单来说,NewSQL 就是:**分布式存储+SQL+事务** 。NewSQL 不仅具有 NoSQL 对海量数据的存储管理能力,还保持了传统数据库支持 ACID 和 SQL 等特性。因此,NewSQL 也可以称为 **分布式关系型数据库**。 |
| 73 | + |
| 74 | +NewSQL 数据库设计的一些目标: |
| 75 | + |
| 76 | +1. 横向扩展(Scale Out) : 通过增加机器的方式来提高系统的负载能力。与之类似的是 Scale Up(纵向扩展),升级硬件设备的方式来提高系统的负载能力。 |
| 77 | +2. 强一致性(Strict Consistency):在任意时刻,所有节点中的数据是一样的。 |
| 78 | +3. 高可用(High Availability):系统几乎可以一直提供服务。 |
| 79 | +4. 支持标准 SQL(Structured Query Language) :PostgreSQL、MySQL、Oracle 等关系型数据库都支持 SQL 。 |
| 80 | +5. 事务(ACID) : 原子性(Atomicity)、一致性(Consistency)、 隔离性(Isolation); 持久性(Durability)。 |
| 81 | +6. 兼容主流关系型数据库 : 兼容 MySQL、Oracle、PostgreSQL 等常用关系型数据库。 |
| 82 | +7. 云原生 (Cloud Native):可在公有云、私有云、混合云中实现部署工具化、自动化。 |
| 83 | +8. HTAP(Hybrid Transactional/Analytical Processing) :支持 OLTP 和 OLAP 混合处理。 |
| 84 | + |
| 85 | +NewSQL 数据库代表:Google 的 F1/Spanner、阿里的 [OceanBase](https://open.oceanbase.com/)、PingCAP 的 [TiDB](https://pingcap.com/zh/product-community/) 。 |
18 | 86 |
|
19 | 87 | ## 什么是元组, 码, 候选码, 主码, 外码, 主属性, 非主属性? |
20 | 88 |
|
@@ -73,8 +141,20 @@ ER 图由下面 3 个要素组成: |
73 | 141 |
|
74 | 142 | ## 主键和外键有什么区别? |
75 | 143 |
|
76 | | -- **主键(主码)**:主键用于唯一标识一个元组,不能有重复,不允许为空。一个表只能有一个主键。 |
77 | | -- **外键(外码)**:外键用来和其他表建立联系用,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键。 |
| 144 | +从定义和属性上看,它们的区别是: |
| 145 | + |
| 146 | +- **主键 (Primary Key):** 它的核心作用是唯一标识表中的每一行数据。因此,主键列的值必须是唯一的 (Unique) 且不能为空 (Not Null)。一张表只能有一个主键。主键保证了实体完整性。 |
| 147 | +- **外键 (Foreign Key):** 它的核心作用是建立并强制两张表之间的关联关系。一张表中的外键列,其值必须对应另一张表中某行的主键值(或者是一个 NULL 值)。因此,外键的值可以重复,也可以为空。一张表可以有多个外键,分别关联到不同的表。外键保证了引用完整性。 |
| 148 | + |
| 149 | +用一个简单的电商例子来说明:假设我们有两张表:`users` (用户表) 和 `orders` (订单表)。 |
| 150 | + |
| 151 | +- 在 `users` 表中,`user_id` 列是**主键**。每个用户的 `user_id` 都是独一无二的,我们用它来区分张三和李四。 |
| 152 | +- 在 `orders` 表中,`order_id` 是它自己的**主键**。同时,它会有一个 `user_id` 列,这个列就是一个**外键**,它引用了 `users` 表的 `user_id` 主键。 |
| 153 | + |
| 154 | +这个外键约束就保证了: |
| 155 | + |
| 156 | +1. 你不能创建一个不属于任何已知用户的订单( `user_id` 在 `users` 表中不存在)。 |
| 157 | +2. 你不能删除一个已经下了订单的用户(除非设置了级联删除等特殊规则)。 |
78 | 158 |
|
79 | 159 | ## 为什么不推荐使用外键与级联? |
80 | 160 |
|
|
0 commit comments