Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:数据库:数据库

数据库

关系型数据库的代表:MySQL / 非关系型数据库的代表:Redis

非关系型数据库包括:

  1. 键值数据库(Key-Value Store)
    1. 数据以键值对存储(Redis, DynamoDB)
  2. 文档数据库(Document Store)
    1. 数据以 JSON/BSON/XML 文档存储(MongoDB, CouchDB)
    2. 数据以文档(document)的形式存储,每个文档就像是一条独立的记录,包含键值对和嵌套结构

关于公网访问
数据库一般都是和自己的后端程序放在一个本地网络内的。
经过公网访问数据库是非常非常少见的需求。
即使是使用DBaaS,也要在内网中访问。


分类

常用的数据库软件可以根据用途分为两大类:关系型数据库(RDBMS)非关系型数据库(NoSQL)。下面是一些主流且常用的数据库软件:

一、关系型数据库(结构化数据,用SQL操作)

数据库软件 简介 适用场景
MySQL 开源、轻量级,社区广泛使用 网站开发、电商、博客等
PostgreSQL 功能强大、支持复杂查询和事务 金融、科研、地理信息系统(GIS)
Oracle 商业数据库领导者,安全性高 企业级系统、银行、政府部门
SQL Server 微软出品,集成度高 Windows系统集成、企业信息系统
SQLite 嵌入式数据库,无需服务端 移动端App、IoT设备、轻量应用

二、非关系型数据库(NoSQL,适合非结构化/半结构化数据)

数据库软件 类型 简介 适用场景
MongoDB 文档型 JSON文档存储,灵活强大 Web应用、日志、内容管理
Redis 键值型 内存数据库,高性能 缓存、排行榜、会话管理
Cassandra 列存储 可扩展性强,适合海量数据 分布式系统、大数据分析
Elasticsearch 搜索引擎 全文搜索与分析 日志检索、搜索功能实现
Neo4j 图数据库 处理复杂关系数据 社交网络、推荐系统、知识图谱

二者的区别是

1. 关系型数据库(RDBMS)

  1. 数据存储在“表格”中(行和列)
  2. 严格的数据结构(schema)
  3. 支持 SQL 查询、事务、外键约束

2. 非关系型数据库(NoSQL)

  1. 结构灵活,可存储 JSON、键值、图结构等
  2. 横向扩展强、性能好
  3. 不一定使用 SQL

NoSQL的四种类型如下:

类型 代表数据库 用途示例
键值型(Key-Value) Redis 缓存、Session、分布式锁
文档型(Document) MongoDB 存储 JSON 文档,如用户资料、产品信息
列存储型(Column-family) Cassandra、HBase 大数据分析、日志系统
图数据库(Graph) Neo4j 社交网络、推荐系统、知识图谱

关系型数据库

  1. 索引 Index

RDBMS的基础结构是:MySQL → database(s) → table(s)

非关系型数据库

因为没有固定的结构,所以一般来说不用SQL语句(确认一下正确性),Couchbase是特例?

SQL

SQL (Structured Query Language)是结构化查询语言。
不同的【关系型数据库】软件很多都支持 SQL,但它们的语法在细节上存在差异。
SQL标准语法包括:CREATE / INSERT / SELECT / UPDATE / DELETE等。
关系型数据库的基础 SQL 类似,但高级功能差异大。

非关系型数据库:语法完全不同。
非关系型数据库有各自专属的查询语法,和 SQL 差别很大。

  1. 标准SQL语法
  2. HiveSQL
  3. BigQuerySQL

SQL代码文件

[AI]SQL 文件(通常以 .sql 作為副檔名)是一種純文字檔案,裡面主要包含 SQL(Structured Query Language,結構化查詢語言) 的指令,用來操作資料庫。
大多數情況下,.sql 文件裡面主要是 DDL(資料定義語言) 和 DML(資料操作語言) 的語句,例如 CREATE TABLE、INSERT、SELECT。這些語句偏重 聲明式(declarative),描述「要做什麼」,而不是「怎麼做」,所以邏輯表達有限。
如果資料庫支援擴展語言,那 .sql 文件裡面就能包含更多邏輯,但是还是邏輯表達能力有限,不如一般程式語言靈活。

Data Definition Language (ddl)
Data Manipulation Language (dml)

用户

数据库一般都是有自己独立的用户 & 权限系统的。

事务

TODO

ORM

Object-Relational Mapping

简单理解就是:在语言层级包装一下SQL语言(对接各种数据库),从而让程序员不需要再手写SQL语句(性能可能有一点损失?),只需要操作语言内原生的dict等数据容器即可

AI:ORM 就是把“类与对象”和“表与记录”之间建立一一映射,让你 用写代码操作对象的方式,间接生成并执行 SQL。

DjangoGo都支持ORM

ps:如果不使用ORM的话,访问数据库的方式一般是在代码中执行SQL代码吧。

性能

程序员描述数据访问逻辑 > ORM生成SQL语句 > 执行SQL访问数据库。
在这个流程中,有两个地方可以提升性能:
程序员优化代码的数据访问逻辑,该缓存的缓存等;提升数据库服务器的硬件性能。
ORM生成SQL这一步应该是写死的(对于某个特定版本的库,比如DRF1.0.0),没有什么可变化的。

N+1性能问题

简单来说,问题的原因就是:数据嵌套了,但是默认Load的时候,是懒加载。
如果后续不需要用到内部数据,那懒加载确实更好。
反之,还是一次把需要的内部数据都加载了比较好。
作为例子,DRF的解决方案是,使用select_related/prefetch_related函数。

大规模、高性能

关于细节还需要继续学习,以下内容主要参考AI回答

  1. 如何实现的高并发?
    1. 连接池机制
    2. 读写分离
    3. 缓存机制
    4. 异步处理
  2. 数据量太大单机存不下怎么办?
    1. 分库分表(Sharding)
    2. 冷热数据分离
    3. 使用分布式数据库
    4. 数据仓库/湖的引入
  3. 如何保证数据一致性?(数据库操作的原子性,可以这么说吗?)
    1. 强一致性:所有节点对数据的读取结果始终一致。写完立即可读。
    2. 最终一致性:允许延迟,最终所有副本会达到一致状态。
    3. 分布式事务:多个节点共同参与一个事务,需要满足原子性等ACID特性。
    4. 基于复制协议的一致性
      1. 主从复制(异步、半同步、全同步)
    5. 分布式一致性协议(强一致性保障)
      1. Paxos / Raft 协议
    6. 两阶段提交(2PC)与三阶段提交(3PC)
    7. 分布式事务中间件
      1. Seata:阿里开源,支持 AT、TCC、SAGA 模式
      2. TCC-Transaction:Try-Confirm-Cancel,适用于强业务隔离
      3. Atomikos:Java领域的分布式事务管理器
    8. 基于时间戳的 MVCC(多版本并发控制)
  4. 数据库集群是怎么做到的?
    1. 主从集群(主从复制)
    2. 多主集群(Multi-Master)
  5. 数据安全如何保证?

数据库集群

为了大规模的应用

虚拟化

在实际生产环境中,「容器化数据库」不是必选的。
相较于其他组件,对于数据库而言,容器化带来的便利不一定会超过代价(复杂程度、安全性等)

其他数据库产品

Misc

数据库导出数据的时候,可能常用csv格式
这里补充一个csv的拓展:tsv格式,也就是 tab 分隔的 CSV。当数据内容中包含逗号的时候,经常用tsv代替csv

/var/www/DokuWikiStick/dokuwiki/data/pages/程序/数据库/数据库.txt · Last modified: 2025/10/11 08:58 by zhonghui