database概述
Relational vs NoSQL 与选型要点
什么是 Database?
Database 是结构化信息(data)的有序集合,通常以电子方式存储在计算机系统中。Database 一般由 Database Management System (DBMS) 控制。Data + DBMS + 相关应用一起构成一个 database system,通常简称 database。
什么是 DBMS?
DBMS 是数据库的核心软件层,负责在 database 与用户/程序之间提供接口,让用户可以 query、update、以及管理数据的组织方式。DBMS 也负责管理与控制,比如 performance monitoring、tuning、backup 与 recovery。
常见组成
- Schema:定义数据结构的“形状”,规定哪些 data 可以放在哪。Schema 可能是强制全局约束、局部约束,或完全不存在。
- Table:类似 spreadsheet,由 columns 和 rows 组成。
- Column:某一类数据的集合,每一行一个值,例如 text、numbers、enums、timestamps 等。
- Row:一条记录。
Types of Databases
一般可分为 relational 与 non-relational (NoSQL) 两大类。下面会从 system design 视角给到完整的类型、特性、trade-off 与选型建议。
Relational databases
Relational databases 会在存储前遵循固定 schema。数据通常组织成一组 relations(tables),每个 tuple(instance)有唯一 key。实例存在 rows,属性存在 columns。Table 之间通过 primary key 与 foreign key 连接。
SQL(Structured Query Language)用于 insertion、deletion、retrieval 等常见操作。
Relational databases 常见优势:simplicity、robustness、flexibility、performance、scalability,以及对通用业务数据的兼容性。
Relational databases 提供 ACID(Atomicity、Consistency、Isolation、Durability)保证,用更高层抽象来隐藏 dirty reads、write skew、phantom reads 等 anomaly。ACID 是强力的“通用锤子”,如果某些系统只需要少量一致性保证,就有机会用更轻量的 custom solution 换取更高 performance,但复杂度也会上升。
ACID 简述
- Atomicity:transaction 要么全部成功,要么全部 rollback。
- Consistency:transaction 前后数据库保持一致状态。
- Isolation:并发 transaction 不互相影响,效果等价于顺序执行。
- Durability:已完成的 transaction 在系统故障后依然持久存在。
常见 DBMS
- MySQL
- Oracle Database
- Microsoft SQL Server
- IBM DB2
- Postgres
- SQLite
Why relational databases?
Relational databases 是 structured data 的默认选项,原因包括:
Flexibility
SQL 中的 DDL (data definition language) 允许修改 database schema,比如 add/drop columns、rename tables 等,即便在 server 运行中也能完成。
Reduced redundancy
通过 normalization 降低 data redundancy,避免 inconsistent dependency。
Concurrency
高并发场景下,通过 transactional access 避免写冲突(例如酒店超卖)。失败即 rollback,成功即 commit。
Integration
多个应用共享数据库更容易做 data aggregation,concurrency control 负责多方访问协调。
Backup and disaster recovery
Relational databases 保持 consistent state,export/import 更容易做 backup/restore。很多 cloud RDBMS 还支持 continuous mirroring。
Drawback: Impedance mismatch
Relational model 是 table + tuple 的结构,而 in-memory 数据结构经常是嵌套对象、list、map 等。需要把复杂结构“翻译”为 relational algebra,这会带来 impedance mismatch 与额外的映射成本。
A single aggregated value in the view is composed of several rows and tables in the relational database
Why non-relational (NoSQL) databases?
NoSQL databases 适合 semi-structured / unstructured data、low latency 与 flexible data model 的场景。核心特点:
- Simple design:避免 relational 模型的 impedance mismatch,减少 join 与多表拆分。
- Horizontal scaling:天然适合 scale out;数据可自动分布与 load balance。
- Availability:常见支持 replication,node failure 时可快速替换。
- Schema flexibility:document 可以有不同字段。
- Cost:多为 open source 或 commodity hardware,成本更可控。
Types of NoSQL databases
The types of NoSQL databases
Key-value database
Key-value 用 hash-table 风格存储,key 是唯一标识,value 可以是 scalar 或复杂 object。易 partition、易水平扩展。
Use case:session-oriented 应用(例如 web session、recommendations、targeted promotions)。
Data stored in the form of key-value pair in DynamoDB, where the key is the combination of two attributes (Product ID and Type)
Document database
Document database 存 JSON/XML/BSON 等,结构是层级 tree(map/collection/scalar 组合)。不同 document 可以有不同 schema。常见:MongoDB、Firestore。
Use case:unstructured catalog data、content management(blogs、video platforms)。比如电商商品有上千属性,document 一次性存储更合适。
Graph database
Graph database 用 nodes 表示实体,edges 表示关系。适合关系密集的数据。常见:Neo4J、OrientDB。
Use case:social graph、recommendation、relationship analytics、fraud detection。
A graph consists of nodes and links. This graph captures entities and their relationships with each other
Columnar database
Columnar database 按列存储数据,读特定字段时更高效,适合 analytics / OLAP。常见:Redshift、BigQuery。
Use case:aggregation、trend analysis、data warehousing。
Note: Columnar database 不等于 wide-column database。Wide-column(如 Cassandra、HBase)是 column families 组织 row,更适合 write-heavy 与 semi-structured data。
Column-oriented and row-oriented database
Drawbacks of NoSQL databases
Lack of standardization
NoSQL 没有像 relational algebra 那样统一标准,跨产品迁移成本高。
Consistency trade-offs
很多 NoSQL 依赖 eventual consistency,在一致性与可用性之间做 trade-off。缺少强 referential integrity。
Choose the right database
选型时可以先用下面的对照表做 quick check:
| Relational Database | Non-relational Database |
|---|---|
| 数据结构明确、强 schema | 数据结构不固定或频繁变化 |
| 需要 ACID 事务 | 能接受弱一致性或 eventual consistency |
| 单机或较小规模 | 需要大规模 horizontal scaling |
选型不是“非此即彼”。现代系统里常见 polyglot persistence:同一系统使用多种 database。
Challenges
大规模运行 databases 常见挑战:
- 应对数据量爆炸:来自 sensors、connected machines 等的海量数据。
- 确保 data security:安全与可访问性需要平衡。
- 跟上业务需求:需要 real-time 数据支持决策。
- 管理与维护成本:规模越大,ops 成本越高。
- 突破 scalability 限制:on-premises 场景更明显。
- 满足 data residency / sovereignty / latency:合规与延迟要求可能影响架构选择。