绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
谈谈Amazon DynamoDB的增删改查(CRUD)操作
2022-04-08 15:17:50

1. DynamoDB表含义

DynamoDB表概念,对于新手非常不友好,而且官网介绍比较粗略。不少应该有例子的地方,没有给出代码例子。也就是说,文档也不友好。我尝试友好的说几句,看看能否“直击痛点”:

  1. NoSQL型:这点大家容易理解
  2. 必须要有主键:这点和MongoDB型NoSQL不同,也和MySQL等SQL型数据库不同
  3. 主键还一大堆约束
  4. 查询也有一大堆约束

2. DynamoDB的主键

DynamoDB的主键,可以是1个字段,也可以是2个字段,不能含有2个以上字段。

  1. 如果是1个字段主键,那么这个字段可以定位记录。这个primary key也叫:partition key
  2. 如果有2个字段主键,那么个字段叫:partition key;第二个字段叫:sorted key

如果想要高效查询,即Query操作;另一种不高效“查询”,在DynamoDB的世界,叫Scan操作。

  1. Query操作,必须指定partition key,sorted key即使存在,也可以不指定
  2. Scan操作,全表查询,官方不推荐使用

3. 根据Index查询

比如,交易记录表(Trans)含有字段:

idfromtoamountcreateAtstatus这些字段,其中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. 一些思考

弊端:

  1. 显然看起来:DynamoDB查询是很不方便的
  2. 主键约束非常大,多2个字段
  3. 查询语法又是自己搞一套,和之前SQL没有啥关系

猜测DynamoDB佳姿势:

  1. 重视数据存储
  2. 数据提取逻辑较为简单:比如就按照id或者可数的几种场景,而且这些场景下Partition Key的hash值散步的比较平均
  3. 把数据筛选等逻辑拆分成数据流,比如把未处理的交易信息,放入到另外一个数据流或者数据表里面,业务代码去查询这个数据流或者数据表(而不是查询原始的交易表)

亚马逊的服务,看起来蹩脚,如果按照既有搞代码的思想去用,会更加蹩脚。如果,换成流、服务等思路,可以打开新的局面。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Amazon DynamoDB
创建时间:2022-04-08 14:56:47
Amazon DynamoDB
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • LCR_
    专家
戳我,来吐槽~