官方教程 :使用 Amazon DynamoDB 为移动应用程序设计数据库
设计 DynamoDB 表的主键时,请牢记以下最佳实践:
- 从表中的不同实体开始。如果您要在一个表中存储多种不同类型的数据(例如员工、部门、客户和订单),请确保您的主键能够清楚地区分每个实体并对各个项目启用核心操作。
- 使用前缀来区分实体类型。使用前缀来区分实体类型可以防止冲突,同时有助于查询。如果“客户”和“员工”位于同一个表中,则“客户”的主键可以是 CUSTOMER#<CUSTOMERID>,而“员工”的主键则可以是 EMPLOYEE#<EMPLOYEEID>。
- 首先重点关注单项目操作,然后添加多项目操作(如果可能的话)。对于主键,可以使用单项目 API(GetItem、PutItem、UpdateItem 和 DeleteItem)满足单个项目的读写选项要求很重要。如果您也可以使用 Query 满足主键的多项目读取模式,那再好不过了。如果不能,您随时可以添加二级索引来处理 Query 使用案例。
一表中保存多种实体,主键设计如下:
实体 | HASH(分区键) | RANGE(排序键) |
User | USER#<USERNAME> | #METADATA#<USERNAME> |
Photo | USER#<USERNAME> | PHOTO#<USERNAME>#<TIMESTAMP> |
Reaction | REACTION#<USERNAME>#<TYPE> | PHOTO#<USERNAME>#<TIMESTAMP> |
Friendship(好友关系) | USER#<USERNAME> | #FRIEND#<FRIEND_USERNAME> |
倒排索引
二级索引是 DynamoDB 中至关重要的数据建模工具。它们支持您对数据进行改造以允许其他查询模式。
倒排索引是 DynamoDB 中一种常见的二级索引设计模式。使用倒排索引,您可以创建一个与表的主键反序的二级索引。表的 HASH 键将作为索引中的 RANGE 键,表的 RANGE 键将作为索引的主键。
倒排索引在两种情况下很有用。
1.倒排索引在查询多对多关系的“另一”面时很有用。您的 Friendship 实体就是这种情况。主键结构让您可以通过查询表的主键来查询特定用户的所有关注者。添加倒排索引时,您可以通过查询倒排索引来找到用户关注的其他用户(“被关注者”)。
2.倒排索引在查询本身是一对多关系主体的实体的一对多关系时也很有用。您表中的 Reaction 实体就是这种情况。一张照片可以有多个表态,并且每个表态都包括表态所应用于的照片、表态用户的用户名以及表态类型。但是,因为一个用户可以拥有很多照片,照片的主要标识符在其 RANGE 键中 -- PHOTO#<USERNAME>#<TIMESTAMP>。因此,您不能使用主键将表态绑定到照片。为满足“查看照片和表态”访问模式的要求,数据模型将 Reaction 实体的照片标识符放在 RANGE 键中。现在,在查询倒排索引时,您可以使用照片标识符在单个请求中选择照片及其所有表态。
局部标准化
DynamoDB没有表连接查询,需要类似操作时需要考虑发行复数个查询,下面为官方示例的查询方式:
第一步查询关系集合
第二步用第一步的结果通过BatchGetItem API,传入数组参数,取得复数个实体
DynamoDB 事务
在 TransactWriteItem API 调用中,可以使用以下类型的操作。
- Put:用于插入或覆盖项目;
- Update:用于更新现有项目;
- Delete:用于删除项目;
- ConditionCheck:用于在不更改项目的情况下声明现有项目的条件。----满足指定条件才做对应的更新语句