Amazon DynamoDB — The Architecture Behind the Table

Amazon DynamoDB — The Architecture Behind the Table

A deep, advanced-level walkthrough of how DynamoDB actually works under the hood — partitioning and consistent hashing, adaptive capacity, transaction internals, Global Tables replication, and the design patterns that let a single table serve millions of requests per second with single-digit-millisecond latency.

Imagine a warehouse so large that no single worker could ever know where everything is, so instead the warehouse is divided into thousands of small, independent sections, each with its own dedicated team, and a master directory instantly tells any request exactly which section to go to. That is the mental model behind DynamoDB: not one big database working harder, but a coordinated system of many small partitions working in parallel, invisible to the request that ultimately gets its data back in single-digit milliseconds. This tutorial goes past “DynamoDB is a managed NoSQL database” and into the internals: how it decides which partition holds your data, how it copes when one item becomes suddenly, wildly popular, how it can promise transactions across items without a traditional relational engine, and how the world’s highest-scale applications design their tables around these mechanics rather than around a spreadsheet’s mental model of rows and columns.

1Partitioning & Consistent Hashing

Every advanced DynamoDB concept traces back to one decision: how it decides where an item physically lives.

The Partition Key as a Hash Input

Every item’s partition key is passed through an internal hash function, and the resulting hash value determines which physical partition — a self-contained slice of storage and throughput capacity — the item is stored on. Items with the same partition key always hash to the same partition, which is precisely why all items sharing a partition key can be retrieved together efficiently, while items with different partition keys may land anywhere across the table’s partitions.

Simple Analogy

Think of consistent hashing like a coat-check system with hundreds of racks. The number printed on your ticket (the hash of your partition key) always sends you to the exact same rack no matter which night you return, and the coat-check staff never need to remember individual tickets — they just read the number and walk to that rack.

flowchart TB
    K["Partition Key: userId=482"] --> H["Hash Function"]
    H --> P1["Partition 1"]
    H -.-> P2["Partition 2"]
    H -.-> P3["Partition 3"]
    P1 --> Item["Item stored/retrieved\nfrom exactly one partition"]
        
FIG 1 — The hash of a partition key deterministically routes every request to exactly one physical partition.

Why Partition Key Choice Is the Single Most Important Design Decision

Because throughput capacity is spread across partitions, a table’s real-world scalability depends entirely on how evenly requests spread across the space of partition key values. A partition key with only a handful of distinct values — a status flag with three possible states, for example — concentrates all traffic onto just a few partitions no matter how much total capacity the table has been given.

!
Common Mistake

Choosing a low-cardinality partition key (like a boolean flag or a small fixed set of categories) is one of the most frequent DynamoDB design errors — it silently caps a table’s real achievable throughput regardless of how much provisioned or on-demand capacity is configured.

2Internal Working — Storage Nodes & Replication

Behind every partition sits a small, replicated cluster of its own.

Three-Way Replication Within a Partition

Each partition’s data is replicated across three storage nodes spread across different Availability Zones within the Region. One replica is elected leader and handles all writes and strongly consistent reads, while the other two act as followers, kept in sync through a replication protocol before a write is considered durable.

flowchart TB
    subgraph Partition["One Logical Partition"]
        L["Leader Replica\n(AZ-a)"]
        F1["Follower Replica\n(AZ-b)"]
        F2["Follower Replica\n(AZ-c)"]
    end
    Write["Write Request"] --> L
    L -->|Replicate| F1
    L -->|Replicate| F2
    F1 -.Quorum Ack.-> L
    F2 -.Quorum Ack.-> L
        
FIG 2 — Every partition is itself a small replicated cluster spread across Availability Zones, with a leader coordinating writes to two followers.

Leader Election and Failure Handling

If a leader replica becomes unreachable, the remaining replicas participate in a leader election process to select a new leader, allowing the partition to continue serving writes without manual intervention. This internal replication and failover machinery is exactly why DynamoDB can advertise Availability Zone-level fault tolerance as a built-in property of every table, rather than something a customer configures.

Production Example — Amazon.com’s Own Retail Platform

Amazon’s retail website uses DynamoDB internally for services like the shopping cart, relying on this multi-AZ replicated partition architecture to keep checkout flows available even during an Availability Zone-level disruption.

3Data Flow — Consistency Models in Practice

Not every read in DynamoDB sees the same guarantee, and the difference matters for correctness.

Eventually Consistent Reads

