AWS DynamoDB入门介绍

摘要:本文基于AWS官方文档和各方资料,整理了一些针对有一定经验的RDS程序员可能感兴趣的信息,旨在通过本文可以达到基本上手的程度。对于有一定经验的开发者来说,DynamoDB的一些操作和MongoDB的区别并不大,本文不再赘述,只重点写出一些不一样或值得注意的地方。

建议配合AWS官方文档阅读。

重要特征速览:DynamoDB中的各种操作都可以看做http(s)请求,请求中包括了操作的具体内容和需要的变量。http请求发出后,DynamoDB立刻执行这些请求。

DynamoDB最主要的特征来源于2007年的一篇论文:https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf,DynamoDB将consistent hashing的概念引入现实的数据库中,这为其带来了高可用,高弹性的特点,也为实际应用带来了新的变化。

DynamoDB的主键与我们熟悉的MySQL有很大的不同。DynamoDB的主键支持两种:(a):分区键;(b):分区键和排序键。其中,必须包括一个分区键。由前文我们知道,consistent hashing是DynamoDB的基础,这也决定了分区键必不可少。分区键是DynamoDB做hash的基础,它必须为一个值,只允许字符串、数字和二进制类型。排序键是经过分区后的一“块”数据排序的依据。

除了以上的特点,DynamoDB作为一种NoSQL,还具有NoSQL的基本特征,比如不支持表连接,灵活的schema等。

下面是具体的操作

读取数据:

注意: 利用关系数据库,您可以使用  SELECT  语句联接多个表中的数据并返回结果。联接是关系模型的基础。要确保联接高效执行,应持续优化数据库及其应用程序的性能。DynamoDB 是一个非关系 NoSQL 数据库且 不支持表联接。相反,应用程序一次从一个表中读取数据。
GetItem按照项目的主键检索,HASH和RANGE的key都要包括。
如果您将现有应用程序从关系数据库迁移到 DynamoDB,则需要非规范化数据模型以消除联接需要。
可以将 Query 用于任何具有复合主键 (分区键和排序键) 的表。您必须指定分区键的相等条件,并且可以选择性为排序键提供另一个条件。
Query方法:
Query方法是效率比较高的方法,用于主键或者索引。在使用Query方法时必须注意,必须有分区键相等的条件,否则DynamoDB将无法hash映射到数据所在的“块”,自然无法高效率地命中数据。
在 DynamoDB 中,您必须使用 ExpressionAttributeValues 作为表达式参数。 (如,KeyConditionExpression 和 FilterExpression) 中的占位符。这类似于在关系数据库中使用绑定变量,其中,您在运行时将实际值代入 SELECT 语句。
"Artist = :a and begins_with(SongTitle, :t)
{
    TableName: "Music" ,
    KeyConditionExpression: "Artist = :a and contains(SongTitle, :t)" ,
    FilterExpression: "price < :p" ,
    ExpressionAttributeValues: {
        ":a" : "No One You Know" ,
        ":t" : "Today" ,
        ":p" : 1.00
    }
}

Scan方法:
当无法命中分区键时,可以采取此方法,注意,此方法一般会扫描整个表,带来性能上的损失和更多的收费。 如果可以找相等的条件就尽量用相等的条件进行Query操作,没有再考虑scan。(比如上面的例子,也是首先命中分区键再进行筛选。)
单次 Scan  只会返回符合 1 MB 大小限制的结果集。要确定是否存在更多结果,并一次检索一页结果,应用程序应执行以下操作:
  1. 检查低级别 Scan 结果:
    • 如果结果包含 LastEvaluatedKey 元素,请继续步骤 2。
    • 如果结果中没有 LastEvaluatedKey,则表示没有其他要检索的项目。
  2. 使用与上一个 Scan 请求相同的参数构造新的 Scan 请求 - 但这一次,请选取步骤 1 中的 LastEvaluatedKey 值并将其用作新的 Scan 请求中的 ExclusiveStartKey 参数。
  3. 运行新的 Scan 请求。
  4. 前往步骤 1。
索引:

1.管理索引
首先,是建立索引的原则,可供参考:无论您使用的是关系数据库还是 DynamoDB,在创建索引时都应谨慎。只要对表进行写入,就必须更新表的所有索引。在具有大型表的写入密集型环境中,这会占用大量系统资源。在只读环境或主读环境中,这算不上一个问题 - 不过,您应确保索引实际上由应用程序使用,而不只是占用空间。

在 DynamoDB 中,您可以创建和使用二级索引 DynamoDB 中的索引与其关系对应项不同。当您创建二级索引时,必须指定其键属性 - 分区键排序键都要有。
  • query和scan都可以用到索引
  • 为获得最大查询灵活性,您可以为每个表创建最多 5 个 全局二级索引和最多 5 个local secondary index。
2.查询并扫描索引
在 DynamoDB 中,直接对索引执行 Query 操作,就如同对表执行此操作一样。您必须指定 TableName  IndexName
// All of the rock songs

{
    TableName: "Music" ,
    IndexName: "GenreAndPriceIndex” ,  # 必须要带着index名字
    KeyConditionExpression: "Genre = :genre” ,
    或 KeyConditionExpression: "Genre = :genre and Price < :price”, # HASH的(分区键)必须有一个相等
    ExpressionAttributeValues: {
        ":genre" : "Rock"
    },
};

更新(修改):

更新操作和常见的NoSQL数据库相比区别之处并不大。一个特点是DynamoDB可以初始化(创建)一个新的属性。以下是一个  UpdateItem  操作的示例,它初始化一个新属性 ( Plays ) 来跟踪歌曲的已播放次数:
{
    TableName: "Music" ,
    Key: {
        "Artist" : "No One You Know" ,
        "SongTitle" : "Call Me Today"
    },
    UpdateExpression: "SET Plays = :val" ,
    ExpressionAttributeValues: {
        ":val" : 0
    },
    ReturnValues: "UPDATED_NEW"
}

你可能感兴趣的:(数据库)