Статьи

Сопоставление элементов DynamoDB с объектами с помощью картографа DynamoDB

Ранее мы создавали таблицы DynamoDB с использованием Java.

Для различных баз данных, таких как базы данных sql или nosql, существует набор инструментов, которые помогают получить доступ, сохранить данные и управлять данными между объектами / классами и базовой базой данных. Например, для баз данных SQL мы используем JPA, для Cassandra мы используем MappingManager.

DynamoDBMapper — это инструмент, который позволяет вам получать доступ к вашим данным в различных таблицах, выполнять различные операции CRUD над элементами, а также выполнять запросы и сканирование по таблицам.

Мы попытаемся отобразить таблицы Users, Logins, Supervisors и companies из предыдущего примера.
Users — это простая таблица, использующая электронную почту пользователей в качестве хэш-ключа.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.gkatzioura.dynamodb.mapper.entities;
 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
 
/**
 * Created by gkatzioura on 9/20/16.
 */
@DynamoDBTable(tableName="Users")
public class User {
 
    private String email;
    private String fullName;
 
    @DynamoDBHashKey(attributeName="email")
    public String getEmail() {
        return email;
    }
 
    @DynamoDBAttribute(attributeName="fullname")
    public void setEmail(String email) {
        this.email = email;
    }
 
    public String getFullName() {
        return fullName;
    }
 
    public void setFullName(String fullName) {
        this.fullName = fullName;
    }
}

Однако в различных случаях наша таблица DynamoDB использует хеш и ключ диапазона. Таблица логинов отслеживает попытки входа пользователя в систему. Электронная почта — это ключ хеша, а отметка времени — ключ диапазона.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.gkatzioura.dynamodb.mapper.entities;
 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
 
/**
 * Created by gkatzioura on 9/20/16.
 */
@DynamoDBTable(tableName="Logins")
public class Login {
 
    private String email;
    private Long timestamp;
 
    @DynamoDBHashKey(attributeName="email")
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    @DynamoDBRangeKey(attributeName="timestamp")
    public Long getTimestamp() {
        return timestamp;
    }
 
    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }
}

Другим популярным случаем являются таблицы с глобальными вторичными индексами (GSI). Например, таблица Супервизоры используется для получения супервизора по его имени. Однако мы также используем эту таблицу для получения всех руководителей из конкретной компании или руководителей, которые работают на конкретной фабрике компании.
Имя супервизора — наш хеш-ключ, название компании — хеш-ключ, а имя фабрики — ключ диапазона глобального вторичного индекса.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.gkatzioura.dynamodb.mapper.entities;
 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBIndexHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBIndexRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
 
/**
 * Created by gkatzioura on 9/21/16.
 */
@DynamoDBTable(tableName="Supervisors")
public class Supervisor {
 
    private String name;
    private String company;
    private String factory;
 
    @DynamoDBHashKey(attributeName="name")
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @DynamoDBIndexHashKey(globalSecondaryIndexName = "FactoryIndex",attributeName = "company")
    public String getCompany() {
        return company;
    }
 
    public void setCompany(String company) {
        this.company = company;
    }
 
    @DynamoDBIndexRangeKey(globalSecondaryIndexName = "FactoryIndex",attributeName = "factory")
    public String getFactory() {
        return factory;
    }
 
    public void setFactory(String factory) {
        this.factory = factory;
    }
}

И последнее, но не менее важное: мы можем использовать локальные вторичные индексы. Таблица Companies использует название компании в качестве хеш-ключа и дочернее имя в качестве ключа диапазона. Так как мы хотим выпускать запросы на основе руководителей компаний, используется локальный вторичный индекс с ключом диапазона, основанным на имени руководителя.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.gkatzioura.dynamodb.mapper.entities;
 
import com.amazonaws.services.dynamodbv2.datamodeling.*;
 
/**
 * Created by gkatzioura on 9/21/16.
 */
@DynamoDBTable(tableName="Companies")
public class Company {
 
    private String name;
    private String subsidiary;
    private String ceo;
 
    @DynamoDBHashKey(attributeName="name")
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @DynamoDBRangeKey(attributeName = "subsidiary")
    public String getSubsidiary() {
        return subsidiary;
    }
 
    public void setSubsidiary(String subsidiary) {
        this.subsidiary = subsidiary;
    }
 
    @DynamoDBIndexRangeKey(localSecondaryIndexName = "CeoIndex",attributeName = "ceo")
    public String getCeo() {
        return ceo;
    }
 
    public void setCeo(String ceo) {
        this.ceo = ceo;
    }
}

Вы можете найти исходный код на github .