By default, a read can be served by any replica, including a follower that may not have yet received the very latest write. This is why a read immediately following a write can, in rare cases, return slightly stale data — usually resolved within a fraction of a second, but not instantaneous by design.

Strongly Consistent Reads

Requesting a strongly consistent read forces the request to be served by the leader replica specifically, guaranteeing the most recent successful write is reflected in the result. This guarantee comes at a small cost: strongly consistent reads consume twice the read capacity of an eventually consistent read, and are not available at all against a Global Table’s replica in a different Region.

PropertyEventually ConsistentStrongly Consistent
Served byAny replica (leader or follower)Leader replica only
Read capacity cost1x2x
Latest write guaranteedUsually, not alwaysAlways
Available cross-RegionYesNo
Simple Analogy

Eventually consistent reads are like asking any employee at a store branch for today’s price — almost always right, updated within moments of a price change. Strongly consistent reads are like insisting on asking the manager specifically, who is guaranteed to know the very latest price the instant it changes, at the cost of a slightly longer wait to find them.

4Global Secondary Indexes vs. Local Secondary Indexes

Two index types that look similar on the surface but behave completely differently underneath.

Own Partitioning

Global Secondary Index (GSI)

Has its own partition key (and optional sort key), entirely independent of the base table’s key, with its own provisioned or on-demand capacity, updated asynchronously after a base table write.

Shares Partitioning

Local Secondary Index (LSI)

Shares the base table’s partition key but offers an alternate sort key, updated synchronously with the base table write, and must be created at table creation time — it cannot be added later.

Why GSI Updates Are Asynchronous

Because a GSI can have a completely different partition key than the base table, writing to it is effectively writing to a different partition than the one the base item lives on. DynamoDB propagates this update asynchronously, which means a GSI can briefly lag behind the base table — a subtlety that matters for any application logic that reads immediately from a GSI right after writing to the base table.

i
Interview-Relevant Distinction

An LSI’s synchronous update comes from sharing the base table’s partition — the write literally happens as part of the same partition transaction. A GSI’s asynchronous update comes from potentially writing to an entirely different physical partition, which fundamentally cannot happen atomically with the base write.

!
Common Mistake

Because an LSI must be defined at table creation and cannot be added retroactively, teams that discover a need for an alternate sort key on an existing table are forced to use a GSI instead, or migrate to a new table — planning access patterns before table creation avoids this dead end.

5Adaptive Capacity & Hot Partition Mitigation

What happens when the theoretical even-distribution assumption breaks in the real world.

Why Hot Partitions Happen Even With Good Key Design

Even a well-designed partition key scheme can experience a temporary hot spot — a viral social media post, a flash sale item, a single celebrity’s profile suddenly receiving a disproportionate share of traffic relative to every other partition key value in the table.

Adaptive Capacity’s Automatic Response

DynamoDB continuously monitors per-partition throughput consumption and, when it detects a partition being throttled while the table’s overall provisioned capacity has room to spare, automatically and transparently shifts more throughput capacity toward that specific hot partition — without any manual intervention, table resizing, or downtime.

flowchart LR
    A["Partition A\n(hot, throttling)"] --> M["Adaptive Capacity\nMonitor"]
    B["Partition B\n(underutilized)"] --> M
    M -->|Reallocates capacity| A2["Partition A\n(boosted capacity)"]
        
FIG 3 — Adaptive Capacity detects an overloaded partition and shifts spare throughput toward it automatically, without any customer action.

Write Sharding as a Proactive Design Technique

For access patterns known in advance to be hot — a single counter incremented by every request across an entire application, for example — a common proactive technique is to append a random or calculated suffix to the partition key, spreading what would otherwise be one hot partition key across several, and merging results back together at read time.

Production Example — Flash Sale Inventory Counters

E-commerce platforms running flash sales often shard a single “remaining inventory” counter item across several suffixed partition keys during the sale window specifically to avoid a single hot partition becoming a throughput bottleneck at the exact moment traffic peaks.

6Capacity Modes — Provisioned vs. On-Demand

Two fundamentally different philosophies for paying for throughput.

Provisioned Capacity

  • Explicit read/write capacity units set in advance, optionally with Auto Scaling to adjust within bounds
  • Lower cost per request at steady, predictable traffic levels
  • Requires forecasting and periodic tuning to avoid throttling or waste

On-Demand Capacity

  • Automatically scales to accommodate traffic with no capacity planning required
  • Higher per-request cost compared to well-tuned provisioned capacity
  • Ideal for unpredictable, spiky, or new workloads without established traffic history

