数据库基本概念
1. 数据(Data)
数据是指对客观事物的属性进行描述并可供鉴别的符号记录。
它不仅包括狭义的数值型数字,还包括字母、文字、文本、图形、图像、音频、视频等多种表现形式。数据是信息的原始载体,本身未经加工时意义有限,只有经过处理、解释和组织之后,才能转化为有价值的信息。
要点:
- 数据是客观事实的反映
- 数据有多种表现形式,不局限于数字
- 数据是信息的原材料
2. 数据库(Database,DB)
数据库是按照一定数据结构组织、存储和管理的数据集合。
这些数据被存放在结构化的数据表(Table)中,表由行(记录,Record)和列(字段,Field)构成。数据表之间通过关联字段(外键等)相互连接,共同反映客观事物之间的本质联系。
数据库的核心优势:
- 数据独立性:应用程序与数据存储相互隔离,互不影响
- 数据共享性:多用户、多应用可同时访问同一数据库
- 低冗余度:通过规范化设计,避免数据重复存储
- 数据一致性:通过约束机制保证数据准确有效
3. 数据库管理系统(Database Management System,DBMS)
数据库管理系统是位于用户(或应用程序)与操作系统之间的一层数据管理软件,用于定义、建立、操纵、控制和维护数据库。
主要功能:
- 数据定义(DDL):创建、修改、删除数据库对象(表、索引、视图等)
- 数据操纵(DML):对数据进行增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)
- 数据控制(DCL):权限管理、安全性控制
- 事务管理:保证操作的原子性、一致性、隔离性、持久性(ACID)
常见DBMS:
| 类型 | 代表产品 |
|---|
| 开源关系型 | MySQL、PostgreSQL |
| 商业关系型 | Oracle、SQL Server、DB2 |
| 云原生 | Amazon RDS、TiDB、Snowflake |
| NoSQL(非关系型) | MongoDB(文档型)、Redis(键值型)、Neo4j(图数据库) |
4. 数据库应用程序(Database Application System,DBAS)
数据库应用程序是在数据库管理系统的基础上,使用特定的编程语言和数据库操作语法(如SQL),开发出来的直接面向终端用户的应用软件。
它为用户提供友好的交互界面(图形界面或命令行),使用户无需了解底层数据库技术细节,即可完成数据的录入、查询、修改、删除、统计分析等操作。
典型应用示例:
- 企业资源计划系统(ERP)
- 客户关系管理系统(CRM)
- 电商网站后台订单管理
- 图书馆借阅管理系统
- 医院挂号与病历管理系统
DBAS与DBMS的关系:
用户 → 数据库应用程序(DBAS)→ 数据库管理系统(DBMS)→ 数据库(DB)
数据库的类型
数据库可以从多个维度进行分类,最常见的分类方式是按数据模型和按部署架构划分。
一、按数据模型分类(最核心的分类方式)
数据模型决定了数据库如何组织、存储和操作数据,是数据库最根本的分类标准。
1. 关系型数据库(Relational Database,RDBMS)
关系型数据库采用关系模型来组织数据,数据以二维表(Table)的形式存储,表与表之间通过主键(Primary Key)和外键(Foreign Key)建立关联。
-
数据以行(记录)和列(字段) 构成的表格存储
-
使用结构化查询语言(SQL) 进行数据操作
-
支持事务(ACID) 特性,保证数据的完整性和一致性
-
数据之间有严格的约束关系(实体完整性、参照完整性、用户定义完整性)
-
适用场景: 金融系统、ERP、CRM、电商订单管理、企业信息管理系统等需要强一致性和复杂关联查询的场景
-
常见产品:
- MySQL(开源,互联网应用广泛)
- PostgreSQL(开源,功能最强大的开源关系型数据库)
- Oracle Database(商业,大型企业级应用)
- Microsoft SQL Server(商业,Windows生态为主)
- MariaDB(MySQL的分支,开源)
- IBM Db2(商业,大型机/金融行业)
2. 非关系型数据库(NoSQL,Not Only SQL)
NoSQL数据库是为了应对关系型数据库在高并发、海量数据、灵活数据结构等场景下的局限性而发展起来的。它不强制使用SQL,且通常不要求固定的表结构。
(1)键值型数据库(Key-Value Store)
数据以键值对(Key-Value Pair) 的形式存储,通过Key快速访问对应的Value。Value可以是任意类型的数据(字符串、JSON、二进制文件等)。
(2)文档型数据库(Document Store)
以文档(Document) 为基本存储单元,通常使用JSON、BSON、XML等格式存储半结构化数据。每个文档可以拥有独立的字段结构,不需要预先定义Schema。
-
Schema灵活,字段可动态增减
-
文档结构更接近面向对象的数据模型,与应用程序代码亲和度高
-
支持文档内部的嵌套查询,但多文档关联查询能力较弱
-
适用场景: 内容管理系统(CMS)、博客平台、用户画像、物联网数据采集、日志存储
-
常见产品: MongoDB、CouchDB、Amazon DocumentDB
(3)列族型数据库(Column-Family Store / Wide-Column Store)
数据以列族(Column Family) 为单位进行组织,每一行可以有不同数量的列,且列是动态的。它并非将一张大表完整存储,而是按列族分别存储,适合读写少数列的场景。
(4)图数据库(Graph Database)
以节点(Node) 和边(Edge) 为核心数据结构来存储实体及其之间的关系。关系在图中是一等公民,可以被直接查询和遍历。
-
关系查询效率极高,尤其适合多跳关联查询
-
数据模型直观,符合人类对关系的认知
-
支持图论算法(最短路径、社区发现、PageRank等)
-
适用场景: 社交网络关系分析、知识图谱、推荐引擎(如"好友的好友")、反欺诈(资金链路追踪)
-
常见产品: Neo4j、Amazon Neptune、JanusGraph、ArangoDB
3. NewSQL 数据库
NewSQL是一类兼具关系型数据库的ACID事务能力与NoSQL的横向扩展能力的新型数据库。它在保留SQL接口和关系模型的同时,解决了传统关系型数据库在分布式环境下的扩展瓶颈。
-
支持完整的SQL语法和ACID事务
-
具备分布式架构,可以水平扩展
-
通常采用分布式一致性协议(如Raft、Paxos)保证高可用
-
适用场景: 对事务一致性和高并发写入同时有严格要求的互联网核心业务(如金融交易、电商库存扣减)
-
常见产品: TiDB(开源)、Google Spanner、CockroachDB、OceanBase(蚂蚁集团)
二、按部署架构分类
1. 单机数据库
数据库运行在单台服务器上,所有数据存储和查询处理都在本地完成。结构简单,成本低,但存在单点故障风险,性能和容量受限于单机硬件。
2. 分布式数据库
数据库由多个节点组成一个逻辑上的整体,数据分布在多台服务器上。具备高可用性、高扩展性和容错能力。上述NewSQL和绝大多数NoSQL都属于分布式数据库。
3. 云原生数据库
基于云基础设施构建,充分利用云计算的弹性伸缩、按需付费、托管服务等特性。用户无需关心底层硬件和运维,只需关注数据本身。
- 常见产品: Amazon RDS、Amazon Aurora、Google Cloud SQL、Azure SQL Database、阿里云 PolarDB
三、按应用场景分类(补充视角)
| 类型 | 说明 | 典型产品 |
|---|
| OLTP(联机事务处理) | 面向日常交易,高并发、低延迟、强一致性 | MySQL、PostgreSQL、Oracle |
| OLAP(联机分析处理) | 面向数据分析与决策支持,海量数据复杂查询 | ClickHouse、Apache Druid、Greenplum |
| HTAP(混合事务分析处理) | 同时支持事务处理和实时分析 | TiDB、OceanBase |
| 时序数据库 | 针对时间序列数据优化(监控指标、传感器数据) | InfluxDB、TimescaleDB、Prometheus |
| 内存数据库 | 数据常驻内存,追求极致读写速度 | Redis、Memcached、SAP HANA |
| 搜索引擎数据库 | 面向全文检索和倒排索引 | Elasticsearch、Solr |
四、关系型数据库 vs NoSQL 对比总结
| 对比维度 | 关系型数据库(RDBMS) | NoSQL |
|---|
| 数据模型 | 二维表,固定Schema | 灵活,文档/键值/列族/图等多种模型 |
| SQL支持 | 完整支持 | 部分支持或不支持 |
| ACID事务 | 完整支持 | 多数弱支持或最终一致性 |
| 扩展性 | 纵向扩展为主 | 横向扩展为主 |
| 关联查询能力 | 强(JOIN) | 弱 |
| 适用数据量 | GB ~ TB 级别 | TB ~ PB 级别 |
| 典型场景 | 金融、ERP、电商交易 | 缓存、日志、社交图谱、大数据分析 |
五、选型建议(一句话总结)
没有最好的数据库,只有最适合场景的数据库。
- 需要强一致性和复杂关系查询 → 选关系型数据库
- 需要高并发缓存或灵活数据模型 → 选NoSQL
- 需要同时兼顾事务和扩展性 → 选NewSQL
- 追求免运维、弹性伸缩 → 选云原生数据库
DDL:
创建表格
create table 表名(列名 类型, 列名 类型)
删除表
drop table 表名
修改表_表名
alter table 旧表名 rename 新表名
修改表_列名
alter table 表名 change column 旧列名 新列名 类型
修改表_列类型
alter table 表名 modify 列名 新类型
修改表_添加新列
alter table 表名 add column 列名 类型
修改表_删除列
alter table 表名 drop column 列名
约束
添加主键
alter table 表名 add primary key()
添加自增长
alter table 表名 modify 主键 类型 auto_increment
删除主键
alter table 表名 drop primary key
删除自增长
alter table 表名 modify 主键 类型