两种主键
概念
一:单一主键
主键是某一个属性,表中的项目的这个属性的值各不相同。
这个属性也称为 分区键。
二:复合主键
主键是两个属性,表中的项目的这两个属性的值各不相同。
这两个属性分别称为 分区键 和 排序键。
示例
比如以下 people 表,people_id 为 主键(单一主键,分区键)
people_id | name | year_of_birth |
100 | Tom | 2000-3 |
101 | Jim | 2000-4 |
又如以下 student 表,使用了 班级ID和学生姓名一起做主键,class_id student_name 分别为分区键和复合键 (复合主键)
class_id | student_name | year_of_birth |
100 | Tom | 1990-3 |
100 | Jim | 1991-4 |
二级索引
介绍
默认情况下dynamodb 可以通过 主键 (包括单一主键,复合主键) 去查询。比如前面的 people 表,主键是 people_id ,那么默认是可以做类似如下这样的查询:
select * from people where people_id = 100;
但这显然是不够,比如我想查名字为 Tom 的数据,
select * from people where name = Tom
这样也是很常见的。要实现这样的查询,需要了解 dynamodb 的 二级索引的概念。
可以把表的主键视为一级索引,之后为了查询而额外创建的索引就是二级索引。
为了按姓名进行查询,可以在表为 name 属性创建一个二级索引,这样就可以按姓名进行查询了。
概念
Dynamodb支持两种索引:
一、全局二级索引
创建的新索引和表的原主键可以无任何关系。新索引可以单一主键也可以是复合主键。
比如前面的people 表,可以在表中为 name 属性创建一个 全局二级索引,这是单一主键的形式。
也可以在表中为 name 和 year_of_birth 两个属性创建一个 全局二级索引,这是复合主键的形式。
二、本地二级索引
创建的新索引必须是复合主键,且分区键与表的分区键相同,只能再额外选一个属性做排序键。
比如前面的 student 表,可以在表中为 year_of_birth 创建一个本地二级索引,做为排序键,而分区键保持为 class_id。
数量限制:最多可以为每个表定义 5 个全局二级索引和5个本地二级索引。所以一共可以创建10个二级索引。
全局本地概念:dynamodb 的数据有分区的概念,这里全局就是指查询可跨分区,而本地就是指查询局限在一个分区内
二级索引的查询:
假设排序键名为 SK,并基于排序键创建了一个二级索引 SK-index
查询 SK='123456'的项:
aws dynamodb query --table-name test_table --index-name "SK-index" --key-condition-expression "SK = :name" --expression-attribute-values '{":name":{"S":"123456"}}' --endpoint-url http://localhost:8000