Auto Scaling’s Reactive Nature Under Provisioned Mode

Provisioned capacity with Auto Scaling still reacts to a CloudWatch alarm crossing a utilization threshold, meaning there is a real window where a sudden spike can trigger throttling before Auto Scaling finishes adjusting capacity upward — a gap On-Demand mode is specifically designed to avoid by scaling continuously in near real time.

i
Cost Optimization Insight

Mature teams often start a new table on On-Demand mode to avoid guessing at capacity, then switch to well-tuned Provisioned capacity with Auto Scaling once real traffic patterns are understood, capturing On-Demand’s safety early and Provisioned’s cost efficiency later.

7DynamoDB Streams & Change Data Capture

Turning every table mutation into an event other systems can react to.

The Stream as an Ordered Log Per Partition

DynamoDB Streams captures an ordered, time-sequenced log of item-level changes — inserts, updates, and deletes — for a table, with ordering guaranteed within each partition key but not necessarily across different partition keys, since different partitions process changes independently and in parallel.

flowchart LR
    T["DynamoDB Table\nWrite Occurs"] --> S["DynamoDB Stream\n(ordered per partition key)"]
    S --> L["AWS Lambda\nTrigger"]
    S --> K["Kinesis / Custom\nConsumer"]
    L --> Down["Downstream Systems:\nsearch index, cache, audit log"]
        
FIG 4 — Streams turn table mutations into an event source, commonly consumed by Lambda to keep downstream systems synchronized.

Event-Driven Architecture Built on Streams

A common advanced pattern attaches an AWS Lambda function directly to a table’s stream, using each change event to update a search index, invalidate a cache entry, or publish a notification — decoupling these downstream side effects entirely from the application code that performed the original write.

Production Example — Real-Time Leaderboards

Gaming platforms use Streams to detect score updates the instant they are written and push incremental changes to a real-time leaderboard cache, avoiding the need to re-query and recompute the entire leaderboard on every single score change.

8Transactions — Two-Phase Commit Internals

How a distributed, partitioned system offers all-or-nothing guarantees across multiple items.

Why Transactions Are Harder in a Partitioned System

Because different items in a transaction may live on entirely different partitions — potentially with different leader replicas on different physical hosts — committing several writes as a single atomic unit requires coordination across those independent partitions, unlike a single-node database where all rows already live under one transaction manager.

The Prepare-and-Commit Pattern

DynamoDB Transactions use a two-phase approach: a prepare phase where every item involved in the transaction is checked and locked against its current condition, followed by a commit phase where all changes are applied together, or a rollback if any single item’s condition check fails during the prepare phase — guaranteeing the transaction as a whole is atomic even though its items are physically scattered.

sequenceDiagram
    participant App as Application
    participant P1 as Partition A
    participant P2 as Partition B
    App->>P1: Prepare (check + lock item)
    App->>P2: Prepare (check + lock item)
    P1-->>App: OK
    P2-->>App: OK
    App->>P1: Commit
    App->>P2: Commit
    Note over P1,P2: All succeed together, or none do
        
FIG 5 — A DynamoDB transaction prepares every involved item across potentially different partitions before committing them all together.

The Cost of Atomicity

Because of this two-phase coordination, transactional writes consume twice the write capacity of an equivalent non-transactional write, and transactions are limited to a maximum number of items per call — a direct, visible cost of the coordination overhead required to make cross-partition atomicity possible at all.

!
Common Mistake

Reaching for Transactions by default for every multi-item write, even when the application does not actually require strict atomicity, unnecessarily doubles capacity consumption — Transactions should be reserved for cases where partial application of a multi-item write would leave data in a genuinely invalid state.

9DAX — In-Memory Acceleration

A caching layer purpose-built to be a drop-in accelerator, not a bolt-on afterthought.

Write-Through Caching Semantics

DynamoDB Accelerator (DAX) sits directly in front of a table as a managed, in-memory cache cluster, and is API-compatible with the standard DynamoDB SDK — meaning existing application code can typically point at DAX with a client-endpoint change rather than a rewrite. Writes go through DAX to the underlying table, updating the cache and the table together rather than leaving the cache to go stale until a separate invalidation step runs.

Item Cache vs. Query Cache

DAX maintains two internally distinct caches: an item cache for direct key lookups (GetItem-style requests), and a query cache for the results of Query and Scan operations, each with its own configurable time-to-live, since query result sets and individual item lookups have very different staleness tolerances in most applications.

