翻译文章:Amazon DynamoDB的数据模型、访问模型和API

温馨提示:本文由厦门大学计算机系林子雨翻译自英文网站,转载请注明出处,仅用于学习交流,请勿用于商业用途。

[本文翻译的原始出处:厦门大学计算机系数据库实验室网站林子雨老师的云数据库技术资料专区https://dblab.xmu.edu.cn/topic/research/documentation/cloud_database]

Amazon DynamoDB的数据模型、访问模型和API

英文原文地址:http://aws.amazon.com/dynamodb/

翻译:厦门大学计算机系林子雨(http://www.cs.xmu.edu.cn/linziyu) 翻译时间:201254日星期五

数据模型:属性(Attribute)、项目(Item)和表(Table)

Amazon DynamoDB把数据组织成表的形式,表中包含了项目(item),每个项目包含1个或多个属性。

属性(Attribute)

       一个属性是一个“名称-值”对(name-value pair),“名称”必须是一个字符串,“值”可以是一个字符串、数字、字符串集合或数字集合。下面是关于属性的一些实例:

 

"ImageID" = 1

"Title" = "flower"

"Tags" = "flower", "jasmine", "white"

"Ratings" = 3, 4, 2

项目(Item)

       属性的集合构成一个项目,这个项目是通过主键进行标识的。一个项目的属性,是很多“名称-值”对(name-value pair)的集合,而且没有顺序关系。项目的属性可以是稀疏的,某个项目中的属性和同一个表中的其他项目的属性,没有关系。除了主键是必须的,其他项目属性是可选的。和传统的数据库不同,表没有模式(schema)。项目是被存储在表中的。为了把项目存储到表中,你必须指定一个属性作为主键,这个主键可以在DynamoDB表中唯一地标识一个项目。在下面的图中,ImageID被分配为主键:

注意,上面这个图中的表有个名称,叫“myTable”,但是,表中的项目是没有名称的。通过主键就可以确定一个项目,比如通过主键“”ImageID”=1”,就可以找到该项目。

 

表(Tables)

       表包含了项目,并且把信息组织成离散的区域。表中的所有项目都具有相同的主键机制(primary key scheme)。当你创建一个表的时候,你可以指定一个属性名称,并把它设置为主键。在Amazon DynamoDB中,要求表中的每个项目都具备一个唯一的主键值。把数据写入DynamoDB的第一步,就是创建一个表,给表起个名称,并确定表的主键。下面是一个更大的表,它也是使用ImageID作为标识项目的主键。

 

Table: My Images

 

 

Primary Key

Other Attributes

 

ImageID = 1

ImageLocation = https://s3.amazonaws.com/bucket/img_1.jpg

Date = 1260653179

Title = flower

Tags = Flower, Jasmine

Width = 1024

Depth = 768

 

ImageID = 2

ImageLocation = https://s3.amazonaws.com/bucket/img_2.jpg

Date = 1252617979

Rated = 3, 4, 2

Tags = Work, Seattle, Office

Width = 1024

Depth = 768

 

ImageID = 3

ImageLocation = https://s3.amazonaws.com/bucket/img_3.jpg

Date = 1285277179

Price = 10.25

Tags = Seattle, Grocery, Store

Author = you

Camera = phone

 

ImageID = 4

ImageLocation = https://s3.amazonaws.com/bucket/img_4.jpg

Date = 1282598779

Title = Hawaii

Author = Joe

Colors = orange, blue, yellow

Tags = beach, blanket, ball

 

 

访问模型和API概览

主键

       DynamoDB要求每个表都有个确定的主键用来访问数据。主键可以唯一地标识每个项目(比如ID=1,ID=2,ID=3等等)。主键是表中唯一会被建立索引的部分,主键也会被用来对数据进行分区,从而把数据分布到多个服务器上。当你创建一个表的时候,你必须定义主键。

       换句话说,每个项目(item)都是“名称-值”对(name-value pair)的集合。当你为一个表创建项目的时候,你需要分配某个“名称-值”对作为主键。表中的所有项目,必须在主键上具有值,而且Amazon DynamoDB会保证某个项目在主键上的值是唯一的。DynamoDB会为主键创建索引。

 

支持域查询的组合主键(Composite Primary Key for Range Queries)

       组合主键,可以允许你指定表中的两个属性,一起构成一个唯一的主索引(primary index)。表中的所有项目都必须同时有这两个属性。其中一个属性是作为“哈希分区属性”,另外一个属性是作为“域属性”。例如,你可能有一个名称为“Status Updates”的表,它具有组合主键“UserID”和“Time”,其中,“UserID”属性是一个哈希分区属性,可以用来实现对工作负载的分区,然后分布到多个服务器上,“Time”是一个域属性。你可以运行一个查询来获得以下内容:(1)一个特定的项目,这个项目是由UserID和Time两个属性上的值共同确定的;(2)一个特定哈希桶中的所有项目,这个时候会使用UserID属性;(3)对于特定的UserID在某个特定时间段内的所有项目。只有当UserID哈希桶被确定的时候,才可以支持针对Time属性的域查询。

 

DynamoDB APIs

  • CreateTable – 创建一个表,并且确定用来进行数据访问的主索引(primary index);
  • UpdateTable – 对于给定的表,更新额定分配吞吐量内的值(林子雨注:不能更新太多的值,收到额定吞吐量的限制)。
  • DeleteTable – 删除一个表;
  • DescribeTable – 返回表的大小、状态和索引信息;
  • PutItem – 创建一个新的项目,或者用一个新的项目替代一个旧项目。如果在特定的表中,已经存在具有相同主键的项目,新项目就会完全替换旧项目。你也可以设置相应的条件,使得只有属性值满足特定条件时,才把一个项目替换掉,或者只有当某个项目不存在时,才插入一个新的项目;
  • BatchWriteItem – 在单个请求中,对跨越多个表的多个项目执行插入、替换和删除操作,但是,不是在一个事务中完成。可以支持最多25个项目的批量插入或删除操作,并且最大数据量不能超过1MB;
  • UpdateItem – 对现有项目的属性进行编辑。你也可以使用条件操作符来执行更新操作,这个时候,只有当某个项目的属性值满足特定条件时,才可以执行更新操作。
  • DeleteItem – 根据主键删除一个表中的单个项目。你也可以使用条件操作符来执行删除操作,这个时候,只有当某个项目的属性值满足特定条件时,才可以执行删除操作。
  • GetItem – 这个操作会返回一个项目中那些和主键匹配的所有属性。这个操作默认提供最终读一致性。如果你的应用无法接受最终读一致性,你可以使用ConsistentRead。
  • BatchGetItem – 这个操作会根据主键为多个项目从多个表中返回多个属性。每个响应的数据量不能超过1MB,并且最多返回100个项目。
  • Query – 根据主键获取一个或多个项目,既可支持最终一致性,也可以支持强一致性。这个API被用在具有组合主键的表中。
  • Scan – 通过对表进行完整的扫描,获得一个或多个项目和属性。返回的项目是受限于你确定的过滤条件的。因此,这个API 可以用来支持对一个表进行即席查询,而且查询所涉及的属性不是表的主键。但是,由于这个操作会执行完整的扫描,而且不存在索引,因此,这个操作最好不要用在那些需要性能保证的应用中。一个Scan API请求的结果,最终会是一致的。你可以把Scan API看成是一个迭代器(iterator)。对于一个给定的Scan API,一旦获得的累计数据量已经达到1MB的上限,给定的请求就会终止,结果会被返回,并在结果中记录了LastEvaluatedKey ,从而方便下次继续扫描。(厦门大学计算机系 林子雨 翻译)