题目重点:区分数据模型与查询语言,避免把一致性、schema和扩展能力二分。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 题目明确SQL/noSQL区别;未要求指定AWS产品,本文以订单/会话例比较,不编造原题选型结果。
- SQL通常指关系数据库类别/查询语言,NoSQL包含key-value/document/wide-column/graph;同一类别不同实现差异很大。
解题路线
- 先列读取/写入模式、关系、事务、索引、增长与团队能力。订单付款/库存的跨记录不变量与用户会话按key读写需求不同,不能只问数据量大不大就选择NoSQL。
- 关系模型通常表/键/约束/join,适合明确关系与灵活查询;文档把常一起读取的数据聚合,可减少join但重复字段要同步。key-value擅长已知key访问,图数据库针对关系遍历,NoSQL不是一种统一模型。
- ACID、隔离级别、强读/最终一致是具体产品与API合同;现代NoSQL也可能支持事务,关系数据库也可分布式/分区。不能讲SQL全强一致、NoSQL全最终一致,或SQL只能垂直扩展。
- schema不固定不等于应用无schema:验证、迁移、索引和版本兼容仍要管理。反范式读快可能写放大/重复数据一致性风险,规范化也可能增加查询成本,按访问路径与不变量取舍。
- 规模评估包括partition key热点、单记录大小、索引写放大、备份/恢复、跨区与运维。产品选择后用典型查询/故障压测,不能把某个营销QPS当你全部事务的保证。
- 公开参考AWS数据库选择文档https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.WhyDynamoDB.html;本文强调具体接口核验,未从产品介绍推所有NoSQL行为。
手动走一遍
订单需一次检查库存、扣减与写订单,先定义交易范围与幂等;关系事务可能是自然基线。会话按sessionID查一个对象、TTL过期,key-value也可合适。若把订单所有关系塞一个文档,仍需确认跨库存对象原子性;“文档灵活”不能消除业务约束。
规模与取舍
已建合适索引的key查找常见O(log n)或期望哈希查,数据库真实成本含IO/网络;join、聚合/跨shard查询依计划。索引/冗余/副本改变存储与写成本,不给全类别一个复杂度。
易错点与追问
容易失分的边界
- SQL/NoSQL等于强/最终一致二分。
- 无schema等于无迁移。
- SQL不能横向扩展。
- NoSQL不需要事务设计。
- 只按数据量选库。
继续深挖
- 热partition key怎样识别/缓解?
- 重复文档字段如何保持一致?
- 事务跨记录/跨shard有哪些限制?
- 临时analytics需求怎样支持?
技术参考
- AWS 关系/NoSQL选择:公开概念/机制参考,本文容量与故障案例自拟;不代表原面试系统。