~microseconds
Typical DAX cache-hit latency
3
Nodes per DAX cluster minimum for HA

Production Example — High-Traffic Product Catalogs

Retail platforms place DAX in front of product catalog tables during high-traffic events, absorbing the overwhelming majority of read traffic in-memory and dramatically reducing the read capacity the underlying table itself needs to be provisioned for.

10Global Tables — Multi-Region Replication

Extending a single logical table across Regions, with a conflict-resolution model built for it.

Multi-Active, Multi-Region Writes

Global Tables allow a table to accept writes in multiple Regions simultaneously, with each Region’s changes replicated asynchronously to every other Region — a multi-active architecture rather than a single-writer-with-read-replicas model, since any Region can accept a write at any time.

Last-Writer-Wins Conflict Resolution

Because two Regions could theoretically write to the same item at nearly the same moment, Global Tables resolves conflicts using a last-writer-wins strategy based on internal timestamps — the write with the latest timestamp is the one that ultimately persists across all Regions, and the “losing” write is silently discarded rather than merged.

flowchart LR
    subgraph RegionA["Region A"]
        WA["Write at T1"]
    end
    subgraph RegionB["Region B"]
        WB["Write at T2 (same item)"]
    end
    WA --> Sync["Cross-Region\nReplication"]
    WB --> Sync
    Sync --> Resolve{"Compare\nTimestamps"}
    Resolve --> Final["Later write wins\nacross all Regions"]
        
FIG 6 — Concurrent writes to the same item from different Regions are resolved by comparing timestamps, with the later write ultimately winning everywhere.
!
Common Mistake

Assuming Global Tables merges concurrent conflicting writes intelligently — it does not. Applications with a genuine risk of concurrent cross-Region writes to the same item need to design around last-writer-wins semantics explicitly, for example by structuring updates to be commutative or by routing a given item’s writes consistently to one preferred Region.

Production Example — Global User Profile Services

Applications serving users across multiple continents use Global Tables so that a user’s profile data is written and read from whichever Region is geographically closest to them, without a single Region becoming a global bottleneck or single point of failure for every write worldwide.

11High Availability & Reliability

HA is architecturally built into every table, not a separate configuration to enable.

Multi-AZ by Default

Because every partition’s three replicas are spread across different Availability Zones automatically, every DynamoDB table is inherently resilient to a single AZ failure without any customer configuration — a meaningfully different default than services where multi-AZ deployment is an opt-in, additional-cost choice.

Global Tables as Regional Disaster Recovery

Beyond AZ-level resilience, Global Tables extend availability to full Regional failure scenarios — if an entire Region becomes unavailable, applications can redirect traffic to a healthy Region’s replica table, which already contains a near-real-time copy of the data due to continuous asynchronous replication.

“A table’s real availability is a property of how its replicas are distributed, not a setting you turn on after the fact.”

12Security — Fine-Grained Access & Encryption

DynamoDB security operates at a level of granularity most databases cannot match natively.

IAM Condition Keys for Item-Level Access Control

DynamoDB IAM policies support condition keys that restrict access down to specific attributes or even specific items matching a partition key pattern — allowing, for example, a mobile application’s per-user IAM role to be scoped so a given user can only ever read or write items whose partition key matches their own user ID, enforced entirely at the IAM policy level rather than in application code.

flowchart TB
    U["Authenticated User\n(userId=482)"] --> Role["Scoped IAM Role"]
    Role -->|Condition: partitionKey = ${cognito:sub}| T["DynamoDB Table"]
    T -.-> Own["Item: userId=482 — Allowed"]
    T -.-> Other["Item: userId=999 — Denied"]
        
FIG 7 — IAM condition keys enforce item-level access control directly at the policy layer, without relying on application-level checks alone.

Encryption at Rest and In Transit

Every table is encrypted at rest by default using either an AWS-owned key, an AWS-managed key, or a customer-managed KMS key, and all connections to the DynamoDB API endpoint are encrypted in transit using TLS — meaning encryption is a baseline property of the service rather than something enabled as an afterthought.

i
Advanced Detail

Using a customer-managed KMS key allows fine-grained control and audit logging over exactly who can decrypt a table’s data, and enables key rotation policy to be set independently of DynamoDB’s own operational lifecycle.

13Backup & Point-In-Time Recovery

Recovering from mistakes without needing to have predicted them in advance.

Continuous Backups Underpinning PITR

