1. DynamoDB表含义
DynamoDB表概念,对于新手非常不友好,而且官网介绍比较粗略。不少应该有例子的地方,没有给出代码例子。也就是说,文档也不友好。我尝试友好的说几句,看看能否“直击痛点”:
- NoSQL型:这点大家容易理解
- 必须要有主键:这点和MongoDB型NoSQL不同,也和MySQL等SQL型数据库不同
- 主键还一大堆约束
- 查询也有一大堆约束
2. DynamoDB的主键
DynamoDB的主键,可以是1个字段,也可以是2个字段,不能含有2个以上字段。
- 如果是1个字段主键,那么这个字段可以定位记录。这个primary key也叫:partition key
- 如果有2个字段主键,那么个字段叫:partition key;第二个字段叫:sorted key
如果想要高效查询,即Query操作;另一种不高效“查询”,在DynamoDB的世界,叫Scan操作。
- Query操作,必须指定partition key,sorted key即使存在,也可以不指定
- Scan操作,全表查询,官方不推荐使用
3. 根据Index查询
比如,交易记录表(Trans)含有字段:
id,from,to,amount,createAt,status这些字段,其中id为主键。
因为查询(Query)操作,必须要指定Partition Key的等式筛选条件。假如当前要查询status=1的交易记录。因为status不是Partition Key,因此无法执行这样的where条件:
where status=1 // 这个是伪代码
table.Get("status", 1) // Go 查询语法
因此,按照DynamoDB的规则,我们可以创建Secondary Index来实现。
Partition Key: status
Sort Key: id
这样,查询语句类似
where status=$status
4. 分页
MySQL的分页语法是:
select * from Table limit 20, 10 //查询21~40行记录
DynamoDB的分页语法是:
// status=1的查询,查询出来的第20条记录的id
// 一般情况下,由前端保存前面20条记录,查询第二页的时候,传给后台
lastEvaluatedKey=map[string]*dynamodb.AttributeValue{
param.SortKeyName: {
pageKeyValue.S = aws.String("第20条记录的id")
},
}
table.Get("status", 1).StartFrom(lastEvaluatedKey).Limit(20)
5. 一些思考
弊端:
- 显然看起来:DynamoDB查询是很不方便的
- 主键约束非常大,多2个字段
- 查询语法又是自己搞一套,和之前SQL没有啥关系
猜测DynamoDB佳姿势:
- 重视数据存储
- 数据提取逻辑较为简单:比如就按照id或者可数的几种场景,而且这些场景下Partition Key的hash值散步的比较平均
- 把数据筛选等逻辑拆分成数据流,比如把未处理的交易信息,放入到另外一个数据流或者数据表里面,业务代码去查询这个数据流或者数据表(而不是查询原始的交易表)
亚马逊的服务,看起来蹩脚,如果按照既有搞代码的思想去用,会更加蹩脚。如果,换成流、服务等思路,可以打开新的局面。