SQL如今流行单表设计


SQL:使用复合键实现快速主从连接Join
2000年的开发者们:不要使用SQL,使用ORM。
2005年的ORMs:不要使用复合键
2010年的NoSQL:SQL连接Joins不能扩展
2015年的DynamoDB :单表设计

你知道这个单表设计是什么吗?
复合键!

Amazon DynamoDB是一种高性能的 NoSQL 数据库,可为许多无服务器应用程序提供数据存储。与传统的 SQL 数据库不同,它不使用表连接和其他关系数据库结构。但是,您可以在单个 DynamoDB 表中对许多常见的关系设计进行建模,但使用 NoSQL 方法时该过程有所不同。

这篇博文使用Alleycat 赛车应用程序来解释单表 DynamoDB 表的好处。它还展示了如何处理 DynamoDB 表中的建模数据访问要求。Alleycat 是一种家庭健身系统,允许用户参加一系列激烈的 5 分钟虚拟自行车比赛。一次最多 1,000 名赛车手骑上马鞍,突破节奏和阻力的极限,以创造个人记录并在虚拟排行榜上排名。

在 Alleycat 示例中,应用程序提供了许多练习课程。每个班级都有多个种族,每个种族都有多个赛车手。系统记录每个赛车手在比赛中每秒的输出。
在关系数据库中,通常每个表都有一个与另一个表中的外键相关的键。通过连接多个表,您可以查询相关表并在单个表视图中返回结果。虽然这很灵活方便,但计算量大且难以水平扩展。

许多无服务器架构都是为扩展而构建的,而关系数据库范式通常无法像工作负载需求那样有效地扩展。DynamoDB 几乎可以扩展到任何级别的流量,但权衡之一是缺少连接Join。
幸运的是,它提供了其他方法来对数据进行建模以满足 Alleycat 的要求。

在每个表中,您必须有一个分区键,它是一个字符串、数字或二进制值。此键是一个散列值,用于在恒定时间内定位项目,而不管表大小。它在概念上不同于基于 SQL 的数据库中的 ID 或主键字段,并且与其他表中的数据无关。当只有一个分区键时,这些值在表中的项目之间必须是唯一的。

(事实上,Hibernate已经将类似NaturalId用于表达实体的自然key)

每个表都可以选择有一个排序键。这使您可以在与给定主键匹配的项目中进行搜索和排序。虽然您必须在分区键中搜索精确的单个值,但您可以在排序键上进行模式搜索。通常使用带有时间戳的数字排序键来查找日期范围内的项目,或使用字符串搜索运算符来查找层次关系中的数据。

只有分区键和排序键,这限制了可能的查询类型,而不会在表中复制数据。为了解决这个问题,DynamoDB 还提供了两种类型的索引:

  • 本地二级索引(LSI):这些必须在创建表的同时创建,并有效地启用使用相同分区键的另一个排序键。
  • 全局二级索引(GSI):随时创建和删除这些索引,并可选择使用与现有表不同的分区键。

详细点击标题