Point-In-Time Recovery (PITR) continuously records every table change, allowing a restore to any specific second within the retention window — typically up to 35 days — rather than only to fixed backup checkpoints. This continuous recording is what allows recovery from an accidental application bug that silently corrupted data hours before anyone noticed.

On-Demand Backups for Long-Term Retention

Separately, on-demand backups create a full, standalone snapshot with no expiration date tied to a retention window, intended for long-term archival, compliance, or a specific pre-migration safety checkpoint rather than continuous rolling protection.

PropertyPoint-In-Time RecoveryOn-Demand Backup
GranularityAny second within retention windowFixed snapshot at time of creation
RetentionUp to 35 days, rollingIndefinite, until manually deleted
Best forRecovering from recent accidental changesLong-term archival and compliance

14Monitoring, Logging & Metrics

The signals that reveal a design flaw before it becomes an outage.

Throttling Signal

ThrottledRequests

A rising count here, especially concentrated on specific keys, is the primary signal of either insufficient capacity or an uneven access pattern hitting a hot partition.

Latency Signal

SuccessfulRequestLatency

Broken down by operation type, this reveals whether Query, Scan, or GetItem calls specifically are driving latency, guiding exactly which access pattern needs redesign.

Capacity Signal

ConsumedReadCapacityUnits / WriteCapacityUnits

Compared against provisioned capacity, reveals whether Auto Scaling is keeping pace with actual demand or whether On-Demand mode would better fit the traffic shape.

CloudWatch Contributor Insights for Hot Key Detection

Contributor Insights for DynamoDB specifically surfaces the most frequently accessed and most throttled partition keys, turning a vague “something is slow” report into a precise, actionable list of exactly which keys are causing trouble — invaluable for diagnosing hot partition issues that aggregate table-level metrics alone would never reveal.

15Design Patterns & Anti-Patterns

The patterns that separate a table that scales gracefully from one that hits a wall.

Pattern — Single-Table Design

Rather than modeling one DynamoDB table per entity type the way a relational schema would, advanced designs often store multiple related entity types in a single table, using generic partition and sort key naming conventions and carefully designed access-pattern-driven indexes — minimizing the number of round trips needed to satisfy a given application query.

Pattern — Sparse Indexes

A Global Secondary Index only contains items that actually have a value for the index’s key attributes — meaning an index can be deliberately designed as “sparse” by only setting that attribute on the subset of items that should appear in it, effectively creating a free, automatically maintained filtered view without scanning the whole table.

Pattern — Time-To-Live for Automatic Data Expiration

Setting a TTL attribute lets DynamoDB automatically delete expired items — such as session tokens or temporary cache entries — in the background at no additional write-capacity cost, avoiding the need for a separate scheduled cleanup job.

ANTI-PATTERN-01 Avoid
Problem

Relying on the Scan operation as a primary access pattern for a table expected to grow large.

Why It’s Harmful

Scan reads every item in a table (or index) regardless of relevance, consuming capacity proportional to the entire table’s size rather than the size of the actual result — a cost that grows without bound as the table grows, unlike Query which is scoped to a specific partition key.

Correct Approach

Design partition and sort keys, along with GSIs, around the application’s actual known access patterns up front, so that every common read can be satisfied with a Query rather than a full-table Scan.

ANTI-PATTERN-02 Avoid
Problem

Modeling a DynamoDB schema the same way a relational database schema would be modeled, with a separate table per entity type and application-side joins across them.

Why It’s Harmful

DynamoDB has no native join operation, so a relational-style multi-table design forces the application to perform multiple sequential round trips to assemble related data, multiplying latency and complicating error handling compared to a schema designed around the actual access patterns from the start.

Correct Approach

Model the table around how data will actually be queried, not how it is conceptually related, using techniques like single-table design and item collections to co-locate related data under a shared partition key wherever the access pattern calls for retrieving them together.

16Advantages, Disadvantages & Trade-offs

DynamoDB’s speed and scale come with a genuinely different design discipline than relational databases.

Advantages

  • Single-digit-millisecond latency at virtually unlimited scale, with no manual sharding required
  • Fully managed multi-AZ replication and failover built into every table by default
  • On-Demand capacity removes the need for upfront traffic forecasting entirely
  • Streams enable clean, decoupled event-driven architectures without additional messaging infrastructure
  • Global Tables provide multi-Region, multi-active writes with continuous cross-Region replication

