---
id: database-dynamodb
title: "DynamoDB"
shortTitle: "DynamoDB"
track: database
trackTitle: "Database"
order: 5
level: important
status: published
estimatedMinutes: 30
prerequisites:
  - database-cassandra
next: database-oracle
reviewedAgainst: 2026-10-12
sources:
  - title: "DynamoDB core components"
    url: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html
  - title: "DynamoDB Local"
    url: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html
---

# DynamoDB

DynamoDB là database khóa-giá trị và document của AWS. Cùng ý partition key với Cassandra, nhưng bạn không chạy node. AWS giữ cụm. Lab local dùng DynamoDB Local, không tạo bảng trên tài khoản AWS.

## Để làm gì

Thiết kế partition key, chọn on-demand hay provisioned, và gọi DynamoDB Local nếu đã có AWS CLI.

## Gồm những gì

- Partition key và sort key.
- On-demand và provisioned capacity.
- DynamoDB Local trên cổng 8000.

Không gồm stream, hay global table. Không tạo resource tính tiền.

## Dùng khi nào

App trên AWS, đường đọc là một khóa, và team không muốn vận hành cụm Cassandra. Bảng cần join và báo cáo ad hoc thì để PostgreSQL hoặc một kho phân tích, đừng nhét mọi query vào Scan.

Đừng Scan bảng production để “xem có gì”. Scan đọc toàn bộ, tính tiền theo dung lượng đọc, và vẫn chậm.

## Kiến thức cốt lõi

Mỗi item có partition key. Sort key không bắt buộc. Có sort key thì một partition chứa nhiều item và sắp theo key đó. GetItem cần đủ key. Query cần partition key và có thể thêm điều kiện sort key. Scan đọc cả bảng.

On-demand tính theo request thực tế, không đặt trước RCU và WCU. Provisioned đặt số đơn vị đọc ghi. Vượt provisioned thì request bị chặn trừ khi bật burst hoặc auto scaling. Bảng mới chưa biết tải thì on-demand đỡ phải đoán số.

DynamoDB Local là process giả lập API. Dữ liệu không lên AWS. Endpoint là `http://localhost:8000`. AWS CLI vẫn ký request, nên máy cần credential, có thể là key giả vì Local không kiểm tra tài khoản thật. Docs DynamoDB Local ghi rõ cách chạy bằng Docker hoặc JAR.

## Lệnh và code mẫu

Chỉ khi đã có `docker` và `aws`:

```bash
docker run -d --name lab-dynamo -p 8000:8000 amazon/dynamodb-local
aws dynamodb list-tables --endpoint-url http://127.0.0.1:8000 --region us-east-1
docker rm -f lab-dynamo
```

Nếu CLI chưa có credential, đặt tạm cho cửa sổ lab, không ghi vào repo:

```bash
export AWS_ACCESS_KEY_ID=local
export AWS_SECRET_ACCESS_KEY=local
export AWS_DEFAULT_REGION=us-east-1
```

Trên PowerShell, cùng ba tên biến đặt bằng `$env:AWS_ACCESS_KEY_ID = "local"`.

Không có CLI thì không cần cài. Đọc key schema ở khối JSON kế tiếp là đủ.

```json
{
  "AttributeName": "userId",
  "KeyType": "HASH"
}
```

`HASH` là partition key trong API của DynamoDB.

## Thực hành

1. Nếu có Docker và AWS CLI, chạy `list-tables`. Bảng rỗng vẫn là thành công.
2. Dừng và xóa container.
3. Không gọi endpoint AWS thật, bỏ `--endpoint-url` là nhầm sang tài khoản.

## Kết quả mong đợi

`list-tables` in `TableNames` rỗng, hoặc bạn bỏ lab nhưng vẫn chỉ ra được `HASH` là partition key.

## Checklist

- [ ] Đường đọc chính là GetItem hoặc Query, không phải Scan.
- [ ] Lệnh lab có `--endpoint-url` trỏ local.
- [ ] Bảng production không tạo từ máy học.

## Lỗi thường gặp

**Quên `--endpoint-url`.** CLI tạo hoặc liệt kê bảng trên AWS, region trong profile. Xóa nhầm là chuyện của tài khoản thật. Luôn nhìn endpoint trước khi Enter.

**Partition key là timestamp.** Mọi ghi trong cùng giây dồn vào vài partition. Chọn key có độ trải, ví dụ id của user, rồi để thời gian làm sort key nếu cần.

## Nguồn

1. [Core components](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html) — partition key, sort key, Query và Scan.
2. [DynamoDB Local](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html) — chạy API ở local.

## Tiếp theo

[Oracle](./06-oracle.md)
