Database Design
SQL databases
SQL database 特性与场景
SQL(关系型)database 是一组有预定义关系的数据集合,通常以 tables 的形式组织(columns + rows)。Table 存放实体信息;column 表示某类数据;row 表示某个对象或实体的一组相关值。
每一行通常有唯一标识(primary key),多表之间通过 foreign keys 建立关系。数据可以用多种方式访问,不需要重组 tables。SQL databases 通常遵循 ACID consistency model。
Materialized views
Materialized view 是根据 query 预计算并存储的结果集。因为数据预先计算好,查询 materialized view 比直接查询 base table 更快,尤其在 query 频繁或复杂时性能差异很大。
它也支持 data subsetting,并提升复杂查询的 performance,从而降低网络负载。Materialized views 还有其他用途,但主要用于 performance 与 replication。
N+1 query problem
N+1 query problem 指 data access layer 额外执行 N 条 SQL 查询,去获取本该在主查询里一次拿到的数据。N 越大,query 次数越多,performance 影响越明显。
这在 GraphQL 与 ORM(Object-Relational Mapping)中很常见,可以通过优化 SQL 或使用 dataloader 把连续请求 batch 成一次请求来解决。
Advantages
- 简单且准确
- 易于访问
- data consistency 强
- 灵活性好
Disadvantages
- 维护成本高
- schema 演进困难
- performance 受 join/denormalization 等影响
- 横向扩展弱,scalability 差