Disadvantages / Trade-offs

  • No native joins or ad-hoc query flexibility — access patterns must be designed in advance
  • Scan operations scale poorly and can become expensive as a table grows
  • Transactions cost twice the capacity of equivalent non-transactional writes
  • Global Tables’ last-writer-wins conflict resolution requires deliberate application-level design for concurrent cross-Region writes
  • A poorly chosen partition key can silently cap achievable throughput regardless of provisioned capacity

17Real-World & Industry Examples

How organizations at extreme scale apply the mechanics above.

E-Commerce

Amazon.com

Uses DynamoDB for services like the shopping cart, relying on its multi-AZ replicated architecture for checkout availability during peak shopping events.

Streaming

Disney+

Uses DynamoDB to handle massive concurrent viewer session and state data during high-demand content launches, leaning on On-Demand capacity to absorb unpredictable spikes.

Gaming

Real-Time Leaderboards

Combine DynamoDB Streams with Lambda to keep leaderboard caches updated incrementally as scores change, avoiding expensive full recomputation.

Global SaaS

Multi-Region User Platforms

Use Global Tables to serve user profile data from the Region closest to each user, avoiding a single global write bottleneck.

18Frequently Asked Questions

Q1Why does a strongly consistent read cost more than an eventually consistent read?

A strongly consistent read must be served specifically by the leader replica of a partition to guarantee the latest write is reflected, whereas an eventually consistent read can be served by any replica — this extra guarantee is reflected in its doubled read capacity cost.

Q2Can a Local Secondary Index be added to a table after it has already been created?

No — LSIs must be defined at table creation time because they share the base table’s partition structure. A Global Secondary Index, by contrast, can be added at any time since it maintains its own independent partitioning.

Q3Does Adaptive Capacity eliminate the need for good partition key design?

No — Adaptive Capacity mitigates temporary, uneven hot spots by reallocating spare throughput, but it cannot manufacture capacity a table was never provisioned with, and a fundamentally low-cardinality partition key will still cap achievable throughput regardless of Adaptive Capacity’s help.

Q4What happens if two Global Table Regions write to the same item at nearly the same time?

The conflict is resolved using last-writer-wins based on internal timestamps, with the later write ultimately persisting across all Regions and the earlier concurrent write discarded — applications with this risk should design around commutative updates or region-preferred write ownership per item.

Q5Is DAX necessary for every DynamoDB table?

No — DAX specifically benefits read-heavy workloads with repeated access to the same items or queries, where microsecond-level cache-hit latency and reduced read-capacity consumption provide clear value. Write-heavy or highly unique-per-request read workloads see little benefit from adding a caching layer.

19Summary and Key Takeaways

Advanced fluency in DynamoDB comes from internalizing that it is not a database that happens to be fast — it is a partitioned, replicated distributed system whose speed is a direct consequence of that architecture. Consistent hashing over the partition key determines everything about how well a table scales, which is why partition key selection is treated as the single most consequential design decision rather than an implementation detail. Adaptive Capacity, GSIs and LSIs, Streams, Transactions, DAX, and Global Tables are not independent features bolted onto a generic database — each is a direct engineering answer to a specific challenge that partitioning itself introduces: uneven load, alternate query patterns, change propagation, cross-partition atomicity, read latency, and cross-Region availability. Organizations running DynamoDB at the highest scale — Amazon’s own retail platform, major streaming services, real-time gaming systems — succeed not by fighting these mechanics but by designing their access patterns around them from the very first schema decision.

Key Takeaways

  • Partition key choice determines real-world scalability. Consistent hashing routes items deterministically, and a low-cardinality key silently caps achievable throughput.
  • Every partition is itself a small replicated cluster, spread across Availability Zones with automatic leader election — HA is architecturally built in, not configured separately.
  • Consistency is a per-request choice. Eventually consistent reads are cheaper and usually current; strongly consistent reads cost double but guarantee the latest write.
  • GSIs and LSIs solve different problems. LSIs update synchronously by sharing the base partition; GSIs update asynchronously because they maintain entirely independent partitioning.
  • Adaptive Capacity handles temporary hot spots automatically, but proactive techniques like write sharding are still needed for access patterns known to be hot in advance.
  • Transactions trade capacity for atomicity through a two-phase prepare-and-commit protocol across potentially different partitions — reserve them for genuine atomicity requirements.
  • Schema design should follow access patterns, not entity relationships. Single-table design and Query-first thinking avoid the expensive Scan operations a relational mindset tends to produce.