> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tensor9.com/llms.txt
> Use this file to discover all available pages before exploring further.

# DynamoDB (table)

> AWS DynamoDB (table). A key value and document store where items are addressed by partition and sort key and read or written in single digit milliseconds.

This page covers item APIs and their database backends. For table administration, capacity and other table configuration, see [DynamoDB table management](/service-adapters/aws/databases-storage/dynamodb-control). Item API support does not imply support for every table-management operation.

**On this page**

* [Coverage by target cloud](#coverage-by-target-cloud)
* [How the targets compare](#how-the-targets-compare)
  * [Max adaptation](#max-adaptation)
  * [Infrastructure-only adaptation](#infrastructure-only-adaptation)
* [On Google Cloud](#on-google-cloud)
  * [Via Firestore](#via-firestore)
  * [Via Cloud Spanner](#via-cloud-spanner)
  * [Via Cloud Bigtable](#via-cloud-bigtable)
  * [Via Cloud SQL for PostgreSQL](#via-cloud-sql-for-postgresql)
* [On Azure](#on-azure)
  * [Via Azure Cosmos DB (provisioned)](#via-azure-cosmos-db-provisioned)
  * [Via Azure Cosmos DB (serverless)](#via-azure-cosmos-db-serverless)
* [On OCI](#on-oci)
* [On Private Kubernetes](#on-private-kubernetes)

## Coverage by target cloud

| Target             | Available |
| ------------------ | --------- |
| Google Cloud       | ✓         |
| Azure              | ✓         |
| OCI                | ✓         |
| Private Kubernetes | ✓         |

## How the targets compare

Each row compares a capability of DynamoDB with its adaptation on each target.
A dash means this row is not stated for that target.

### Max adaptation

| Capability                                       | DynamoDB                                                | Google Cloud · Firestore                                                      | Google Cloud · Cloud Spanner                                           | Google Cloud · Cloud Bigtable                       | Google Cloud · Cloud SQL for PostgreSQL                                                             | Azure · Azure Cosmos DB (provisioned)                       | Azure · Azure Cosmos DB (serverless)                                     | Private Kubernetes                                                         |
| ------------------------------------------------ | ------------------------------------------------------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------ | -------------------------------------------------------------------------- |
| Secondary indexes · index types                  | GSI (eventually consistent) / LSI (strongly consistent) | Firestore composite indexes over the item's own fields, written with the item | Spanner secondary index / interleaved index, both written with the row | -                                                   | Postgres indexes updated in the same transaction as the item                                        | Azure-maintained GSI container / native LSI index           | LSI only (a GSI needs the provisioned target)                            | -                                                                          |
| Read consistency · per-read control              | per-request ConsistentRead                              | always strong (flag-independent)                                              | -                                                                      | -                                                   | always strong (flag-independent)                                                                    | strong base-table and LSI reads; GSI visibility is eventual | strong base-table and LSI reads; managed GSIs require provisioned Cosmos | always strong (flag-independent)                                           |
| Write path · latency tradeoff                    | managed item writes and transactions                    | limited direct writes; guarded read-modify-write for other requests           | replicated commits; eligible updates avoid a pre-image read            | direct row mutations or guarded read-modify-write   | one keyed upsert, or a row-locked read-modify-write                                                 | -                                                           | -                                                                        | -                                                                          |
| Item size · optional relaxed size check          | 400 KiB per item                                        | 400 KiB by default; opt-in blind patches may exceed it                        | -                                                                      | -                                                   | -                                                                                                   | -                                                           | -                                                                        | -                                                                          |
| Per-item TTL                                     | Yes - epoch attribute; lazy delete                      | Yes - native TTL field policy; asynchronous delete                            | Yes - generated column plus a row-deletion policy                      | -                                                   | -                                                                                                   | -                                                           | -                                                                        | -                                                                          |
| API coverage                                     | full                                                    | high                                                                          | high                                                                   | partial                                             | high                                                                                                | partial                                                     | partial                                                                  | high                                                                       |
| Read consistency · default + on request          | eventually consistent, ConsistentRead on request        | -                                                                             | strong reads, including ConsistentRead=false                           | -                                                   | -                                                                                                   | -                                                           | -                                                                        | -                                                                          |
| Cross-partition transactions · multi-item writes | Yes - serializable, up to 100 actions                   | -                                                                             | Yes - external consistency, spans tables                               | -                                                   | -                                                                                                   | -                                                           | -                                                                        | -                                                                          |
| Cost vs DynamoDB · billing model                 | on-demand requests plus storage                         | -                                                                             | provisioned compute plus storage                                       | provisioned nodes plus storage                      | -                                                                                                   | -                                                           | -                                                                        | -                                                                          |
| Item size · enforcement                          | 400 KiB per item                                        | -                                                                             | 400 KiB enforced, plus DynamoDB's 4 MiB transaction aggregate          | -                                                   | 400 KiB enforced, including the attributes a local index copies                                     | -                                                           | -                                                                        | -                                                                          |
| DynamoDB Streams                                 | Yes                                                     | -                                                                             | No - stream-enabled writes are rejected                                | No - no atomic DynamoDB change log                  | -                                                                                                   | Partial - one writing instance per streamed table           | Partial - one writing instance per streamed table                        | Partial - change records commit with writes; one writer per streamed table |
| Scaling · capacity and concurrency               | on-demand or provisioned capacity                       | -                                                                             | instance processing units and request concurrency                      | cluster nodes, row distribution and connection pool | -                                                                                                   | -                                                           | -                                                                        | -                                                                          |
| Read consistency · default + on request          | eventual by default; strong on request                  | -                                                                             | -                                                                      | strong through one cluster                          | -                                                                                                   | -                                                           | -                                                                        | -                                                                          |
| Secondary indexes · index types                  | GSI / LSI                                               | -                                                                             | -                                                                      | base-table access only                              | -                                                                                                   | -                                                           | -                                                                        | PostgreSQL indexes updated with the item                                   |
| Cross-partition transactions · multi-item writes | Yes - up to 100 items across tables                     | -                                                                             | -                                                                      | No - one item row is the atomic unit                | Partial - native Postgres transaction at SERIALIZABLE isolation; stream-enabled tables are excluded | -                                                           | -                                                                        | -                                                                          |
| Per-item TTL                                     | Yes - epoch attribute set per item; lazy delete         | -                                                                             | -                                                                      | No - DynamoDB TTL attributes are rejected           | -                                                                                                   | -                                                           | -                                                                        | -                                                                          |
| Item size · update size validation               | 400 KiB per item                                        | -                                                                             | -                                                                      | blind SET/REMOVE may exceed 400 KiB                 | -                                                                                                   | -                                                           | -                                                                        | -                                                                          |
| DynamoDB Streams · change capture                | Yes - 24-hour retention                                 | -                                                                             | -                                                                      | -                                                   | Partial - outbox co-committed with the write; one writer per streamed table                         | -                                                           | -                                                                        | -                                                                          |
| Per-item TTL · expiry                            | Yes - epoch attribute set per item; lazy delete         | -                                                                             | -                                                                      | -                                                   | Yes - expression index plus a leader-elected reaper                                                 | -                                                           | -                                                                        | -                                                                          |
| Conditional writes · atomicity                   | Yes - native                                            | -                                                                             | -                                                                      | -                                                   | Yes - row-locked read-modify-write inside one transaction                                           | -                                                           | -                                                                        | -                                                                          |
| Numeric precision · accepted values              | up to 38 significant digits                             | -                                                                             | -                                                                      | -                                                   | the same value, stored exactly                                                                      | at most 15 significant digits                               | at most 15 significant digits                                            | the same value, stored exactly                                             |
| Autoscale · capacity model                       | provisioned / on-demand                                 | -                                                                             | -                                                                      | -                                                   | -                                                                                                   | dedicated autoscaling range of request units (RUs)          | consumption billing without a dedicated RU band                          | -                                                                          |
| Item size · enforcement                          | 400 KiB                                                 | -                                                                             | -                                                                      | -                                                   | -                                                                                                   | 400 KiB enforced                                            | 400 KiB enforced                                                         | -                                                                          |
| Per-item TTL                                     | Yes - absolute epoch attribute                          | -                                                                             | -                                                                      | -                                                   | -                                                                                                   | Yes - per-item ttl tag, relative to the last write          | Yes - per-item ttl tag, relative to the last write                       | -                                                                          |
| Cost · capacity model                            | request-based or provisioned capacity                   | -                                                                             | -                                                                      | -                                                   | -                                                                                                   | dedicated autoscaling range of request units (RUs)          | consumption billing without a dedicated RU band                          | -                                                                          |
| Conditional writes                               | Yes - native                                            | -                                                                             | -                                                                      | -                                                   | -                                                                                                   | Yes - stored procedure, conditional PATCH or etag guard     | Yes - stored procedure, conditional PATCH or etag guard                  | -                                                                          |
| Transactions                                     | Yes                                                     | -                                                                             | -                                                                      | -                                                   | -                                                                                                   | No - DynamoDB multi-item transaction APIs are rejected      | No - DynamoDB multi-item transaction APIs are rejected                   | -                                                                          |
| Cross-partition transactions · multi-item writes | Yes                                                     | -                                                                             | -                                                                      | -                                                   | -                                                                                                   | -                                                           | -                                                                        | Partial - serializable transactions; stream-enabled tables are excluded    |
| Per-item TTL                                     | Yes                                                     | -                                                                             | -                                                                      | -                                                   | -                                                                                                   | -                                                           | -                                                                        | Yes - expired items remain readable until background deletion              |
| Capacity                                         | managed on-demand or provisioned capacity               | -                                                                             | -                                                                      | -                                                   | -                                                                                                   | -                                                           | -                                                                        | database and storage resources allocated to the appliance                  |

### Infrastructure-only adaptation

| Capability                          | DynamoDB                                              | OCI                                                                                        |
| ----------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| Adaptation mechanism                | DynamoDB infrastructure and runtime API               | infrastructure mapping to native OCI NoSQL                                                 |
| Item layout                         | partition key, optional sort key and typed attributes | typed primary-key columns plus value JSON                                                  |
| Capacity                            | on-demand or provisioned; storage grows with use      | OCI capacity mode, read/write units and explicit storage cap                               |
| DynamoDB runtime API                | Yes                                                   | No - applications use OCI NoSQL APIs in this mapping                                       |
| Per-item TTL                        | Yes                                                   | No - the source epoch attribute is not translated; emitted default has no automatic expiry |
| Declared DynamoDB secondary indexes | Yes                                                   | No - configure native OCI indexes and adapt queries separately                             |
| API coverage                        | full                                                  | minimal                                                                                    |

## On Google Cloud

### Via Firestore

| Operation           | Area               | Support   | Depth        | Notes                                                                                                                                                                                                                                                                                             |
| ------------------- | ------------------ | --------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ConditionExpression | Conditional writes | Supported | Common       | evaluated against the live document under an optimistic precondition; a lost race retries, never a spurious condition failure                                                                                                                                                                     |
| DescribeStream      | Indexes + streams  | Supported | Full surface | shard list + stream ARN                                                                                                                                                                                                                                                                           |
| GetRecords          | Indexes + streams  | Supported | Full surface | DynamoDB Streams served from an ordered change log co-committed with each write; all four view types                                                                                                                                                                                              |
| GetShardIterator    | Indexes + streams  | Supported | Full surface | -                                                                                                                                                                                                                                                                                                 |
| ListStreams         | Indexes + streams  | Supported | Full surface | the streamed-table registry                                                                                                                                                                                                                                                                       |
| Query (GSI / LSI)   | Indexes + streams  | Supported | Most usage   | served by a real maintained secondary index (a per-index seek), not a table scan                                                                                                                                                                                                                  |
| Query               | Reads              | Supported | Common       | ordering, filters and pagination honored                                                                                                                                                                                                                                                          |
| Scan                | Reads              | Supported | Common       | streamed page by page                                                                                                                                                                                                                                                                             |
| DeleteItem          | Single item        | Supported | Common       | -                                                                                                                                                                                                                                                                                                 |
| GetItem             | Single item        | Supported | Common       | -                                                                                                                                                                                                                                                                                                 |
| PutItem             | Single item        | Supported | Common       | Documents are keyed by partition and sort key. Signed 64-bit integers remain exact; other numbers must fit the supported 15-significant-digit native range.                                                                                                                                       |
| UpdateItem          | Single item        | Supported | Common       | default: eligible REMOVE-only requests use a masked write; SET reads the item to enforce 400 KiB. FIRESTORE\_ALLOW\_OVERSIZED\_BLIND\_UPDATES=true permits eligible blind SET/REMOVE while relaxing that size check; conditions, returned attributes and complex updates retain read-modify-write |
| TransactWriteItems  | Transactions       | Supported | Most usage   | a real cross-document Firestore transaction, atomic up to the 100-action limit DynamoDB itself imposes                                                                                                                                                                                            |

#### How it works

Tensor9 runs a DynamoDB adapter beside your application in the customer's environment. It configures `AWS_ENDPOINT_URL_DYNAMODB` to send the AWS SDK's requests to the adapter over the local loopback network. Your SDK and application code stay unchanged. The adapter accepts DynamoDB requests and data types, returns DynamoDB responses and errors, and stores data in Google Cloud Firestore.

The adapter maps DynamoDB items, conditions, indexes and transactions onto Firestore documents. Numeric values must fit the native representation described below. Reads are strongly consistent, and write latency depends on whether the operation needs an initial read or encounters contention.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogaW4gdGhlIHRhcmdldCBjbG91ZCB0aGUgc2FtZSBhcHBsaWNhdGlvbiBhbmQgU0RLIGNhbGwgYSBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgRHluYW1vREIgQVBJIGZyb20gR29vZ2xlIENsb3VkIEZpcmVzdG9yZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImZhMSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQ2IiB3aWR0aD0iMzU4IiBoZWlnaHQ9IjExOCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzAiIHk9IjY0IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojOTRhM2I4Ij5PTiBBV1MgVE9EQVk8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI4MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjkwIiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTIuNXB4Ij5Zb3VyIGFwcDwvdGV4dD4KPHRleHQgeD0iOTAiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkR5bmFtb0RCIFNESzwvdGV4dD4KPGxpbmUgeDE9IjE1MCIgeTE9IjExMyIgeDI9IjIxMCIgeTI9IjExMyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZmExKSIvPgo8dGV4dCB4PSIxODEiIHk9IjEwNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGI7IGZvbnQtc2l6ZTo4LjVweCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8cmVjdCB4PSIyMTQiIHk9IjgwIiB3aWR0aD0iMTQ4IiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjg4IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTEuNXB4Ij5BbWF6b24gRHluYW1vREI8L3RleHQ+Cjx0ZXh0IHg9IjI4OCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+QVdTLW1hbmFnZWQ8L3RleHQ+CjxsaW5lIHgxPSI0MTgiIHkxPSI0MCIgeDI9IjQxOCIgeTI9IjE2MCIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8cmVjdCB4PSI0NjIiIHk9IjQ2IiB3aWR0aD0iMzYyIiBoZWlnaHQ9IjExOCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDc2IiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzA0Nzg1NyI+T04gVEhFIFRBUkdFVCBDTE9VRDwvdGV4dD4KPHJlY3QgeD0iNDc0IiB5PSI4MCIgd2lkdGg9IjkyIiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNTIwIiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTJweCI+WW91ciBhcHA8L3RleHQ+Cjx0ZXh0IHg9IjUyMCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNTk2NjkiPnNhbWUgU0RLPC90ZXh0Pgo8bGluZSB4MT0iNTY2IiB5MT0iMTEzIiB4Mj0iNTkwIiB5Mj0iMTEzIiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNmYTEpIi8+CjxyZWN0IHg9IjU5NCIgeT0iNzYiIHdpZHRoPSIxMTAiIGhlaWdodD0iNzQiIHJ4PSIxMSIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNyIvPgo8dGV4dCB4PSI2NDkiIHk9IjEwMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtc2l6ZToxMnB4Ij5UZW5zb3I5PC90ZXh0Pgo8dGV4dCB4PSI2NDkiIHk9IjExNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+c2VydmljZTwvdGV4dD4KPHRleHQgeD0iNjQ5IiB5PSIxMzEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPmFkYXB0ZXI8L3RleHQ+CjxsaW5lIHgxPSI3MDQiIHkxPSIxMTMiIHgyPSI3MjgiIHkyPSIxMTMiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2ZhMSkiLz4KPHJlY3QgeD0iNzMyIiB5PSI4MCIgd2lkdGg9Ijg0IiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNzc0IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTFweCI+RmlyZXN0b3JlPC90ZXh0Pgo8dGV4dCB4PSI3NzQiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPk5hdGl2ZTwvdGV4dD4KPC9zdmc+" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: in the target cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from Google Cloud Firestore." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogaW4gdGhlIHRhcmdldCBjbG91ZCB0aGUgc2FtZSBhcHBsaWNhdGlvbiBhbmQgU0RLIGNhbGwgYSBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgRHluYW1vREIgQVBJIGZyb20gR29vZ2xlIENsb3VkIEZpcmVzdG9yZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImZhMSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQ2IiB3aWR0aD0iMzU4IiBoZWlnaHQ9IjExOCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzAiIHk9IjY0IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogIzk0YTNiOCI+T04gQVdTIFRPREFZPC90ZXh0Pgo8cmVjdCB4PSIzMCIgeT0iODAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI5MCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+WW91ciBhcHA8L3RleHQ+Cjx0ZXh0IHg9IjkwIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5EeW5hbW9EQiBTREs8L3RleHQ+CjxsaW5lIHgxPSIxNTAiIHkxPSIxMTMiIHgyPSIyMTAiIHkyPSIxMTMiIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2ZhMSkiLz4KPHRleHQgeD0iMTgxIiB5PSIxMDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6OC41cHgiPkR5bmFtb0RCIEFQSTwvdGV4dD4KPHJlY3QgeD0iMjE0IiB5PSI4MCIgd2lkdGg9IjE0OCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjI4OCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExLjVweCI+QW1hem9uIER5bmFtb0RCPC90ZXh0Pgo8dGV4dCB4PSIyODgiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkFXUy1tYW5hZ2VkPC90ZXh0Pgo8bGluZSB4MT0iNDE4IiB5MT0iNDAiIHgyPSI0MTgiIHkyPSIxNjAiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHJlY3QgeD0iNDYyIiB5PSI0NiIgd2lkdGg9IjM2MiIgaGVpZ2h0PSIxMTgiIHJ4PSIxNCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjQ3NiIgeT0iNjQiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTBkZWM4Ij5PTiBUSEUgVEFSR0VUIENMT1VEPC90ZXh0Pgo8cmVjdCB4PSI0NzQiIHk9IjgwIiB3aWR0aD0iOTIiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMnB4Ij5Zb3VyIGFwcDwvdGV4dD4KPHRleHQgeD0iNTIwIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjNiI+c2FtZSBTREs8L3RleHQ+CjxsaW5lIHgxPSI1NjYiIHkxPSIxMTMiIHgyPSI1OTAiIHkyPSIxMTMiIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2ZhMSkiLz4KPHJlY3QgeD0iNTk0IiB5PSI3NiIgd2lkdGg9IjExMCIgaGVpZ2h0PSI3NCIgcng9IjExIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjY0OSIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEycHgiPlRlbnNvcjk8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5zZXJ2aWNlPC90ZXh0Pgo8dGV4dCB4PSI2NDkiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+YWRhcHRlcjwvdGV4dD4KPGxpbmUgeDE9IjcwNCIgeTE9IjExMyIgeDI9IjcyOCIgeTI9IjExMyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZmExKSIvPgo8cmVjdCB4PSI3MzIiIHk9IjgwIiB3aWR0aD0iODQiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI3NzQiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMXB4Ij5GaXJlc3RvcmU8L3RleHQ+Cjx0ZXh0IHg9Ijc3NCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+TmF0aXZlPC90ZXh0Pgo8L3N2Zz4=" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: in the target cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from Google Cloud Firestore." />
</div>

<p className="t9-caption">Your application uses the DynamoDB API through an adapter in the customer environment.</p>

#### Architecture

The adapter parses DynamoDB requests and expressions, executes Firestore operations and returns DynamoDB responses. Durable item and table state lives in Firestore. It authenticates with the customer's workload identity. Instances can restart without recovering local data; stream-enabled tables still require one active writer.

On the Firestore side there is no per-table container to provision. Every logical DynamoDB table lives in **one Firestore collection, `ddb`**, and each item is a document whose id encodes the table and the item's key (`orders|u#42`), with a `_tbl` field that discriminates which logical table a document belongs to and a table-prefixed `_pk` field that routes a base `Query` to one partition's documents. A reserved registry document holds the table registry (declared schemas and creation time), which is what lets a table your app creates at runtime be served with no Firestore provisioning (see the section on where tables live). Every DynamoDB item is stored so its exact types survive, and each declared secondary index is served by a Firestore composite index over the item's existing tagged scalar fields. Because the adapter is stateless, this Firestore layout is the entire durable state of the system.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBcmNoaXRlY3R1cmU6IHRoZSBhcHAncyBEeW5hbW9EQiBTREsgY2FsbHMgYSBzdGF0ZWxlc3MgUnVzdCBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgQVBJIGZyb20gR29vZ2xlIENsb3VkIEZpcmVzdG9yZS4gRmlyZXN0b3JlIGhvbGRzIGFsbCBzdGF0ZSBpbiBPTkUgY29sbGVjdGlvbiBuYW1lZCBkZGIsIHdoZXJlIGV2ZXJ5IGxvZ2ljYWwgdGFibGUncyBkb2N1bWVudHMgbGl2ZSB0b2dldGhlciBhbmQgc2Vjb25kYXJ5IGluZGV4ZXMgYWRkcmVzcyBuYXRpdmUgdGFnZ2VkIGl0ZW0gZmllbGRzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iZmEyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSI4IiB5PSIzNCIgd2lkdGg9IjgyMCIgaGVpZ2h0PSIyMDgiIHJ4PSIxNiIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjI2IiB5PSI1NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkNVU1RPTUVSJ1MgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxMTAiIHdpZHRoPSIxMTQiIGhlaWdodD0iOTIiIHJ4PSIxMiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI4MyIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEzcHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTY4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+RHluYW1vREIgU0RLPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNTk2NjkiPnVuY2hhbmdlZDwvdGV4dD4KPGxpbmUgeDE9IjE0MCIgeTE9IjE1NiIgeDI9IjE5MiIgeTI9IjE1NiIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZmEyKSIvPgo8dGV4dCB4PSIxNjYiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGI7IGZvbnQtc2l6ZTo4LjVweCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8cmVjdCB4PSIxOTYiIHk9IjEyMiIgd2lkdGg9IjE2OCIgaGVpZ2h0PSI2OCIgcng9IjEyIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjI4MCIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEzcHgiPmFkYXB0ZXI8L3RleHQ+Cjx0ZXh0IHg9IjI4MCIgeT0iMTY4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5zdGF0ZWxlc3MgwrcgUnVzdDwvdGV4dD4KPGxpbmUgeDE9IjM2NCIgeTE9IjE1NiIgeDI9IjQzNiIgeTI9IjE1NiIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZmEyKSIvPgo8dGV4dCB4PSI0MDAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGI7IGZvbnQtc2l6ZTo4LjVweCI+RmlyZXN0b3JlIFJFU1Q8L3RleHQ+Cjx0ZXh0IHg9IjQwMCIgeT0iMTcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5rZXlsZXNzPC90ZXh0Pgo8cmVjdCB4PSI0NDAiIHk9Ijc4IiB3aWR0aD0iMzcyIiBoZWlnaHQ9IjE1NiIgcng9IjEzIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjYyNiIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTIuNXB4Ij5Hb29nbGUgQ2xvdWQgRmlyZXN0b3JlIMK3IE5hdGl2ZTwvdGV4dD4KPHRleHQgeD0iNjI2IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjEwcHggJ1NGIE1vbm8nLE1lbmxvLG1vbm9zcGFjZTtmaWxsOiM2NDc0OGIiPm9uZSBjb2xsZWN0aW9uICJkZGIiIMK3IGV2ZXJ5IHRhYmxlIHRvZ2V0aGVyPC90ZXh0Pgo8cmVjdCB4PSI0NTQiIHk9IjEyMCIgd2lkdGg9IjIzMCIgaGVpZ2h0PSIxMDQiIHJ4PSIxMCIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI1NjkiIHk9IjEzNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC13ZWlnaHQ6NzAwIj5jb2xsZWN0aW9uOiBkZGI8L3RleHQ+Cjx0ZXh0IHg9IjU2OSIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDojMDQ3ODU3Ij5rZXllZCBieSBkb2N1bWVudCBpZDwvdGV4dD4KPHJlY3QgeD0iNDY2IiB5PSIxNTMiIHdpZHRoPSIyMDYiIGhlaWdodD0iMjAiIHJ4PSI1IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiLz4KPHRleHQgeD0iNTY5IiB5PSIxNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjEwcHggJ1NGIE1vbm8nLE1lbmxvLG1vbm9zcGFjZTtmaWxsOiM0NzU1NjkiPm9yZGVyc3x1IzQyICDihpIgIGl0ZW08L3RleHQ+CjxyZWN0IHg9IjQ2NiIgeT0iMTc3IiB3aWR0aD0iMjA2IiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjYTdmM2QwIi8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTkxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDojNDc1NTY5Ij5vcmRlcnN8dSM4OCAg4oaSICBpdGVtPC90ZXh0Pgo8dGV4dCB4PSI1NjkiIHk9IjIxNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPl90YmwgZGlzY3JpbWluYXRlcyB0YWJsZXM8L3RleHQ+CjxyZWN0IHg9IjY5NiIgeT0iMTIwIiB3aWR0aD0iMTAyIiBoZWlnaHQ9IjEwNCIgcng9IjEwIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTUyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDA7ZmlsbDojNDc1NTY5Ij5pbmRleDwvdGV4dD4KPHRleHQgeD0iNzQ3IiB5PSIxNjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMDtmaWxsOiM0NzU1NjkiPmluZGV4ZXM8L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTg3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+bmF0aXZlIGl0ZW08L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMjAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+ZmllbGQgcGF0aHM8L3RleHQ+Cjwvc3ZnPg==" alt="Architecture: the app's DynamoDB SDK calls a stateless Rust Tensor9 adapter, which serves the API from Google Cloud Firestore. Firestore holds all state in ONE collection named ddb, where every logical table's documents live together and secondary indexes address native tagged item fields." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBcmNoaXRlY3R1cmU6IHRoZSBhcHAncyBEeW5hbW9EQiBTREsgY2FsbHMgYSBzdGF0ZWxlc3MgUnVzdCBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgQVBJIGZyb20gR29vZ2xlIENsb3VkIEZpcmVzdG9yZS4gRmlyZXN0b3JlIGhvbGRzIGFsbCBzdGF0ZSBpbiBPTkUgY29sbGVjdGlvbiBuYW1lZCBkZGIsIHdoZXJlIGV2ZXJ5IGxvZ2ljYWwgdGFibGUncyBkb2N1bWVudHMgbGl2ZSB0b2dldGhlciBhbmQgc2Vjb25kYXJ5IGluZGV4ZXMgYWRkcmVzcyBuYXRpdmUgdGFnZ2VkIGl0ZW0gZmllbGRzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iZmEyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSI4IiB5PSIzNCIgd2lkdGg9IjgyMCIgaGVpZ2h0PSIyMDgiIHJ4PSIxNiIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjI2IiB5PSI1NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkNVU1RPTUVSJ1MgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxMTAiIHdpZHRoPSIxMTQiIGhlaWdodD0iOTIiIHJ4PSIxMiIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI4MyIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEzcHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTY4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+RHluYW1vREIgU0RLPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzYiPnVuY2hhbmdlZDwvdGV4dD4KPGxpbmUgeDE9IjE0MCIgeTE9IjE1NiIgeDI9IjE5MiIgeTI9IjE1NiIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZmEyKSIvPgo8dGV4dCB4PSIxNjYiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo4LjVweCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8cmVjdCB4PSIxOTYiIHk9IjEyMiIgd2lkdGg9IjE2OCIgaGVpZ2h0PSI2OCIgcng9IjEyIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjI4MCIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEzcHgiPmFkYXB0ZXI8L3RleHQ+Cjx0ZXh0IHg9IjI4MCIgeT0iMTY4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5zdGF0ZWxlc3MgwrcgUnVzdDwvdGV4dD4KPGxpbmUgeDE9IjM2NCIgeTE9IjE1NiIgeDI9IjQzNiIgeTI9IjE1NiIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZmEyKSIvPgo8dGV4dCB4PSI0MDAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo4LjVweCI+RmlyZXN0b3JlIFJFU1Q8L3RleHQ+Cjx0ZXh0IHg9IjQwMCIgeT0iMTcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjguNXB4Ij5rZXlsZXNzPC90ZXh0Pgo8cmVjdCB4PSI0NDAiIHk9Ijc4IiB3aWR0aD0iMzcyIiBoZWlnaHQ9IjE1NiIgcng9IjEzIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjYyNiIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTIuNXB4Ij5Hb29nbGUgQ2xvdWQgRmlyZXN0b3JlIMK3IE5hdGl2ZTwvdGV4dD4KPHRleHQgeD0iNjI2IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjEwcHggJ1NGIE1vbm8nLE1lbmxvLG1vbm9zcGFjZTtmaWxsOiAjYzljZmQ4Ij5vbmUgY29sbGVjdGlvbiAiZGRiIiDCtyBldmVyeSB0YWJsZSB0b2dldGhlcjwvdGV4dD4KPHJlY3QgeD0iNDU0IiB5PSIxMjAiIHdpZHRoPSIyMzAiIGhlaWdodD0iMTA0IiByeD0iMTAiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNTY5IiB5PSIxMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMCI+Y29sbGVjdGlvbjogZGRiPC90ZXh0Pgo8dGV4dCB4PSI1NjkiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6ICM5MGRlYzgiPmtleWVkIGJ5IGRvY3VtZW50IGlkPC90ZXh0Pgo8cmVjdCB4PSI0NjYiIHk9IjE1MyIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNjY1MyIvPgo8dGV4dCB4PSI1NjkiIHk9IjE2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6ICNjOWNmZDgiPm9yZGVyc3x1IzQyICDihpIgIGl0ZW08L3RleHQ+CjxyZWN0IHg9IjQ2NiIgeT0iMTc3IiB3aWR0aD0iMjA2IiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q2NjUzIi8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTkxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDogI2M5Y2ZkOCI+b3JkZXJzfHUjODggIOKGkiAgaXRlbTwvdGV4dD4KPHRleHQgeD0iNTY5IiB5PSIyMTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5fdGJsIGRpc2NyaW1pbmF0ZXMgdGFibGVzPC90ZXh0Pgo8cmVjdCB4PSI2OTYiIHk9IjEyMCIgd2lkdGg9IjEwMiIgaGVpZ2h0PSIxMDQiIHJ4PSIxMCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI3NDciIHk9IjE1MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwO2ZpbGw6ICNjOWNmZDgiPmluZGV4PC90ZXh0Pgo8dGV4dCB4PSI3NDciIHk9IjE2NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwO2ZpbGw6ICNjOWNmZDgiPmluZGV4ZXM8L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTg3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+bmF0aXZlIGl0ZW08L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMjAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+ZmllbGQgcGF0aHM8L3RleHQ+Cjwvc3ZnPg==" alt="Architecture: the app's DynamoDB SDK calls a stateless Rust Tensor9 adapter, which serves the API from Google Cloud Firestore. Firestore holds all state in ONE collection named ddb, where every logical table's documents live together and secondary indexes address native tagged item fields." />
</div>

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgRmlyZXN0b3JlIHBoeXNpY2FsIHBsYW4sIHdoaWNoIGV4ZWN1dGVzIGFzIFJFU1QgY2FsbHM6IGEgZG9jdW1lbnQgR0VULCBhIHJ1blF1ZXJ5IG9yIGEgY29tbWl0LiBGaXJlc3RvcmUgaG9sZHMgZXZlcnkgdGFibGUncyBkb2N1bWVudHMgaW4gb25lIGRkYiBjb2xsZWN0aW9uLCB3aXRoIGEgY29tcG9zaXRlIGluZGV4IHBlciBkZWNsYXJlZCBzZWNvbmRhcnkgaW5kZXguIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPgo8bWFya2VyIGlkPSJhZnMxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImFmczIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwNTk2NjkiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDAiIHdpZHRoPSIzOTIiIGhlaWdodD0iMTQwIiByeD0iMTQiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMiIgeT0iMzAiIGZpbGw9IiMxNTgwM2QiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5USEUgQURBUFRFUjwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI4MyIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiIj5EeW5hbW9EQiBBUEk8L3RleHQ+Cjx0ZXh0IHg9IjgzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnRoZSByZXF1ZXN0PC90ZXh0Pgo8bGluZSB4MT0iMTM2IiB5MT0iODciIHgyPSIxNTgiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhZnMyKSIvPgo8cmVjdCB4PSIxNjQiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIyMTciIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+TG9naWNhbCBwbGFuPC90ZXh0Pgo8dGV4dCB4PSIyMTciIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+YmFja2VuZC1uZXV0cmFsPC90ZXh0Pgo8bGluZSB4MT0iMjcwIiB5MT0iODciIHgyPSIyOTIiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhZnMyKSIvPgo8cmVjdCB4PSIyOTgiIHk9IjY0IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMzRkMzk5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIzNDgiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+UGh5c2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMzQ4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkZpcmVzdG9yZS1zcGVjaWZpYzwvdGV4dD4KPHRleHQgeD0iMjEyIiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5vbmUgUkVTVCBjYWxsIHBlciBzdGVwOiBHRVQsIHJ1blF1ZXJ5IG9yIGNvbW1pdDwvdGV4dD4KPGxpbmUgeDE9IjQxMiIgeTE9Ijg3IiB4Mj0iNDUyIiB5Mj0iODciIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYWZzMSkiLz4KPHJlY3QgeD0iNDU4IiB5PSI0MCIgd2lkdGg9IjM2MiIgaGVpZ2h0PSIxNDAiIHJ4PSIxNCIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjQ3NCIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5HT09HTEUgQ0xPVUQgRklSRVNUT1JFPC90ZXh0Pgo8cmVjdCB4PSI0NzYiIHk9IjY0IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjQ0IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI1NTEiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+T25lIGNvbGxlY3Rpb246IGRkYjwvdGV4dD4KPHRleHQgeD0iNTUxIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmV2ZXJ5IHRhYmxlJ3MgZG9jdW1lbnRzPC90ZXh0Pgo8cmVjdCB4PSI2NDIiIHk9IjY0IiB3aWR0aD0iMTYyIiBoZWlnaHQ9IjQ0IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI3MjMiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+Q29tcG9zaXRlIGluZGV4ZXM8L3RleHQ+Cjx0ZXh0IHg9IjcyMyIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5vbmUgcGVyIGRlY2xhcmVkIGluZGV4PC90ZXh0Pgo8dGV4dCB4PSI2MzkiIHk9IjE0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPl90YmwgdGVsbHMgdGhlIGxvZ2ljYWwgdGFibGVzIGFwYXJ0PC90ZXh0Pgo8L3N2Zz4=" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Firestore physical plan, which executes as REST calls: a document GET, a runQuery or a commit. Firestore holds every table's documents in one ddb collection, with a composite index per declared secondary index." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgRmlyZXN0b3JlIHBoeXNpY2FsIHBsYW4sIHdoaWNoIGV4ZWN1dGVzIGFzIFJFU1QgY2FsbHM6IGEgZG9jdW1lbnQgR0VULCBhIHJ1blF1ZXJ5IG9yIGEgY29tbWl0LiBGaXJlc3RvcmUgaG9sZHMgZXZlcnkgdGFibGUncyBkb2N1bWVudHMgaW4gb25lIGRkYiBjb2xsZWN0aW9uLCB3aXRoIGEgY29tcG9zaXRlIGluZGV4IHBlciBkZWNsYXJlZCBzZWNvbmRhcnkgaW5kZXguIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPgo8bWFya2VyIGlkPSJhZnMxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImFmczIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMyMGY3YjQiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDAiIHdpZHRoPSIzOTIiIGhlaWdodD0iMTQwIiByeD0iMTQiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMiIgeT0iMzAiIGZpbGw9IiMzOWRlNzciIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5USEUgQURBUFRFUjwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI4MyIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+Cjx0ZXh0IHg9IjgzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnRoZSByZXF1ZXN0PC90ZXh0Pgo8bGluZSB4MT0iMTM2IiB5MT0iODciIHgyPSIxNTgiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhZnMyKSIvPgo8cmVjdCB4PSIxNjQiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIyMTciIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+TG9naWNhbCBwbGFuPC90ZXh0Pgo8dGV4dCB4PSIyMTciIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+YmFja2VuZC1uZXV0cmFsPC90ZXh0Pgo8bGluZSB4MT0iMjcwIiB5MT0iODciIHgyPSIyOTIiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhZnMyKSIvPgo8cmVjdCB4PSIyOTgiIHk9IjY0IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMzRkMzk5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIzNDgiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+UGh5c2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMzQ4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkZpcmVzdG9yZS1zcGVjaWZpYzwvdGV4dD4KPHRleHQgeD0iMjEyIiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5vbmUgUkVTVCBjYWxsIHBlciBzdGVwOiBHRVQsIHJ1blF1ZXJ5IG9yIGNvbW1pdDwvdGV4dD4KPGxpbmUgeDE9IjQxMiIgeTE9Ijg3IiB4Mj0iNDUyIiB5Mj0iODciIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYWZzMSkiLz4KPHJlY3QgeD0iNDU4IiB5PSI0MCIgd2lkdGg9IjM2MiIgaGVpZ2h0PSIxNDAiIHJ4PSIxNCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjQ3NCIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5HT09HTEUgQ0xPVUQgRklSRVNUT1JFPC90ZXh0Pgo8cmVjdCB4PSI0NzYiIHk9IjY0IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjQ0IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI1NTEiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+T25lIGNvbGxlY3Rpb246IGRkYjwvdGV4dD4KPHRleHQgeD0iNTUxIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmV2ZXJ5IHRhYmxlJ3MgZG9jdW1lbnRzPC90ZXh0Pgo8cmVjdCB4PSI2NDIiIHk9IjY0IiB3aWR0aD0iMTYyIiBoZWlnaHQ9IjQ0IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI3MjMiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+Q29tcG9zaXRlIGluZGV4ZXM8L3RleHQ+Cjx0ZXh0IHg9IjcyMyIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5vbmUgcGVyIGRlY2xhcmVkIGluZGV4PC90ZXh0Pgo8dGV4dCB4PSI2MzkiIHk9IjE0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPl90YmwgdGVsbHMgdGhlIGxvZ2ljYWwgdGFibGVzIGFwYXJ0PC90ZXh0Pgo8L3N2Zz4=" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Firestore physical plan, which executes as REST calls: a document GET, a runQuery or a commit. Firestore holds every table's documents in one ddb collection, with a composite index per declared secondary index." />
</div>

<p className="t9-caption">A stateless Rust adapter serves the DynamoDB API in front of Firestore; all durable state lives in one Firestore collection, "ddb", where every logical table's documents live together and are told apart by a \_tbl field.</p>

<p className="t9-caption">The adapter first builds a storage-independent request plan, then converts it to a Firestore-specific plan for execution.</p>

#### Schemas

The envelope preserves DynamoDB's type system without making values opaque to Firestore. Each attribute is a one-tag map: strings use `{"S": stringValue}`, numbers use `{"N": integerValue|doubleValue}`, binary uses `{"B": bytesValue}`, and sets, lists, maps, booleans, and null retain their own tags. That keeps a numeric value distinct from a numeric-looking string while allowing native filters and indexes to address paths such as `item.total.N`.

Native number storage has an explicit boundary. Signed 64-bit integral values remain exact Firestore integers; other numbers are accepted only inside a conservative 15-significant-digit double envelope. A DynamoDB number outside that envelope fails before storage instead of being rounded silently. The `item` map sits beside the routing fields `id`, `_pk`, `_tbl`, `_okey`, and `_keyAttrs`.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIER5bmFtb0RCIGl0ZW0gaXMgd3JhcHBlZCBpbiBhIEZpcmVzdG9yZSBkb2N1bWVudCB3aG9zZSBvbmUtdGFnIGF0dHJpYnV0ZSBtYXBzIGNvbnRhaW4gbmF0aXZlIEZpcmVzdG9yZSBzY2FsYXJzLiBJbnRlZ2VycyByZW1haW4gZXhhY3QgYW5kIGZyYWN0aW9uYWwgbnVtYmVycyBwYXNzIGEgcHJlY2lzaW9uIGNoZWNrIGJlZm9yZSBiZWNvbWluZyBkb3VibGVzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJmYTMiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzA1OTY2OSIvPjwvbWFya2VyPjwvZGVmcz4KPHRleHQgeD0iMjYiIHk9IjMwIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojNjQ3NDhiIj5EWU5BTU9EQiBJVEVNPC90ZXh0Pgo8cmVjdCB4PSIyNiIgeT0iNDIiIHdpZHRoPSIzMDAiIGhlaWdodD0iMTgwIiByeD0iMTIiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNDQiIHk9Ijc0IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4mIzEyMzs8L3RleHQ+Cjx0ZXh0IHg9IjYwIiB5PSI5OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+InBrIjogICAgJiMxMjM7ICJTIjogInVzZXIjNDIiICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+InNrIjogICAgJiMxMjM7ICJTIjogIm9yZGVyIzciICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9IjE0NiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6I2I0NTMwOSI+InRvdGFsIjogJiMxMjM7ICJOIjogIjEyMy40NSIgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iMTcwIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4idGFncyI6ICAmIzEyMzsgIlNTIjogWyJ2aXAiXSAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjQ0IiB5PSIxOTQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPiYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNDQiIHk9IjIxNCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6I2I0NTMwOSI+TiBpcyB2YWxpZGF0ZWQgYmVmb3JlIG5hdGl2ZSBzdG9yYWdlPC90ZXh0Pgo8bGluZSB4MT0iMzM0IiB5MT0iMTMyIiB4Mj0iMzg2IiB5Mj0iMTMyIiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNmYTMpIi8+Cjx0ZXh0IHg9IjM2MCIgeT0iMTIzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDAiPndyYXA8L3RleHQ+Cjx0ZXh0IHg9IjM5NiIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiMwNDc4NTciPkZJUkVTVE9SRSBET0NVTUVOVCDCtyBST1VUSU5HICsgSVRFTTwvdGV4dD4KPHJlY3QgeD0iMzk2IiB5PSI0MiIgd2lkdGg9IjQxNCIgaGVpZ2h0PSIxOTgiIHJ4PSIxMiIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8dGV4dCB4PSI0MTQiIHk9IjY4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4mIzEyMzs8L3RleHQ+Cjx0ZXh0IHg9IjQzMCIgeT0iODQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPiJpZCI6ICAgICAgICAib3JkZXJzfHBrPVM6dXNlciM0Mnxzaz1TOm9yZGVyIzciLDwvdGV4dD4KPHRleHQgeD0iNDMwIiB5PSIxMDIiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTciPiJfcGsiOiAgICAgICAib3JkZXJzfFM6dXNlciM0MiIsPC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9IjEyMCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+Il90YmwiOiAgICAgICJvcmRlcnMiLDwvdGV4dD4KPHRleHQgeD0iNDMwIiB5PSIxMzgiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTciPiJfb2tleSI6ICAgICAi4oCmIiw8L3RleHQ+Cjx0ZXh0IHg9IjQzMCIgeT0iMTU2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMDQ3ODU3Ij4iX2tleUF0dHJzIjogWyJwayIsInNrIl0sPC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9IjE3NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+Iml0ZW0iOiAmIzEyMzs8L3RleHQ+Cjx0ZXh0IHg9IjQ0NiIgeT0iMTkyIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojYjQ1MzA5Ij4idG90YWwiOiAmIzEyMzsgIk4iOiAxMjMuNDUgJiMxMjU7LCAg4oCmPC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9IjIxMCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+JiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9IjIyOCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+JiMxMjU7PC90ZXh0Pgo8L3N2Zz4=" alt="A DynamoDB item is wrapped in a Firestore document whose one-tag attribute maps contain native Firestore scalars. Integers remain exact and fractional numbers pass a precision check before becoming doubles." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIER5bmFtb0RCIGl0ZW0gaXMgd3JhcHBlZCBpbiBhIEZpcmVzdG9yZSBkb2N1bWVudCB3aG9zZSBvbmUtdGFnIGF0dHJpYnV0ZSBtYXBzIGNvbnRhaW4gbmF0aXZlIEZpcmVzdG9yZSBzY2FsYXJzLiBJbnRlZ2VycyByZW1haW4gZXhhY3QgYW5kIGZyYWN0aW9uYWwgbnVtYmVycyBwYXNzIGEgcHJlY2lzaW9uIGNoZWNrIGJlZm9yZSBiZWNvbWluZyBkb3VibGVzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJmYTMiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzIwZjdiNCIvPjwvbWFya2VyPjwvZGVmcz4KPHRleHQgeD0iMjYiIHk9IjMwIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogI2M5Y2ZkOCI+RFlOQU1PREIgSVRFTTwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQyIiB3aWR0aD0iMzAwIiBoZWlnaHQ9IjE4MCIgcng9IjEyIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjQ0IiB5PSI3NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiYjMTIzOzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9Ijk4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+InBrIjogICAgJiMxMjM7ICJTIjogInVzZXIjNDIiICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiJzayI6ICAgICYjMTIzOyAiUyI6ICJvcmRlciM3IiAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjYwIiB5PSIxNDYiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjZGViMjkwIj4idG90YWwiOiAmIzEyMzsgIk4iOiAiMTIzLjQ1IiAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjYwIiB5PSIxNzAiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij4idGFncyI6ICAmIzEyMzsgIlNTIjogWyJ2aXAiXSAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjQ0IiB5PSIxOTQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij4mIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjQ0IiB5PSIyMTQiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjZGViMjkwIj5OIGlzIHZhbGlkYXRlZCBiZWZvcmUgbmF0aXZlIHN0b3JhZ2U8L3RleHQ+CjxsaW5lIHgxPSIzMzQiIHkxPSIxMzIiIHgyPSIzODYiIHkyPSIxMzIiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2ZhMykiLz4KPHRleHQgeD0iMzYwIiB5PSIxMjMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMCI+d3JhcDwvdGV4dD4KPHRleHQgeD0iMzk2IiB5PSIzMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPkZJUkVTVE9SRSBET0NVTUVOVCDCtyBST1VUSU5HICsgSVRFTTwvdGV4dD4KPHJlY3QgeD0iMzk2IiB5PSI0MiIgd2lkdGg9IjQxNCIgaGVpZ2h0PSIxOTgiIHJ4PSIxMiIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8dGV4dCB4PSI0MTQiIHk9IjY4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+JiMxMjM7PC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9Ijg0IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+ImlkIjogICAgICAgICJvcmRlcnN8cGs9Uzp1c2VyIzQyfHNrPVM6b3JkZXIjNyIsPC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9IjEwMiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICM5MGRlYzgiPiJfcGsiOiAgICAgICAib3JkZXJzfFM6dXNlciM0MiIsPC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9IjEyMCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICM5MGRlYzgiPiJfdGJsIjogICAgICAib3JkZXJzIiw8L3RleHQ+Cjx0ZXh0IHg9IjQzMCIgeT0iMTM4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+Il9va2V5IjogICAgICLigKYiLDwvdGV4dD4KPHRleHQgeD0iNDMwIiB5PSIxNTYiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij4iX2tleUF0dHJzIjogWyJwayIsInNrIl0sPC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9IjE3NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiJpdGVtIjogJiMxMjM7PC90ZXh0Pgo8dGV4dCB4PSI0NDYiIHk9IjE5MiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNkZWIyOTAiPiJ0b3RhbCI6ICYjMTIzOyAiTiI6IDEyMy40NSAmIzEyNTssICDigKY8L3RleHQ+Cjx0ZXh0IHg9IjQzMCIgeT0iMjEwIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+JiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9IjIyOCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiYjMTI1OzwvdGV4dD4KPC9zdmc+" alt="A DynamoDB item is wrapped in a Firestore document whose one-tag attribute maps contain native Firestore scalars. Integers remain exact and fractional numbers pass a precision check before becoming doubles." />
</div>

<p className="t9-caption">Each attribute keeps its DynamoDB type tag while scalar payloads use native Firestore values, so filters and secondary indexes can execute in storage.</p>

#### Where tables live

Firestore is **fully serverless**: there is no account tier, no throughput mode, and no capacity band to size. Every DynamoDB table you declare is compiled into the same Firestore collection (`ddb`) , and each table's documents are told apart by a `_tbl` discriminator and a table-prefixed document id and `_pk` route. Firestore shards documents automatically, and billing follows operations and stored data. Idle tables can still incur storage charges. A reserved registry document holds the declared schemas and creation times.

Runtime `CreateTable` writes the logical schema into the registry; `DescribeTable` and `ListTables` read it. `DeleteTable` invalidates the old table generation with one metadata write. Recreated tables use a new generation, such as `orders#2`. Old documents become invisible to the application and remain stored until bounded cleanup on a later same-name deletion.

* **Key schema is required.** A composite-key table's key schema comes from a declared CreateTable, the registry document, or is learned from the first key-bearing request. A Put that can't resolve its key schema is rejected outright, never written under a guessed key.
* **Isolation is logical, not physical.** Tables are kept apart by the `_tbl` discriminator and the table-prefixed id and `_pk`, all inside the project's one Firestore database, which is shared across the project's Firestore-backed apps. A point `GetItem` and a base `Query` isolate by the table-prefixed route; only a `Scan` (and the registry sweeps) filters on `_tbl`. Per-install physical isolation (a dedicated named database and a database-scoped identity) is not provided; the separation stays logical.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjE4IiB2aWV3Qm94PSIwIDAgODM2IDIxOCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFdmVyeSBkZWNsYXJlZCB0YWJsZSBsaXZlcyBpbiBPTkUgRmlyZXN0b3JlIGNvbGxlY3Rpb24gbmFtZWQgZGRiLCB0b2xkIGFwYXJ0IGJ5IGEgX3RibCBkaXNjcmltaW5hdG9yLCBub3Qgb25lIGNvbGxlY3Rpb24gZWFjaC4gRmlyZXN0b3JlIGlzIGZ1bGx5IHNlcnZlcmxlc3M6IG5vIHRocm91Z2hwdXQgbW9kZSB0byBjaG9vc2UsIG5vIGNhcGFjaXR5IHRvIHNpemUsIGRvY3VtZW50cyBhdXRvLXNoYXJkZWQsIGJpbGxlZCBmb3Igb3BlcmF0aW9ucyBhbmQgc3RvcmFnZS4gQ3JlYXRlVGFibGUgYW5kIERlbGV0ZVRhYmxlIGFyZSBwdXJlIGRhdGEtcGxhbmUgb3BlcmF0aW9ucyBvbiB0aGUgcmVnaXN0cnkuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+Cjx0ZXh0IHg9IjI2IiB5PSIyOCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzA0Nzg1NyI+VEhFIFBST0pFQ1QnUyBGSVJFU1RPUkUgwrcgY29sbGVjdGlvbiAiZGRiIjwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQwIiB3aWR0aD0iNDcwIiBoZWlnaHQ9IjE1OCIgcng9IjE0IiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+CjxyZWN0IHg9IjQ0IiB5PSI1OCIgd2lkdGg9IjEzMiIgaGVpZ2h0PSI4NiIgcng9IjEwIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjExMCIgeT0iODYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTciPl90Ymw6IG9yZGVyczwvdGV4dD4KPHRleHQgeD0iMTEwIiB5PSIxMDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5vd24gZG9jdW1lbnRzPC90ZXh0Pgo8dGV4dCB4PSIxMTAiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm5hdGl2ZSBpbmRleGVzPC90ZXh0Pgo8cmVjdCB4PSIxOTUiIHk9IjU4IiB3aWR0aD0iMTMyIiBoZWlnaHQ9Ijg2IiByeD0iMTAiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMjYxIiB5PSI4NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+X3RibDogdXNlcnM8L3RleHQ+Cjx0ZXh0IHg9IjI2MSIgeT0iMTA4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b3duIGRvY3VtZW50czwvdGV4dD4KPHRleHQgeD0iMjYxIiB5PSIxMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5uYXRpdmUgaW5kZXhlczwvdGV4dD4KPHJlY3QgeD0iMzQ2IiB5PSI1OCIgd2lkdGg9IjEzMiIgaGVpZ2h0PSI4NiIgcng9IjEwIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjQxMiIgeT0iODYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTciPl90Ymw6IGV2ZW50czwvdGV4dD4KPHRleHQgeD0iNDEyIiB5PSIxMDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5vd24gZG9jdW1lbnRzPC90ZXh0Pgo8dGV4dCB4PSI0MTIiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm5hdGl2ZSBpbmRleGVzPC90ZXh0Pgo8dGV4dCB4PSIyNjEiIHk9IjE3NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9uZSBjb2xsZWN0aW9uIMK3IGxvZ2ljYWwgdGFibGVzIGJ5IF90YmwgwrcgYSByZWdpc3RyeSBkb2N1bWVudCBob2xkcyB0aGUgc2NoZW1hczwvdGV4dD4KPHRleHQgeD0iNTI2IiB5PSIyOCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzY0NzQ4YiI+RlVMTFkgU0VSVkVSTEVTUzwvdGV4dD4KPHJlY3QgeD0iNTI2IiB5PSI0MCIgd2lkdGg9IjI4NiIgaGVpZ2h0PSIxNTgiIHJ4PSIxNCIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNCA0Ii8+CjxyZWN0IHg9IjU0MiIgeT0iNTgiIHdpZHRoPSIyNTQiIGhlaWdodD0iNDAiIHJ4PSI5IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS4yIi8+Cjx0ZXh0IHg9IjY2OSIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmaWxsOiM0NzU1NjkiPm5vIHRocm91Z2hwdXQgbW9kZSB0byBjaG9vc2U8L3RleHQ+CjxyZWN0IHg9IjU0MiIgeT0iMTA2IiB3aWR0aD0iMjU0IiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8dGV4dCB4PSI2NjkiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+ZG9jdW1lbnRzIGF1dG8tc2hhcmRlZCwgbm8gY2FwYWNpdHkgdG8gc2l6ZTwvdGV4dD4KPHJlY3QgeD0iNTQyIiB5PSIxNTQiIHdpZHRoPSIyNTQiIGhlaWdodD0iNDAiIHJ4PSI5IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS4yIi8+Cjx0ZXh0IHg9IjY2OSIgeT0iMTc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZmlsbDojNDc1NTY5Ij5vcGVyYXRpb24gYW5kIHN0b3JhZ2UgY2hhcmdlczwvdGV4dD4KPC9zdmc+" alt="Every declared table lives in ONE Firestore collection named ddb, told apart by a _tbl discriminator, not one collection each. Firestore is fully serverless: no throughput mode to choose, no capacity to size, documents auto-sharded, billed for operations and storage. CreateTable and DeleteTable are pure data-plane operations on the registry." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjE4IiB2aWV3Qm94PSIwIDAgODM2IDIxOCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFdmVyeSBkZWNsYXJlZCB0YWJsZSBsaXZlcyBpbiBPTkUgRmlyZXN0b3JlIGNvbGxlY3Rpb24gbmFtZWQgZGRiLCB0b2xkIGFwYXJ0IGJ5IGEgX3RibCBkaXNjcmltaW5hdG9yLCBub3Qgb25lIGNvbGxlY3Rpb24gZWFjaC4gRmlyZXN0b3JlIGlzIGZ1bGx5IHNlcnZlcmxlc3M6IG5vIHRocm91Z2hwdXQgbW9kZSB0byBjaG9vc2UsIG5vIGNhcGFjaXR5IHRvIHNpemUsIGRvY3VtZW50cyBhdXRvLXNoYXJkZWQsIGJpbGxlZCBmb3Igb3BlcmF0aW9ucyBhbmQgc3RvcmFnZS4gQ3JlYXRlVGFibGUgYW5kIERlbGV0ZVRhYmxlIGFyZSBwdXJlIGRhdGEtcGxhbmUgb3BlcmF0aW9ucyBvbiB0aGUgcmVnaXN0cnkuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+Cjx0ZXh0IHg9IjI2IiB5PSIyOCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPlRIRSBQUk9KRUNUJ1MgRklSRVNUT1JFIMK3IGNvbGxlY3Rpb24gImRkYiI8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSI0MCIgd2lkdGg9IjQ3MCIgaGVpZ2h0PSIxNTgiIHJ4PSIxNCIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8cmVjdCB4PSI0NCIgeT0iNTgiIHdpZHRoPSIxMzIiIGhlaWdodD0iODYiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q2NjUzIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIxMTAiIHk9Ijg2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+X3RibDogb3JkZXJzPC90ZXh0Pgo8dGV4dCB4PSIxMTAiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm93biBkb2N1bWVudHM8L3RleHQ+Cjx0ZXh0IHg9IjExMCIgeT0iMTI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+bmF0aXZlIGluZGV4ZXM8L3RleHQ+CjxyZWN0IHg9IjE5NSIgeT0iNTgiIHdpZHRoPSIxMzIiIGhlaWdodD0iODYiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q2NjUzIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIyNjEiIHk9Ijg2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+X3RibDogdXNlcnM8L3RleHQ+Cjx0ZXh0IHg9IjI2MSIgeT0iMTA4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+b3duIGRvY3VtZW50czwvdGV4dD4KPHRleHQgeD0iMjYxIiB5PSIxMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5uYXRpdmUgaW5kZXhlczwvdGV4dD4KPHJlY3QgeD0iMzQ2IiB5PSI1OCIgd2lkdGg9IjEzMiIgaGVpZ2h0PSI4NiIgcng9IjEwIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjQxMiIgeT0iODYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij5fdGJsOiBldmVudHM8L3RleHQ+Cjx0ZXh0IHg9IjQxMiIgeT0iMTA4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+b3duIGRvY3VtZW50czwvdGV4dD4KPHRleHQgeD0iNDEyIiB5PSIxMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5uYXRpdmUgaW5kZXhlczwvdGV4dD4KPHRleHQgeD0iMjYxIiB5PSIxNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5vbmUgY29sbGVjdGlvbiDCtyBsb2dpY2FsIHRhYmxlcyBieSBfdGJsIMK3IGEgcmVnaXN0cnkgZG9jdW1lbnQgaG9sZHMgdGhlIHNjaGVtYXM8L3RleHQ+Cjx0ZXh0IHg9IjUyNiIgeT0iMjgiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjYzljZmQ4Ij5GVUxMWSBTRVJWRVJMRVNTPC90ZXh0Pgo8cmVjdCB4PSI1MjYiIHk9IjQwIiB3aWR0aD0iMjg2IiBoZWlnaHQ9IjE1OCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI0IDQiLz4KPHJlY3QgeD0iNTQyIiB5PSI1OCIgd2lkdGg9IjI1NCIgaGVpZ2h0PSI0MCIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPHRleHQgeD0iNjY5IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPm5vIHRocm91Z2hwdXQgbW9kZSB0byBjaG9vc2U8L3RleHQ+CjxyZWN0IHg9IjU0MiIgeT0iMTA2IiB3aWR0aD0iMjU0IiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8dGV4dCB4PSI2NjkiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPmRvY3VtZW50cyBhdXRvLXNoYXJkZWQsIG5vIGNhcGFjaXR5IHRvIHNpemU8L3RleHQ+CjxyZWN0IHg9IjU0MiIgeT0iMTU0IiB3aWR0aD0iMjU0IiBoZWlnaHQ9IjQwIiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8dGV4dCB4PSI2NjkiIHk9IjE3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPm9wZXJhdGlvbiBhbmQgc3RvcmFnZSBjaGFyZ2VzPC90ZXh0Pgo8L3N2Zz4=" alt="Every declared table lives in ONE Firestore collection named ddb, told apart by a _tbl discriminator, not one collection each. Firestore is fully serverless: no throughput mode to choose, no capacity to size, documents auto-sharded, billed for operations and storage. CreateTable and DeleteTable are pure data-plane operations on the registry." />
</div>

<p className="t9-caption">Every declared table shares one "ddb" collection, told apart by a \_tbl discriminator; Firestore is fully serverless, so there is no throughput mode to pick. At runtime, CreateTable / DeleteTable / UpdateTable are pure data-plane ops on the registry, no Firestore admin call.</p>

#### Conditional writes

A conditional write reads the document and its `updateTime`, evaluates the DynamoDB condition in the adapter, then writes only if that version still matches. Creation uses a does-not-exist precondition.

A false condition returns `ConditionalCheckFailed`. A concurrent write changing the document version returns a retryable conflict. The SDK can retry the latter without treating it as a failed application condition.

This path adds an item read before the guarded write. The retry is driven by your SDK's backoff, not looped inside the layer. Even without contention, the read adds latency and a billed read operation. On a hot, heavily-contended document the conflict-and-retry loop can spend more time colliding than making progress, and a finite SDK retry budget can surface that contention to your app as a throttling failure.

Which writes avoid reading the item first?

Firestore's native API supports masked field updates and atomic transforms, including increments. The DynamoDB adapter currently uses a narrower set of these capabilities:

* **PutItem and DeleteItem:** one direct document write when there is no condition, `ReturnValues=NONE` and DynamoDB Streams is disabled.
* **UpdateItem with only top-level REMOVE actions:** one masked document write when there is no condition, `ReturnValues=NONE`, Streams is disabled and the update does not touch the configured TTL attribute.
* **SET and other updates, by default:** read-modify-write. A blind SET cannot validate the resulting DynamoDB item's 400-KiB limit, so the adapter reads the existing item before applying and validating the update. Arithmetic, nested updates, returned item attributes and TTL-attribute changes also take this path; Firestore's native increment support is not currently used for DynamoDB numeric updates.

**Optional relaxed size validation:** set `FIRESTORE_ALLOW_OVERSIZED_BLIND_UPDATES` to `"true"` in the adapter configuration to enable blind top-level SET/REMOVE updates under the same no-condition, no-return-values, no-Streams and no-TTL-change requirements. Primary-key and secondary-index-key changes, and updates on tables with an LSI, retain the validated path. This option defaults to `"false"`.

The option skips only the aggregate 400-KiB resulting-item check. Firestore still enforces its [1-MiB document limit](https://docs.cloud.google.com/firestore/quotas), which includes the adapter's type tags and metadata; that is not a 1-MiB DynamoDB payload allowance. PutItem, read-modify-write and transactions retain their checks. An item grown above 400 KiB may need a blind removal or replacement of a large attribute before validated writes succeed. No performance measurement is claimed for this opt-in.

The read-modify-write path computes the new item in the adapter and writes with a document-version precondition, preserving atomicity when another writer races. Performance for a direct write does not establish the latency of this path. Native primitives are described in the [Firestore Write API](https://docs.cloud.google.com/firestore/docs/reference/rest/v1/Write).

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIGNvbmRpdGlvbmFsIHdyaXRlIHJlYWRzIHRoZSBjdXJyZW50IGRvY3VtZW50IGFuZCBpdHMgdXBkYXRlIHRpbWUsIGV2YWx1YXRlcyB0aGUgRHluYW1vREIgY29uZGl0aW9uIGluIHRoZSBsYXllciwgdGhlbiB3cml0ZXMgd2l0aCBhbiB1cGRhdGUtdGltZSBwcmVjb25kaXRpb247IGEgbG9zaW5nIHJhY2UgcmV0dXJucyBhIHJldHJ5YWJsZSBjb25mbGljdCwgbm90IGEgY29uZGl0aW9uIGZhaWx1cmUuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImZhNSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+PC9kZWZzPgo8Y2lyY2xlIGN4PSI0MCIgY3k9IjYwIiByPSIxMyIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPjx0ZXh0IHg9IjQwIiB5PSI2NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC13ZWlnaHQ6NzAwIj4xPC90ZXh0Pgo8cmVjdCB4PSI2MiIgeT0iNDIiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDgiIHJ4PSIxMCIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSI3NiIgeT0iNjIiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTIuNXB4Ij5SZWFkIGN1cnJlbnQgZG9jPC90ZXh0Pgo8dGV4dCB4PSI3NiIgeT0iNzkiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5jYXB0dXJlIGl0cyA8dHNwYW4gc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+dXBkYXRlVGltZTwvdHNwYW4+PC90ZXh0Pgo8bGluZSB4MT0iMTcyIiB5MT0iOTAiIHgyPSIxNzIiIHkyPSIxMTIiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjZmE1KSIvPgo8Y2lyY2xlIGN4PSI0MCIgY3k9IjEzNCIgcj0iMTMiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48dGV4dCB4PSI0MCIgeT0iMTM4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDAiPjI8L3RleHQ+CjxyZWN0IHg9IjYyIiB5PSIxMTYiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDgiIHJ4PSIxMCIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI3NiIgeT0iMTM2IiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEyLjVweCI+RXZhbHVhdGUgY29uZGl0aW9uPC90ZXh0Pgo8dGV4dCB4PSI3NiIgeT0iMTUzIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5pbiB0aGUgbGF5ZXIsIHZzIHRoZSBsaXZlIGl0ZW08L3RleHQ+CjxsaW5lIHgxPSIxNzIiIHkxPSIxNjQiIHgyPSIxNzIiIHkyPSIxODYiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjZmE1KSIvPgo8Y2lyY2xlIGN4PSI0MCIgY3k9IjIwOCIgcj0iMTMiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48dGV4dCB4PSI0MCIgeT0iMjEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDAiPjM8L3RleHQ+CjxyZWN0IHg9IjYyIiB5PSIxOTAiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDgiIHJ4PSIxMCIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSI3NiIgeT0iMjEwIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+V3JpdGUgaWYgdXBkYXRlVGltZSBtYXRjaGVzPC90ZXh0Pgo8dGV4dCB4PSI3NiIgeT0iMjI3IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b3B0aW1pc3RpYy1jb25jdXJyZW5jeSBjb21taXQ8L3RleHQ+CjxsaW5lIHgxPSIyODIiIHkxPSIxNDAiIHgyPSIzNTQiIHkyPSIxNDAiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjZmE1KSIvPgo8cmVjdCB4PSIzNTYiIHk9IjExOCIgd2lkdGg9IjM0MCIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyNiIgeT0iMTM2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEycHgiPmNvbmRpdGlvbiBmYWxzZSDihpI8L3RleHQ+Cjx0ZXh0IHg9IjUyNiIgeT0iMTUyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5Db25kaXRpb25hbENoZWNrRmFpbGVkPC90ZXh0Pgo8bGluZSB4MT0iMjgyIiB5MT0iMjE0IiB4Mj0iMzU0IiB5Mj0iMjE0IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2ZhNSkiLz4KPHJlY3QgeD0iMzU2IiB5PSIxOTIiIHdpZHRoPSIzNDAiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iI2ZmZmJlYiIgc3Ryb2tlPSIjZmRlNjhhIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjYiIHk9IjIxMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjAwIDEycHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiNiNDUzMDkiPmEgcmFjZXIgY2hhbmdlZCBpdCBmaXJzdCDihpI8L3RleHQ+Cjx0ZXh0IHg9IjUyNiIgeT0iMjI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZmlsbDojYjQ1MzA5Ij5yZXRyeWFibGUgY29uZmxpY3QsIG5vdCBhIGNvbmRpdGlvbiBmYWlsdXJlPC90ZXh0Pgo8L3N2Zz4=" alt="A conditional write reads the current document and its update time, evaluates the DynamoDB condition in the layer, then writes with an update-time precondition; a losing race returns a retryable conflict, not a condition failure." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIGNvbmRpdGlvbmFsIHdyaXRlIHJlYWRzIHRoZSBjdXJyZW50IGRvY3VtZW50IGFuZCBpdHMgdXBkYXRlIHRpbWUsIGV2YWx1YXRlcyB0aGUgRHluYW1vREIgY29uZGl0aW9uIGluIHRoZSBsYXllciwgdGhlbiB3cml0ZXMgd2l0aCBhbiB1cGRhdGUtdGltZSBwcmVjb25kaXRpb247IGEgbG9zaW5nIHJhY2UgcmV0dXJucyBhIHJldHJ5YWJsZSBjb25mbGljdCwgbm90IGEgY29uZGl0aW9uIGZhaWx1cmUuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImZhNSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+PC9kZWZzPgo8Y2lyY2xlIGN4PSI0MCIgY3k9IjYwIiByPSIxMyIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPjx0ZXh0IHg9IjQwIiB5PSI2NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj4xPC90ZXh0Pgo8cmVjdCB4PSI2MiIgeT0iNDIiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDgiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSI3NiIgeT0iNjIiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTIuNXB4Ij5SZWFkIGN1cnJlbnQgZG9jPC90ZXh0Pgo8dGV4dCB4PSI3NiIgeT0iNzkiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5jYXB0dXJlIGl0cyA8dHNwYW4gc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPnVwZGF0ZVRpbWU8L3RzcGFuPjwvdGV4dD4KPGxpbmUgeDE9IjE3MiIgeTE9IjkwIiB4Mj0iMTcyIiB5Mj0iMTEyIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2ZhNSkiLz4KPGNpcmNsZSBjeD0iNDAiIGN5PSIxMzQiIHI9IjEzIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS41Ii8+PHRleHQgeD0iNDAiIHk9IjEzOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj4yPC90ZXh0Pgo8cmVjdCB4PSI2MiIgeT0iMTE2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjQ4IiByeD0iMTAiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNzYiIHk9IjEzNiIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtc2l6ZToxMi41cHgiPkV2YWx1YXRlIGNvbmRpdGlvbjwvdGV4dD4KPHRleHQgeD0iNzYiIHk9IjE1MyIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+aW4gdGhlIGxheWVyLCB2cyB0aGUgbGl2ZSBpdGVtPC90ZXh0Pgo8bGluZSB4MT0iMTcyIiB5MT0iMTY0IiB4Mj0iMTcyIiB5Mj0iMTg2IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2ZhNSkiLz4KPGNpcmNsZSBjeD0iNDAiIGN5PSIyMDgiIHI9IjEzIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS41Ii8+PHRleHQgeD0iNDAiIHk9IjIxMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj4zPC90ZXh0Pgo8cmVjdCB4PSI2MiIgeT0iMTkwIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjQ4IiByeD0iMTAiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iNzYiIHk9IjIxMCIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMi41cHgiPldyaXRlIGlmIHVwZGF0ZVRpbWUgbWF0Y2hlczwvdGV4dD4KPHRleHQgeD0iNzYiIHk9IjIyNyIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9wdGltaXN0aWMtY29uY3VycmVuY3kgY29tbWl0PC90ZXh0Pgo8bGluZSB4MT0iMjgyIiB5MT0iMTQwIiB4Mj0iMzU0IiB5Mj0iMTQwIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2ZhNSkiLz4KPHJlY3QgeD0iMzU2IiB5PSIxMTgiIHdpZHRoPSIzNDAiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjYiIHk9IjEzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtc2l6ZToxMnB4Ij5jb25kaXRpb24gZmFsc2Ug4oaSPC90ZXh0Pgo8dGV4dCB4PSI1MjYiIHk9IjE1MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+Q29uZGl0aW9uYWxDaGVja0ZhaWxlZDwvdGV4dD4KPGxpbmUgeDE9IjI4MiIgeTE9IjIxNCIgeDI9IjM1NCIgeTI9IjIxNCIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNmYTUpIi8+CjxyZWN0IHg9IjM1NiIgeT0iMTkyIiB3aWR0aD0iMzQwIiBoZWlnaHQ9IjQ0IiByeD0iMTAiIGZpbGw9IiMzMTJkMWEiIHN0cm9rZT0iIzY2NWQzZCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNTI2IiB5PSIyMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjYwMCAxMnB4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDogI2RlYjI5MCI+YSByYWNlciBjaGFuZ2VkIGl0IGZpcnN0IOKGkjwvdGV4dD4KPHRleHQgeD0iNTI2IiB5PSIyMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjZGViMjkwIj5yZXRyeWFibGUgY29uZmxpY3QsIG5vdCBhIGNvbmRpdGlvbiBmYWlsdXJlPC90ZXh0Pgo8L3N2Zz4=" alt="A conditional write reads the current document and its update time, evaluates the DynamoDB condition in the layer, then writes with an update-time precondition; a losing race returns a retryable conflict, not a condition failure." />
</div>

<p className="t9-caption">False conditions and concurrent document changes return different errors.</p>

#### Secondary indexes

Each declared global secondary index is served **off the base document**. The compiler creates ascending and descending Firestore composite indexes over `_tbl`, the tagged hash scalar, the optional tagged range scalar, and the document's stable `id`. There are no synthetic GSI fields and no separate projected data copy. A re-key updates the index with the item write, a delete disappears with the item, and a sparse item is absent because a missing hash or range field has no matching index entry.

Consistency is therefore **stronger than DynamoDB**, whose GSIs are eventually consistent: here an index query reflects the write that just committed. Hash/range predicates, ordering, cursor, limit, and supported filters are pushed into Firestore; an unrepresentable application filter is evaluated over that bounded native window before the declared DynamoDB attribute set is returned. Native numeric fields compare numerically, and the `id` tie-break makes pagination exact when several items share one GSI range value. The index must still be **declared at compile time**; an undeclared index fails with a validation error rather than falling back to a silent table scan.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjEwIiB2aWV3Qm94PSIwIDAgODM2IDIxMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIGJhc2Ugd3JpdGUgc3RvcmVzIHRhZ2dlZCBuYXRpdmUgaXRlbSBmaWVsZHMuIEZpcmVzdG9yZSBtYWludGFpbnMgY29tcG9zaXRlIGluZGV4ZXMgb3ZlciB0aG9zZSBmaWVsZHMsIHNvIGEgR1NJIHF1ZXJ5IHB1c2hlcyBoYXNoLCByYW5nZSwgY3Vyc29yLCBvcmRlciwgYW5kIGxpbWl0IGludG8gc3RvcmFnZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0iZmE2IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwNTk2NjkiLz48L21hcmtlcj4KPG1hcmtlciBpZD0iZmE2cSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjNjM2NmYxIi8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB4PSIyNiIgeT0iNDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNTgiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMDEiIHk9IjY1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+UHV0SXRlbTwvdGV4dD4KPHRleHQgeD0iMTAxIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnN0YXR1cyA9IFNISVBQRUQ8L3RleHQ+CjxsaW5lIHgxPSIxNzYiIHkxPSI2OSIgeDI9IjIzMiIgeTI9IjY5IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNmYTYpIi8+Cjx0ZXh0IHg9IjIwNCIgeT0iNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+d3JpdGU8L3RleHQ+CjxyZWN0IHg9IjIzNiIgeT0iMzQiIHdpZHRoPSIxODAiIGhlaWdodD0iNzAiIHJ4PSIxMiIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8dGV4dCB4PSIzMjYiIHk9IjYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEycHgiPmJhc2UgZG9jdW1lbnQ8L3RleHQ+Cjx0ZXh0IHg9IjMyNiIgeT0iNzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPml0ZW0gYnkgKF9waywgaWQpPC90ZXh0Pgo8dGV4dCB4PSIzMjYiIHk9IjkzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5pdGVtLnN0YXR1cy5TID0gU0hJUFBFRDwvdGV4dD4KPGxpbmUgeDE9IjMyNiIgeTE9IjEwNCIgeDI9IjMyNiIgeTI9IjEzMiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZmE2KSIvPgo8dGV4dCB4PSIzMzgiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC13ZWlnaHQ6NzAwIj5pbmRleGVkPC90ZXh0Pgo8cmVjdCB4PSIyMzYiIHk9IjEzNCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI2MCIgcng9IjEyIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjMyNiIgeT0iMTU4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjExLjVweCI+RmlyZXN0b3JlIGNvbXBvc2l0ZSBpbmRleDwvdGV4dD4KPHRleHQgeD0iMzI2IiB5PSIxNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPl90YmwsIGl0ZW0uc3RhdHVzLlMsIGlkPC90ZXh0Pgo8cmVjdCB4PSI1MDAiIHk9IjQwIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjU4IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNTc1IiB5PSI2NSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMi41cHgiPlF1ZXJ5IEdTSTwvdGV4dD4KPHRleHQgeD0iNTc1IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnN0YXR1cyA9IFNISVBQRUQ8L3RleHQ+CjxsaW5lIHgxPSI1NzUiIHkxPSI5OCIgeDI9IjU3NSIgeTI9IjE2NCIgc3Ryb2tlPSIjNjM2NmYxIiBzdHJva2Utd2lkdGg9IjEuOCIvPgo8bGluZSB4MT0iNTc1IiB5MT0iMTY0IiB4Mj0iNDE4IiB5Mj0iMTY0IiBzdHJva2U9IiM2MzY2ZjEiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2ZhNnEpIi8+Cjx0ZXh0IHg9IjQ5NiIgeT0iMTU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDojNjM2NmYxIj5lcXVhbGl0eSBsb29rdXA8L3RleHQ+Cjx0ZXh0IHg9IjY5MCIgeT0iNzAiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmaWxsOiM0NzU1Njk7Zm9udC13ZWlnaHQ6NjAwIj5TcGFyc2UgKyBzeW5jaHJvbm91czo8L3RleHQ+Cjx0ZXh0IHg9IjY5MCIgeT0iOTAiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5hbiBpdGVtIG1pc3NpbmcgYW4gaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjY5MCIgeT0iMTA2IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+a2V5IGlzIG5vdCBpbiB0aGUgaW5kZXg7PC90ZXh0Pgo8dGV4dCB4PSI2OTAiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkZpcmVzdG9yZSBtYWludGFpbnMgaXQ8L3RleHQ+Cjx0ZXh0IHg9IjY5MCIgeT0iMTM4IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+d2l0aCB0aGUgaXRlbSB3cml0ZS48L3RleHQ+Cjwvc3ZnPg==" alt="A base write stores tagged native item fields. Firestore maintains composite indexes over those fields, so a GSI query pushes hash, range, cursor, order, and limit into storage." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjEwIiB2aWV3Qm94PSIwIDAgODM2IDIxMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIGJhc2Ugd3JpdGUgc3RvcmVzIHRhZ2dlZCBuYXRpdmUgaXRlbSBmaWVsZHMuIEZpcmVzdG9yZSBtYWludGFpbnMgY29tcG9zaXRlIGluZGV4ZXMgb3ZlciB0aG9zZSBmaWVsZHMsIHNvIGEgR1NJIHF1ZXJ5IHB1c2hlcyBoYXNoLCByYW5nZSwgY3Vyc29yLCBvcmRlciwgYW5kIGxpbWl0IGludG8gc3RvcmFnZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0iZmE2IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMyMGY3YjQiLz48L21hcmtlcj4KPG1hcmtlciBpZD0iZmE2cSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjNjM2NmYxIi8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB4PSIyNiIgeT0iNDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNTgiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMDEiIHk9IjY1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+UHV0SXRlbTwvdGV4dD4KPHRleHQgeD0iMTAxIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnN0YXR1cyA9IFNISVBQRUQ8L3RleHQ+CjxsaW5lIHgxPSIxNzYiIHkxPSI2OSIgeDI9IjIzMiIgeTI9IjY5IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNmYTYpIi8+Cjx0ZXh0IHg9IjIwNCIgeT0iNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMCI+d3JpdGU8L3RleHQ+CjxyZWN0IHg9IjIzNiIgeT0iMzQiIHdpZHRoPSIxODAiIGhlaWdodD0iNzAiIHJ4PSIxMiIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8dGV4dCB4PSIzMjYiIHk9IjYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEycHgiPmJhc2UgZG9jdW1lbnQ8L3RleHQ+Cjx0ZXh0IHg9IjMyNiIgeT0iNzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPml0ZW0gYnkgKF9waywgaWQpPC90ZXh0Pgo8dGV4dCB4PSIzMjYiIHk9IjkzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5pdGVtLnN0YXR1cy5TID0gU0hJUFBFRDwvdGV4dD4KPGxpbmUgeDE9IjMyNiIgeTE9IjEwNCIgeDI9IjMyNiIgeTI9IjEzMiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZmE2KSIvPgo8dGV4dCB4PSIzMzgiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj5pbmRleGVkPC90ZXh0Pgo8cmVjdCB4PSIyMzYiIHk9IjEzNCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI2MCIgcng9IjEyIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjMyNiIgeT0iMTU4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExLjVweCI+RmlyZXN0b3JlIGNvbXBvc2l0ZSBpbmRleDwvdGV4dD4KPHRleHQgeD0iMzI2IiB5PSIxNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5fdGJsLCBpdGVtLnN0YXR1cy5TLCBpZDwvdGV4dD4KPHJlY3QgeD0iNTAwIiB5PSI0MCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI1OCIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjU3NSIgeT0iNjUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTIuNXB4Ij5RdWVyeSBHU0k8L3RleHQ+Cjx0ZXh0IHg9IjU3NSIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5zdGF0dXMgPSBTSElQUEVEPC90ZXh0Pgo8bGluZSB4MT0iNTc1IiB5MT0iOTgiIHgyPSI1NzUiIHkyPSIxNjQiIHN0cm9rZT0iIzNkM2U2NiIgc3Ryb2tlLXdpZHRoPSIxLjgiLz4KPGxpbmUgeDE9IjU3NSIgeTE9IjE2NCIgeDI9IjQxOCIgeTI9IjE2NCIgc3Ryb2tlPSIjM2QzZTY2IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNmYTZxKSIvPgo8dGV4dCB4PSI0OTYiIHk9IjE1NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6ICM2MzY2ZjEiPmVxdWFsaXR5IGxvb2t1cDwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSI3MCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDg7Zm9udC13ZWlnaHQ6NjAwIj5TcGFyc2UgKyBzeW5jaHJvbm91czo8L3RleHQ+Cjx0ZXh0IHg9IjY5MCIgeT0iOTAiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5hbiBpdGVtIG1pc3NpbmcgYW4gaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjY5MCIgeT0iMTA2IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+a2V5IGlzIG5vdCBpbiB0aGUgaW5kZXg7PC90ZXh0Pgo8dGV4dCB4PSI2OTAiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkZpcmVzdG9yZSBtYWludGFpbnMgaXQ8L3RleHQ+Cjx0ZXh0IHg9IjY5MCIgeT0iMTM4IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+d2l0aCB0aGUgaXRlbSB3cml0ZS48L3RleHQ+Cjwvc3ZnPg==" alt="A base write stores tagged native item fields. Firestore maintains composite indexes over those fields, so a GSI query pushes hash, range, cursor, order, and limit into storage." />
</div>

<p className="t9-caption">A declared GSI is a Firestore composite index over the item's native tagged scalar fields; the full query window is selected and ordered in storage.</p>

#### Transactions

`TransactWriteItems` becomes a real **Firestore read-write transaction**. The layer opens a transaction, reads each targeted document inside it, evaluates each item's DynamoDB condition in the adapter (Firestore's document preconditions aren't expressive enough), stages the writes, and commits them atomically. A condition that fails rolls the whole transaction back with nothing written; a commit that loses a race is a transient conflict the SDK retries.

Transactions can span documents, logical tables and partition keys. The adapter enforces DynamoDB's 100-action limit. A cancelled transaction returns a single conditional-failure signal rather than per-item `CancellationReasons`, so the application cannot identify the failed condition from that response.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA2IiB2aWV3Qm94PSIwIDAgODM2IDIwNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIFRyYW5zYWN0V3JpdGVJdGVtcyB3aG9zZSBpdGVtcyBzcGFuIHR3byBkaWZmZXJlbnQgcGFydGl0aW9uIGtleXMgY29tbWl0cyBhcyBvbmUgYXRvbWljIEZpcmVzdG9yZSB0cmFuc2FjdGlvbiBhY3Jvc3MgZG9jdW1lbnRzOyBib3RoIHRoZSBkZWJpdCBhbmQgY3JlZGl0IGNvbW1pdCwgb3IgbmVpdGhlciBkb2VzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJmYTciIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzA1OTY2OSIvPjwvbWFya2VyPjwvZGVmcz4KPHRleHQgeD0iMjYiIHk9IjI4IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojMDQ3ODU3Ij5BQ1JPU1MgUEFSVElUSU9OIEtFWVMg4oaSIEFUT01JQzwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQwIiB3aWR0aD0iMTc2IiBoZWlnaHQ9Ijk0IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMTE0IiB5PSI2NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5UcmFuc2FjdFdyaXRlPC90ZXh0Pgo8dGV4dCB4PSIxMTQiIHk9Ijg2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojNDc1NTY5Ij5hY2NvdW50c3xBICBkZWJpdDwvdGV4dD4KPHRleHQgeD0iMTE0IiB5PSIxMDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPmFjY291bnRzfEIgIGNyZWRpdDwvdGV4dD4KPHRleHQgeD0iMTE0IiB5PSIxMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj50d28gZGlmZmVyZW50IGtleXM8L3RleHQ+CjxsaW5lIHgxPSIyMDIiIHkxPSI4NyIgeDI9IjI1NiIgeTI9Ijg3IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNmYTcpIi8+CjxyZWN0IHg9IjI2MCIgeT0iNTIiIHdpZHRoPSIxOTYiIGhlaWdodD0iNzAiIHJ4PSIxMiIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNyIvPgo8dGV4dCB4PSIzNTgiIHk9IjgwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEyLjVweCI+RmlyZXN0b3JlIHRyYW5zYWN0aW9uPC90ZXh0Pgo8dGV4dCB4PSIzNTgiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5hY3Jvc3MgZG9jdW1lbnRzIMK3IGFsbC1vci1ub3RoaW5nPC90ZXh0Pgo8bGluZSB4MT0iNDU2IiB5MT0iODciIHgyPSI1MTAiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZmE3KSIvPgo8cmVjdCB4PSI1MTQiIHk9IjUyIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjcwIiByeD0iMTIiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iNTk0IiB5PSI4MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5ib3RoIGNvbW1pdDwvdGV4dD4KPHRleHQgeD0iNTk0IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC13ZWlnaHQ6NzAwIj50cmFuc2ZlciBiZXR3ZWVuIEEgYW5kIEI8L3RleHQ+Cjx0ZXh0IHg9IjY5MiIgeT0iNzIiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmaWxsOiM0NzU1Njk7Zm9udC13ZWlnaHQ6NjAwIj5BY3Jvc3MgZG9jdW1lbnRzOzwvdGV4dD4KPHRleHQgeD0iNjkyIiB5PSI5MiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkFkYXB0ZXIgZW5mb3JjZXMgMTAwLTwvdGV4dD4KPHRleHQgeD0iNjkyIiB5PSIxMDgiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5hY3Rpb24gdHJhbnNhY3Rpb25zLjwvdGV4dD4KPC9zdmc+" alt="A TransactWriteItems whose items span two different partition keys commits as one atomic Firestore transaction across documents; both the debit and credit commit, or neither does." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA2IiB2aWV3Qm94PSIwIDAgODM2IDIwNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIFRyYW5zYWN0V3JpdGVJdGVtcyB3aG9zZSBpdGVtcyBzcGFuIHR3byBkaWZmZXJlbnQgcGFydGl0aW9uIGtleXMgY29tbWl0cyBhcyBvbmUgYXRvbWljIEZpcmVzdG9yZSB0cmFuc2FjdGlvbiBhY3Jvc3MgZG9jdW1lbnRzOyBib3RoIHRoZSBkZWJpdCBhbmQgY3JlZGl0IGNvbW1pdCwgb3IgbmVpdGhlciBkb2VzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJmYTciIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzIwZjdiNCIvPjwvbWFya2VyPjwvZGVmcz4KPHRleHQgeD0iMjYiIHk9IjI4IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogIzkwZGVjOCI+QUNST1NTIFBBUlRJVElPTiBLRVlTIOKGkiBBVE9NSUM8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSI0MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NCIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjExNCIgeT0iNjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+VHJhbnNhY3RXcml0ZTwvdGV4dD4KPHRleHQgeD0iMTE0IiB5PSI4NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPmFjY291bnRzfEEgIGRlYml0PC90ZXh0Pgo8dGV4dCB4PSIxMTQiIHk9IjEwNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPmFjY291bnRzfEIgIGNyZWRpdDwvdGV4dD4KPHRleHQgeD0iMTE0IiB5PSIxMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij50d28gZGlmZmVyZW50IGtleXM8L3RleHQ+CjxsaW5lIHgxPSIyMDIiIHkxPSI4NyIgeDI9IjI1NiIgeTI9Ijg3IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNmYTcpIi8+CjxyZWN0IHg9IjI2MCIgeT0iNTIiIHdpZHRoPSIxOTYiIGhlaWdodD0iNzAiIHJ4PSIxMiIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNyIvPgo8dGV4dCB4PSIzNTgiIHk9IjgwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEyLjVweCI+RmlyZXN0b3JlIHRyYW5zYWN0aW9uPC90ZXh0Pgo8dGV4dCB4PSIzNTgiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5hY3Jvc3MgZG9jdW1lbnRzIMK3IGFsbC1vci1ub3RoaW5nPC90ZXh0Pgo8bGluZSB4MT0iNDU2IiB5MT0iODciIHgyPSI1MTAiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZmE3KSIvPgo8cmVjdCB4PSI1MTQiIHk9IjUyIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjcwIiByeD0iMTIiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNjY1MyIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iNTk0IiB5PSI4MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMnB4Ij5ib3RoIGNvbW1pdDwvdGV4dD4KPHRleHQgeD0iNTk0IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj50cmFuc2ZlciBiZXR3ZWVuIEEgYW5kIEI8L3RleHQ+Cjx0ZXh0IHg9IjY5MiIgeT0iNzIiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4O2ZvbnQtd2VpZ2h0OjYwMCI+QWNyb3NzIGRvY3VtZW50czs8L3RleHQ+Cjx0ZXh0IHg9IjY5MiIgeT0iOTIiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5BZGFwdGVyIGVuZm9yY2VzIDEwMC08L3RleHQ+Cjx0ZXh0IHg9IjY5MiIgeT0iMTA4IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+YWN0aW9uIHRyYW5zYWN0aW9ucy48L3RleHQ+Cjwvc3ZnPg==" alt="A TransactWriteItems whose items span two different partition keys commits as one atomic Firestore transaction across documents; both the debit and credit commit, or neither does." />
</div>

<p className="t9-caption">TransactWriteItems maps to a real Firestore transaction across documents: atomic, durable, and isolated, with no single-partition restriction; both the debit and credit commit, or neither does.</p>

#### Limitations

△ Where DynamoDB and Firestore diverge, read before you adopt

* **Concurrent writes to one document.** Repeated updates to the same document can encounter version conflicts or throttling. SDK retries add latency and billed operations, and a finite retry budget can surface an error to the application. Size and test the workload for its actual key distribution.
* **Most updates need read-modify-write by default.** SET reads the item to enforce the 400-KiB resulting-item limit; conditions, arithmetic, nested updates and returned attributes also need a read. Eligible REMOVE-only updates use a direct masked write. The explicit oversized-blind-update option extends this to eligible SET/REMOVE while relaxing item-size fidelity. A document-version conflict on read-modify-write returns a retryable error; SDK retries repeat the work and add latency and billed operations.
* **Isolation is logical, not physical.** Every table lives in the project's one shared Firestore database, kept apart by the `_tbl` discriminator and the table-prefixed id and `_pk`, not by a separate database or a per-table identity. There is no per-install physical isolation (a dedicated named database, a database-scoped identity); the separation stays logical.
* **Secondary indexes must be declared at compile time.** A GSI is served by Firestore composite indexes over native tagged item fields, which is synchronous and strongly consistent (stronger read visibility than DynamoDB's eventually-consistent GSIs). The runtime cannot learn an index definition from traffic: an undeclared index returns a validation error rather than a silent table scan. `ConsistentRead=true` is rejected on a global secondary index, matching DynamoDB's GSI contract; `ConsistentRead=false` is accepted. Local secondary indexes accept strongly consistent reads. The flag restriction does not change the synchronous physical index updates.
* **Reads are always strongly consistent.** A single-document read reflects the latest committed write, regardless of `ConsistentRead`. Estimate Firestore document and index-entry read charges for the actual queries.
* **Some filters run in the compute layer.** Equality, bounded `IN`, and compatible type predicates compile to native tagged item fields and run in Firestore. In `FilterExpression`, `<>`, `attribute_not_exists`, `contains`, `begins_with`, `NOT`, and predicates whose Firestore ordering would conflict with DynamoDB key order are evaluated by the service adapter over the bounded native key/range/cursor window. A string `begins_with` on a GSI sort key is still pushed down as a native access range.
* **A streamed table has one writing instance at a time.** DynamoDB Streams are served from an ordered change-log document co-committed with each write in one transaction, which requires a single writer per streamed table: a second concurrent instance's write is rejected as a retryable throttle until the writer lease passes. Run streamed-table writers at one replica; tables without a stream take concurrent writers safely, and reads are unaffected.
* **Dropped-table storage needs cleanup.** `DeleteTable` invalidates the current table generation with one metadata write. Old documents become invisible immediately but remain stored until bounded cleanup on a later deletion of the same table name. Large tables can therefore continue consuming storage after deletion.
* **Transaction cancellation is coarse.** A cancelled `TransactWriteItems` currently returns a single conditional-failure signal rather than DynamoDB's per-item `CancellationReasons`, so an app can't yet tell which item's condition failed.

#### Other considerations

* **Data migration.** The Firestore store starts empty. Move existing DynamoDB data through an export/import, backfill or dual-write procedure, and validate it before switching traffic.
* **Operations and ownership.** Google operates Firestore; Tensor9 operates the adapter. The adapter uses workload identity and short-lived credentials. The customer manages the Google Cloud project, cluster maintenance and monitoring.
* **Capacity planning.** Firestore bills operations and storage without provisioned throughput. Query and Scan select bounded native windows; unsupported application filters run over those windows in the adapter. Estimate charges from examined documents and index entries, and test contention on frequently updated documents.
* **Read consistency.** The request flag does not select an eventual-read path. Include strongly consistent reads when sizing the workload and estimating charges.
* **Change streams.** DynamoDB Streams are served from an ordered change-log document co-committed with each write, retained for a fixed window, and read back through the Streams API (all four view types). Ordering requires a single writer per streamed table; tables without a stream are unaffected.

### Via Cloud Spanner

| Operation                                            | Area                | Support      | Depth        | Notes                                                                                                                                                                                                                                         |
| ---------------------------------------------------- | ------------------- | ------------ | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BatchGetItem / BatchWriteItem                        | Batch               | Supported    | Common       | lowered to native Spanner batch reads and mutations rather than issued one row at a time                                                                                                                                                      |
| DynamoDB Streams                                     | Indexes + streams   | Out of scope | Full surface | the write executor rejects stream-enabled writes; use another backend when the application requires change records                                                                                                                            |
| Query (GSI)                                          | Indexes + streams   | Supported    | Most usage   | a native index maintained with the row; ConsistentRead=true and ALL\_ATTRIBUTES on an index without all attributes are rejected, matching DynamoDB's GSI restrictions                                                                         |
| Query (LSI)                                          | Indexes + streams   | Supported    | Most usage   | a local secondary index is interleaved with its table, so the query is an index seek and the index is written inside the same transaction as the row                                                                                          |
| Query                                                | Query + scan        | Supported    | Common       | key conditions, filters, ordering and limits compile into GoogleSQL; selective key ranges reduce work, but filters can still examine rows that are not returned                                                                               |
| Scan                                                 | Query + scan        | Supported    | Most usage   | paged table scan; consumes provisioned compute and competes with point reads and writes, so use selective Query access where possible                                                                                                         |
| PutItem / GetItem / UpdateItem / DeleteItem          | Single item         | Supported    | Common       | each item is a row; attribute types round-trip exactly, with numbers at their full decimal precision rather than through a float                                                                                                              |
| CreateTable / UpdateTable / DeleteTable / ListTables | Table control plane | Supported    | Most usage   | table and index definitions are applied as Spanner DDL; throughput-mode changes are a no-op because capacity is the instance's processing units, not the table's                                                                              |
| TransactWriteItems / TransactGetItems                | Transactions        | Supported    | Most usage   | a real Spanner read-write transaction spanning tables and partition keys exactly as DynamoDB's does, at external consistency; the 100-action and one-op-per-item limits are enforced and ClientRequestToken gives the same idempotency window |

#### How it works

Your application keeps its AWS SDK, endpoint configuration, and DynamoDB item formats. The Tensor9 adapter accepts DynamoDB requests and stores data in Spanner.

The adapter compiles a `Query`'s key condition, filter, ordering, and limit into one GoogleSQL statement for Spanner to execute. Selective key ranges reduce work. Filters can still examine rows that are not returned, so compute consumption depends on more than the result size.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogb24gR29vZ2xlIENsb3VkIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGFuZCBTREsgY2FsbCBhIFRlbnNvcjkgYWRhcHRlciwgd2hpY2ggc2VydmVzIHRoZSBEeW5hbW9EQiBBUEkgZnJvbSBHb29nbGUgQ2xvdWQgU3Bhbm5lci4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9InNiYTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPgo8L2RlZnM+CjxyZWN0IHg9IjE2IiB5PSI0NiIgd2lkdGg9IjM1OCIgaGVpZ2h0PSIxMTgiIHJ4PSIxNCIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjMwIiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6Izk0YTNiOCI+T04gQVdTIFRPREFZPC90ZXh0Pgo8cmVjdCB4PSIzMCIgeT0iODAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI5MCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+WW91ciBhcHA8L3RleHQ+Cjx0ZXh0IHg9IjkwIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5EeW5hbW9EQiBTREs8L3RleHQ+CjxsaW5lIHgxPSIxNTAiIHkxPSIxMTMiIHgyPSIyMTAiIHkyPSIxMTMiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI3NiYTEpIi8+Cjx0ZXh0IHg9IjE4MSIgeT0iMTA0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+CjxyZWN0IHg9IjIxNCIgeT0iODAiIHdpZHRoPSIxNDgiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyODgiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPkFtYXpvbiBEeW5hbW9EQjwvdGV4dD4KPHRleHQgeD0iMjg4IiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5BV1MtbWFuYWdlZDwvdGV4dD4KPGxpbmUgeDE9IjQxOCIgeTE9IjQwIiB4Mj0iNDE4IiB5Mj0iMTYwIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS40Ii8+CjxyZWN0IHg9IjQ2MiIgeT0iNDYiIHdpZHRoPSIzNjIiIGhlaWdodD0iMTE4IiByeD0iMTQiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSI0NzYiIHk9IjY0IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojMDQ3ODU3Ij5PTiBHT09HTEUgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjQ3NCIgeT0iODAiIHdpZHRoPSI5MiIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyMCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEycHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI1MjAiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDU5NjY5Ij5zYW1lIFNESzwvdGV4dD4KPGxpbmUgeDE9IjU2NiIgeTE9IjExMyIgeDI9IjU5MCIgeTI9IjExMyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjc2JhMSkiLz4KPHJlY3QgeD0iNTk0IiB5PSI3NiIgd2lkdGg9IjExMCIgaGVpZ2h0PSI3NCIgcng9IjExIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjY0OSIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEycHgiPlRlbnNvcjk8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5zZXJ2aWNlPC90ZXh0Pgo8dGV4dCB4PSI2NDkiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+YWRhcHRlcjwvdGV4dD4KPGxpbmUgeDE9IjcwNCIgeTE9IjExMyIgeDI9IjcxMiIgeTI9IjExMyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjc2JhMSkiLz4KPHJlY3QgeD0iNzE2IiB5PSI4MCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijc2NiIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjExcHgiPkNsb3VkIFNwYW5uZXI8L3RleHQ+Cjx0ZXh0IHg9Ijc2NiIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+bWFuYWdlZDwvdGV4dD4KPC9zdmc+" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: on Google Cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from Google Cloud Spanner." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogb24gR29vZ2xlIENsb3VkIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGFuZCBTREsgY2FsbCBhIFRlbnNvcjkgYWRhcHRlciwgd2hpY2ggc2VydmVzIHRoZSBEeW5hbW9EQiBBUEkgZnJvbSBHb29nbGUgQ2xvdWQgU3Bhbm5lci4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9InNiYTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPgo8L2RlZnM+CjxyZWN0IHg9IjE2IiB5PSI0NiIgd2lkdGg9IjM1OCIgaGVpZ2h0PSIxMTgiIHJ4PSIxNCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjMwIiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5NGEzYjgiPk9OIEFXUyBUT0RBWTwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjgwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iOTAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMi41cHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI5MCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+RHluYW1vREIgU0RLPC90ZXh0Pgo8bGluZSB4MT0iMTUwIiB5MT0iMTEzIiB4Mj0iMjEwIiB5Mj0iMTEzIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNzYmExKSIvPgo8dGV4dCB4PSIxODEiIHk9IjEwNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo4LjVweCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8cmVjdCB4PSIyMTQiIHk9IjgwIiB3aWR0aD0iMTQ4IiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjg4IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5BbWF6b24gRHluYW1vREI8L3RleHQ+Cjx0ZXh0IHg9IjI4OCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+QVdTLW1hbmFnZWQ8L3RleHQ+CjxsaW5lIHgxPSI0MTgiIHkxPSI0MCIgeDI9IjQxOCIgeTI9IjE2MCIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8cmVjdCB4PSI0NjIiIHk9IjQ2IiB3aWR0aD0iMzYyIiBoZWlnaHQ9IjExOCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDc2IiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPk9OIEdPT0dMRSBDTE9VRDwvdGV4dD4KPHJlY3QgeD0iNDc0IiB5PSI4MCIgd2lkdGg9IjkyIiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNTIwIiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+WW91ciBhcHA8L3RleHQ+Cjx0ZXh0IHg9IjUyMCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzYiPnNhbWUgU0RLPC90ZXh0Pgo8bGluZSB4MT0iNTY2IiB5MT0iMTEzIiB4Mj0iNTkwIiB5Mj0iMTEzIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNzYmExKSIvPgo8cmVjdCB4PSI1OTQiIHk9Ijc2IiB3aWR0aD0iMTEwIiBoZWlnaHQ9Ijc0IiByeD0iMTEiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iNjQ5IiB5PSIxMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTJweCI+VGVuc29yOTwvdGV4dD4KPHRleHQgeD0iNjQ5IiB5PSIxMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnNlcnZpY2U8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5hZGFwdGVyPC90ZXh0Pgo8bGluZSB4MT0iNzA0IiB5MT0iMTEzIiB4Mj0iNzEyIiB5Mj0iMTEzIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNzYmExKSIvPgo8cmVjdCB4PSI3MTYiIHk9IjgwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNzY2IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTFweCI+Q2xvdWQgU3Bhbm5lcjwvdGV4dD4KPHRleHQgeD0iNzY2IiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5tYW5hZ2VkPC90ZXh0Pgo8L3N2Zz4=" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: on Google Cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from Google Cloud Spanner." />
</div>

<p className="t9-caption">The application keeps calling the DynamoDB JSON API. The adapter translates it into GoogleSQL against Spanner.</p>

#### Architecture

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgU3Bhbm5lciBwaHlzaWNhbCBwbGFuLCB3aG9zZSByZWFkcyBleGVjdXRlIGFzIG9uZSBHb29nbGVTUUwgc3RhdGVtZW50IGFuZCB3aG9zZSB3cml0ZXMgY29tbWl0IGFzIG11dGF0aW9ucy4gU3Bhbm5lciBob2xkcyBvbmUgZGF0YWJhc2Ugd2l0aCBvbmUgdGFibGUgcGVyIER5bmFtb0RCIHRhYmxlIGFuZCBhIHNlY29uZGFyeSBpbmRleCBwZXIgZGVjbGFyZWQgaW5kZXguIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPgo8bWFya2VyIGlkPSJhaHMyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImFoczMiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwNTk2NjkiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDAiIHdpZHRoPSIzOTIiIGhlaWdodD0iMTQwIiByeD0iMTQiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMiIgeT0iMzAiIGZpbGw9IiMxNTgwM2QiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5USEUgQURBUFRFUjwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI4MyIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiIj5EeW5hbW9EQiBBUEk8L3RleHQ+Cjx0ZXh0IHg9IjgzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnRoZSByZXF1ZXN0PC90ZXh0Pgo8bGluZSB4MT0iMTM2IiB5MT0iODciIHgyPSIxNTgiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhaHMzKSIvPgo8cmVjdCB4PSIxNjQiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIyMTciIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+TG9naWNhbCBwbGFuPC90ZXh0Pgo8dGV4dCB4PSIyMTciIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+YmFja2VuZC1uZXV0cmFsPC90ZXh0Pgo8bGluZSB4MT0iMjcwIiB5MT0iODciIHgyPSIyOTIiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhaHMzKSIvPgo8cmVjdCB4PSIyOTgiIHk9IjY0IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMzRkMzk5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIzNDgiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+UGh5c2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMzQ4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPlNwYW5uZXItc3BlY2lmaWM8L3RleHQ+Cjx0ZXh0IHg9IjIxMiIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+cmVhZHM6IG9uZSBHb29nbGVTUUwgc3RhdGVtZW50IMK3IHdyaXRlczogbXV0YXRpb25zPC90ZXh0Pgo8bGluZSB4MT0iNDEyIiB5MT0iODciIHgyPSI0NTIiIHkyPSI4NyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhaHMyKSIvPgo8cmVjdCB4PSI0NTgiIHk9IjQwIiB3aWR0aD0iMzYyIiBoZWlnaHQ9IjE0MCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDc0IiB5PSIzMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkdPT0dMRSBDTE9VRCBTUEFOTkVSPC90ZXh0Pgo8cmVjdCB4PSI0NzYiIHk9IjY0IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjQ0IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI1NTEiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+U3Bhbm5lciB0YWJsZTwvdGV4dD4KPHRleHQgeD0iNTUxIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9uZSBwZXIgRHluYW1vREIgdGFibGU8L3RleHQ+CjxyZWN0IHg9IjY0MiIgeT0iNjQiIHdpZHRoPSIxNjIiIGhlaWdodD0iNDQiIHJ4PSI5IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjcyMyIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiIj5TZWNvbmRhcnkgaW5kZXhlczwvdGV4dD4KPHRleHQgeD0iNzIzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9uZSBwZXIgZGVjbGFyZWQgaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjYzOSIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b25lIGRhdGFiYXNlIGZvciB0aGUgc3RhY2s8L3RleHQ+Cjwvc3ZnPg==" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Spanner physical plan, whose reads execute as one GoogleSQL statement and whose writes commit as mutations. Spanner holds one database with one table per DynamoDB table and a secondary index per declared index." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgU3Bhbm5lciBwaHlzaWNhbCBwbGFuLCB3aG9zZSByZWFkcyBleGVjdXRlIGFzIG9uZSBHb29nbGVTUUwgc3RhdGVtZW50IGFuZCB3aG9zZSB3cml0ZXMgY29tbWl0IGFzIG11dGF0aW9ucy4gU3Bhbm5lciBob2xkcyBvbmUgZGF0YWJhc2Ugd2l0aCBvbmUgdGFibGUgcGVyIER5bmFtb0RCIHRhYmxlIGFuZCBhIHNlY29uZGFyeSBpbmRleCBwZXIgZGVjbGFyZWQgaW5kZXguIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPgo8bWFya2VyIGlkPSJhaHMyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImFoczMiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMyMGY3YjQiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDAiIHdpZHRoPSIzOTIiIGhlaWdodD0iMTQwIiByeD0iMTQiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMiIgeT0iMzAiIGZpbGw9IiMzOWRlNzciIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5USEUgQURBUFRFUjwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI4MyIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+Cjx0ZXh0IHg9IjgzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnRoZSByZXF1ZXN0PC90ZXh0Pgo8bGluZSB4MT0iMTM2IiB5MT0iODciIHgyPSIxNTgiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhaHMzKSIvPgo8cmVjdCB4PSIxNjQiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIyMTciIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+TG9naWNhbCBwbGFuPC90ZXh0Pgo8dGV4dCB4PSIyMTciIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+YmFja2VuZC1uZXV0cmFsPC90ZXh0Pgo8bGluZSB4MT0iMjcwIiB5MT0iODciIHgyPSIyOTIiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhaHMzKSIvPgo8cmVjdCB4PSIyOTgiIHk9IjY0IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMzRkMzk5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIzNDgiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+UGh5c2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMzQ4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPlNwYW5uZXItc3BlY2lmaWM8L3RleHQ+Cjx0ZXh0IHg9IjIxMiIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cmVhZHM6IG9uZSBHb29nbGVTUUwgc3RhdGVtZW50IMK3IHdyaXRlczogbXV0YXRpb25zPC90ZXh0Pgo8bGluZSB4MT0iNDEyIiB5MT0iODciIHgyPSI0NTIiIHkyPSI4NyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhaHMyKSIvPgo8cmVjdCB4PSI0NTgiIHk9IjQwIiB3aWR0aD0iMzYyIiBoZWlnaHQ9IjE0MCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDc0IiB5PSIzMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkdPT0dMRSBDTE9VRCBTUEFOTkVSPC90ZXh0Pgo8cmVjdCB4PSI0NzYiIHk9IjY0IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjQ0IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI1NTEiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+U3Bhbm5lciB0YWJsZTwvdGV4dD4KPHRleHQgeD0iNTUxIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9uZSBwZXIgRHluYW1vREIgdGFibGU8L3RleHQ+CjxyZWN0IHg9IjY0MiIgeT0iNjQiIHdpZHRoPSIxNjIiIGhlaWdodD0iNDQiIHJ4PSI5IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjcyMyIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5TZWNvbmRhcnkgaW5kZXhlczwvdGV4dD4KPHRleHQgeD0iNzIzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9uZSBwZXIgZGVjbGFyZWQgaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjYzOSIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+b25lIGRhdGFiYXNlIGZvciB0aGUgc3RhY2s8L3RleHQ+Cjwvc3ZnPg==" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Spanner physical plan, whose reads execute as one GoogleSQL statement and whose writes commit as mutations. Spanner holds one database with one table per DynamoDB table and a secondary index per declared index." />
</div>

<p className="t9-caption">Spanner executes the SQL query, including its key condition, filter, ordering, and limit.</p>

#### Rows and keys

Each DynamoDB table becomes a Spanner table. An item is one row, keyed first by its partition key and then by its sort key. This layout lets Spanner read a key range in order and apply `ScanIndexForward` and pagination through the index.

Attribute values retain their DynamoDB types: decimal numbers preserve precision, binary remains binary, and strings and sets retain the distinctions the API requires.

The adapter encodes numeric values as sortable decimal text and normalizes sets. Spanner can evaluate supported comparisons in GoogleSQL over that representation without converting numbers to floating point.

The table also stores local index and expiry information. A local secondary index is interleaved with its table, so its entries are stored with the row they describe. Where a table declares a TTL attribute, the expiry is a generated column derived from that attribute, which a Spanner row-deletion policy uses, so expiry is physical deletion on Spanner's schedule, not a hide-on-read filter the adapter applies.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjIwIiB2aWV3Qm94PSIwIDAgODM2IDIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIER5bmFtb0RCIGl0ZW0gYmVjb21lcyBhIFNwYW5uZXIgcm93IHdob3NlIHByaW1hcnkga2V5IGlzIHRoZSBwYXJ0aXRpb24ga2V5IHRoZW4gdGhlIHNvcnQga2V5LCBzbyBhIGtleS1yYW5nZSBRdWVyeSBpcyBhIGNvbnRpZ3VvdXMgc2NhbiBvZiB0aGUgcHJpbWFyeSBpbmRleC4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0ic3JvdyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDU5NjY5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB4PSIyMCIgeT0iMzQiIHdpZHRoPSIxOTYiIGhlaWdodD0iMTIwIiByeD0iMTIiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMTE4IiB5PSI1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMi41cHgiPkR5bmFtb0RCIGl0ZW08L3RleHQ+Cjx0ZXh0IHg9IjM2IiB5PSI4MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPnBrID0gImN1c3QjNyI8L3RleHQ+Cjx0ZXh0IHg9IjM2IiB5PSI5OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPnNrID0gIjIwMjYtMDktMDkiPC90ZXh0Pgo8dGV4dCB4PSIzNiIgeT0iMTE2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OSI+dG90YWwgPSAxMjMuNDU8L3RleHQ+Cjx0ZXh0IHg9IjM2IiB5PSIxMzQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5Ij50YWdzID0gU1NbImEiLCJiIl08L3RleHQ+CjxsaW5lIHgxPSIyMTYiIHkxPSI5NCIgeDI9IjI2MiIgeTI9Ijk0IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNzcm93KSIvPgo8cmVjdCB4PSIyNjgiIHk9IjI2IiB3aWR0aD0iMzMwIiBoZWlnaHQ9IjEzNiIgcng9IjEzIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjQzMyIgeT0iNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5vbmUgU3Bhbm5lciByb3c8L3RleHQ+CjxyZWN0IHg9IjI4NiIgeT0iNjAiIHdpZHRoPSIyOTQiIGhlaWdodD0iMzQiIHJ4PSI4IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjQzMyIgeT0iNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5Ij5QUklNQVJZIEtFWSAocGssIHNrKTwvdGV4dD4KPHRleHQgeD0iNDMzIiB5PSI4OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPlBhcnRpdGlvbiBrZXkgKyBzb3J0IGtleTwvdGV4dD4KPHRleHQgeD0iNDMzIiB5PSIxMTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPnRvdGFsOiBzb3J0YWJsZSBkZWNpbWFsIHRleHQ8L3RleHQ+Cjx0ZXh0IHg9IjQzMyIgeT0iMTM0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5TZXRzIG5vcm1hbGl6ZWQ7IGJpbmFyeSBwcmVzZXJ2ZWQ8L3RleHQ+CjxsaW5lIHgxPSI1OTgiIHkxPSI5NCIgeDI9IjY0NCIgeTI9Ijk0IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNzcm93KSIvPgo8cmVjdCB4PSI2NTAiIHk9IjU2IiB3aWR0aD0iMTY2IiBoZWlnaHQ9Ijc2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNzMzIiB5PSI3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDU5NjY5Ij5rZXktcmFuZ2UgUXVlcnk8L3RleHQ+Cjx0ZXh0IHg9IjczMyIgeT0iOTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5hIGNvbnRpZ3VvdXMgc2NhbiBvZjwvdGV4dD4KPHRleHQgeD0iNzMzIiB5PSIxMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj50aGUgcHJpbWFyeSBpbmRleDwvdGV4dD4KPHRleHQgeD0iNDMzIiB5PSIxOTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5QYXJ0aXRpb24gYW5kIHNvcnQga2V5cyBiZWNvbWUgdGhlIHJvdyBrZXk8L3RleHQ+Cjwvc3ZnPg==" alt="A DynamoDB item becomes a Spanner row whose primary key is the partition key then the sort key, so a key-range Query is a contiguous scan of the primary index." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjIwIiB2aWV3Qm94PSIwIDAgODM2IDIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIER5bmFtb0RCIGl0ZW0gYmVjb21lcyBhIFNwYW5uZXIgcm93IHdob3NlIHByaW1hcnkga2V5IGlzIHRoZSBwYXJ0aXRpb24ga2V5IHRoZW4gdGhlIHNvcnQga2V5LCBzbyBhIGtleS1yYW5nZSBRdWVyeSBpcyBhIGNvbnRpZ3VvdXMgc2NhbiBvZiB0aGUgcHJpbWFyeSBpbmRleC4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0ic3JvdyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMjBmN2I0Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB4PSIyMCIgeT0iMzQiIHdpZHRoPSIxOTYiIGhlaWdodD0iMTIwIiByeD0iMTIiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMTE4IiB5PSI1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMi41cHgiPkR5bmFtb0RCIGl0ZW08L3RleHQ+Cjx0ZXh0IHg9IjM2IiB5PSI4MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPnBrID0gImN1c3QjNyI8L3RleHQ+Cjx0ZXh0IHg9IjM2IiB5PSI5OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPnNrID0gIjIwMjYtMDktMDkiPC90ZXh0Pgo8dGV4dCB4PSIzNiIgeT0iMTE2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+dG90YWwgPSAxMjMuNDU8L3RleHQ+Cjx0ZXh0IHg9IjM2IiB5PSIxMzQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij50YWdzID0gU1NbImEiLCJiIl08L3RleHQ+CjxsaW5lIHgxPSIyMTYiIHkxPSI5NCIgeDI9IjI2MiIgeTI9Ijk0IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNzcm93KSIvPgo8cmVjdCB4PSIyNjgiIHk9IjI2IiB3aWR0aD0iMzMwIiBoZWlnaHQ9IjEzNiIgcng9IjEzIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjQzMyIgeT0iNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5vbmUgU3Bhbm5lciByb3c8L3RleHQ+CjxyZWN0IHg9IjI4NiIgeT0iNjAiIHdpZHRoPSIyOTQiIGhlaWdodD0iMzQiIHJ4PSI4IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjQzMyIgeT0iNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5QUklNQVJZIEtFWSAocGssIHNrKTwvdGV4dD4KPHRleHQgeD0iNDMzIiB5PSI4OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPlBhcnRpdGlvbiBrZXkgKyBzb3J0IGtleTwvdGV4dD4KPHRleHQgeD0iNDMzIiB5PSIxMTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnRvdGFsOiBzb3J0YWJsZSBkZWNpbWFsIHRleHQ8L3RleHQ+Cjx0ZXh0IHg9IjQzMyIgeT0iMTM0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5TZXRzIG5vcm1hbGl6ZWQ7IGJpbmFyeSBwcmVzZXJ2ZWQ8L3RleHQ+CjxsaW5lIHgxPSI1OTgiIHkxPSI5NCIgeDI9IjY0NCIgeTI9Ijk0IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNzcm93KSIvPgo8cmVjdCB4PSI2NTAiIHk9IjU2IiB3aWR0aD0iMTY2IiBoZWlnaHQ9Ijc2IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNzMzIiB5PSI3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM2Ij5rZXktcmFuZ2UgUXVlcnk8L3RleHQ+Cjx0ZXh0IHg9IjczMyIgeT0iOTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5hIGNvbnRpZ3VvdXMgc2NhbiBvZjwvdGV4dD4KPHRleHQgeD0iNzMzIiB5PSIxMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij50aGUgcHJpbWFyeSBpbmRleDwvdGV4dD4KPHRleHQgeD0iNDMzIiB5PSIxOTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5QYXJ0aXRpb24gYW5kIHNvcnQga2V5cyBiZWNvbWUgdGhlIHJvdyBrZXk8L3RleHQ+Cjwvc3ZnPg==" alt="A DynamoDB item becomes a Spanner row whose primary key is the partition key then the sort key, so a key-range Query is a contiguous scan of the primary index." />
</div>

<p className="t9-caption">Partition and sort keys form the Spanner primary key, which supports ordered range reads.</p>

#### Transactions and consistency

`TransactWriteItems` uses a Spanner read-write transaction across tables and partition keys. Spanner's external consistency also orders transactions in real time. The adapter enforces the 100-action limit, one operation per item and the `ClientRequestToken` idempotency window.

The adapter reads and locks items whose conditions or changes require their current values, evaluates the conditions, then commits the transaction. A failed condition and a concurrency conflict return distinct errors so the client can decide whether to retry. A requested failed-item image is returned with the condition error.

An unconditional `Put` can skip reading the item because it supplies the complete replacement. Conditions, returned prior values, updates computed from existing attributes and delete-size accounting require the existing item to be read.

DynamoDB's aggregate limits are enforced as its own, not Spanner's: each resulting item is validated against the 400 KiB item limit, and the transaction as a whole against DynamoDB's 4 MiB aggregate item-data cap. A request that would exceed either fails the way it fails on AWS.

The adapter's normal reads are strongly consistent, including requests with `ConsistentRead=false`. That flag does not select a cheaper or faster stale-read path. Strong reads on a global secondary index remain rejected for DynamoDB compatibility.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjE0IiB2aWV3Qm94PSIwIDAgODM2IDIxNCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJPbmUgVHJhbnNhY3RXcml0ZUl0ZW1zIGJlY29tZXMgb25lIFNwYW5uZXIgdHJhbnNhY3Rpb24uIENvbmRpdGlvbmFsIGFjdGlvbnMgcmVhZCB0aGUgY3VycmVudCBpdGVtcyBiZWZvcmUgY2hlY2tpbmcgdGhlaXIgY29uZGl0aW9uczsgZWxpZ2libGUgdW5jb25kaXRpb25hbCBwdXRzIGNhbiBza2lwIHRoZSByZWFkLiBBbGwgd3JpdGVzIGNvbW1pdCB0b2dldGhlci4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0ic3R4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwNTk2NjkiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjIwIiB5PSI2NiIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI2MiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijk1IiB5PSI5MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMi41cHgiPlRyYW5zYWN0V3JpdGVJdGVtczwvdGV4dD4KPHRleHQgeD0iOTUiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPjIgaXRlbXMsIDIgdGFibGVzPC90ZXh0Pgo8bGluZSB4MT0iMTcwIiB5MT0iOTciIHgyPSIyMTYiIHkyPSI5NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjc3R4KSIvPgo8cmVjdCB4PSIyMjIiIHk9IjI2IiB3aWR0aD0iMzM2IiBoZWlnaHQ9IjE0NiIgcng9IjEzIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjM5MCIgeT0iNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5vbmUgU3Bhbm5lciByZWFkLXdyaXRlIHRyYW5zYWN0aW9uPC90ZXh0Pgo8cmVjdCB4PSIyNDAiIHk9IjYyIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjQyIiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjYTdmM2QwIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSIzMTAiIHk9IjgwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OSI+b3JkZXJzIC8gbyM0MjwvdGV4dD4KPHRleHQgeD0iMzEwIiB5PSI5NSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPnJlYWQgd2hlbiBuZWVkZWQ8L3RleHQ+CjxyZWN0IHg9IjM5OCIgeT0iNjIiIHdpZHRoPSIxNDIiIGhlaWdodD0iNDIiIHJ4PSI5IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjQ2OSIgeT0iODAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5Ij5zdG9jayAvIHNrdS03PC90ZXh0Pgo8dGV4dCB4PSI0NjkiIHk9Ijk1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+cmVhZCB3aGVuIG5lZWRlZDwvdGV4dD4KPHRleHQgeD0iMzkwIiB5PSIxMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+ZXZhbHVhdGUgZXZlcnkgY29uZGl0aW9uPC90ZXh0Pgo8dGV4dCB4PSIzOTAiIHk9IjE0NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+dGhlbiBjb21taXQgYm90aCByb3dzLCBvciBuZWl0aGVyPC90ZXh0Pgo8bGluZSB4MT0iNTU4IiB5MT0iOTciIHgyPSI2MDQiIHkyPSI5NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjc3R4KSIvPgo8cmVjdCB4PSI2MTAiIHk9IjYwIiB3aWR0aD0iMjA2IiBoZWlnaHQ9Ijc0IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNzEzIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDU5NjY5Ij5leHRlcm5hbCBjb25zaXN0ZW5jeTwvdGV4dD4KPHRleHQgeD0iNzEzIiB5PSIxMDEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5UcmFuc2FjdGlvbnMgZm9sbG93PC90ZXh0Pgo8dGV4dCB4PSI3MTMiIHk9IjExNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnJlYWwtdGltZSBvcmRlcjwvdGV4dD4KPHRleHQgeD0iMzkwIiB5PSIxOTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5DaGVjayBjb25kaXRpb25zLCB0aGVuIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb248L3RleHQ+Cjwvc3ZnPg==" alt="One TransactWriteItems becomes one Spanner transaction. Conditional actions read the current items before checking their conditions; eligible unconditional puts can skip the read. All writes commit together." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjE0IiB2aWV3Qm94PSIwIDAgODM2IDIxNCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJPbmUgVHJhbnNhY3RXcml0ZUl0ZW1zIGJlY29tZXMgb25lIFNwYW5uZXIgdHJhbnNhY3Rpb24uIENvbmRpdGlvbmFsIGFjdGlvbnMgcmVhZCB0aGUgY3VycmVudCBpdGVtcyBiZWZvcmUgY2hlY2tpbmcgdGhlaXIgY29uZGl0aW9uczsgZWxpZ2libGUgdW5jb25kaXRpb25hbCBwdXRzIGNhbiBza2lwIHRoZSByZWFkLiBBbGwgd3JpdGVzIGNvbW1pdCB0b2dldGhlci4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0ic3R4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMyMGY3YjQiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjIwIiB5PSI2NiIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI2MiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijk1IiB5PSI5MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMi41cHgiPlRyYW5zYWN0V3JpdGVJdGVtczwvdGV4dD4KPHRleHQgeD0iOTUiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPjIgaXRlbXMsIDIgdGFibGVzPC90ZXh0Pgo8bGluZSB4MT0iMTcwIiB5MT0iOTciIHgyPSIyMTYiIHkyPSI5NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjc3R4KSIvPgo8cmVjdCB4PSIyMjIiIHk9IjI2IiB3aWR0aD0iMzM2IiBoZWlnaHQ9IjE0NiIgcng9IjEzIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjM5MCIgeT0iNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5vbmUgU3Bhbm5lciByZWFkLXdyaXRlIHRyYW5zYWN0aW9uPC90ZXh0Pgo8cmVjdCB4PSIyNDAiIHk9IjYyIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjQyIiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q2NjUzIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSIzMTAiIHk9IjgwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+b3JkZXJzIC8gbyM0MjwvdGV4dD4KPHRleHQgeD0iMzEwIiB5PSI5NSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPnJlYWQgd2hlbiBuZWVkZWQ8L3RleHQ+CjxyZWN0IHg9IjM5OCIgeT0iNjIiIHdpZHRoPSIxNDIiIGhlaWdodD0iNDIiIHJ4PSI5IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjQ2OSIgeT0iODAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5zdG9jayAvIHNrdS03PC90ZXh0Pgo8dGV4dCB4PSI0NjkiIHk9Ijk1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+cmVhZCB3aGVuIG5lZWRlZDwvdGV4dD4KPHRleHQgeD0iMzkwIiB5PSIxMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMCI+ZXZhbHVhdGUgZXZlcnkgY29uZGl0aW9uPC90ZXh0Pgo8dGV4dCB4PSIzOTAiIHk9IjE0NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+dGhlbiBjb21taXQgYm90aCByb3dzLCBvciBuZWl0aGVyPC90ZXh0Pgo8bGluZSB4MT0iNTU4IiB5MT0iOTciIHgyPSI2MDQiIHkyPSI5NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjc3R4KSIvPgo8cmVjdCB4PSI2MTAiIHk9IjYwIiB3aWR0aD0iMjA2IiBoZWlnaHQ9Ijc0IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNzEzIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM2Ij5leHRlcm5hbCBjb25zaXN0ZW5jeTwvdGV4dD4KPHRleHQgeD0iNzEzIiB5PSIxMDEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5UcmFuc2FjdGlvbnMgZm9sbG93PC90ZXh0Pgo8dGV4dCB4PSI3MTMiIHk9IjExNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnJlYWwtdGltZSBvcmRlcjwvdGV4dD4KPHRleHQgeD0iMzkwIiB5PSIxOTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5DaGVjayBjb25kaXRpb25zLCB0aGVuIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb248L3RleHQ+Cjwvc3ZnPg==" alt="One TransactWriteItems becomes one Spanner transaction. Conditional actions read the current items before checking their conditions; eligible unconditional puts can skip the read. All writes commit together." />
</div>

<p className="t9-caption">Transactions can span tables and partition keys. External consistency preserves transaction order in real time.</p>

#### Secondary indexes

A global secondary index becomes a Spanner secondary index, and a local secondary index an index interleaved with its table. A `Query` against either is an index seek, not a table scan.

Spanner commits secondary-index updates with the row. A subsequent strong index read includes that committed update. DynamoDB GSIs propagate asynchronously, so applications that tolerate index lag do not need to add that wait on this target.

Because the index is a real Spanner index rather than a projected copy, the query engine does the selection. The key condition, ordering, cursor and limit all lower into the index scan, so a selective index query reads close to what it returns rather than filtering a wider read afterwards. A sparse item, one missing the index's key attribute, simply has no index entry, matching DynamoDB's own sparse-index behaviour.

Two rules are inherited from the origin rather than from Spanner. You still cannot request a strongly-consistent read of a global secondary index: `ConsistentRead=true` against one is rejected, exactly as DynamoDB rejects it. And a query that asks for attributes the index does not project is rejected rather than silently fetching them from the base row, so an index with too few attributes for the query returns an error without fetching extra rows. The wire behaviour is the same as the origin's, so code that handles those errors on AWS handles them here unchanged.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA4IiB2aWV3Qm94PSIwIDAgODM2IDIwOCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJTcGFubmVyIHVwZGF0ZXMgdGhlIHJvdyBhbmQgc2Vjb25kYXJ5IGluZGV4IGluIG9uZSB0cmFuc2FjdGlvbi4gQSBzdWJzZXF1ZW50IHN0cm9uZyBpbmRleCByZWFkIGluY2x1ZGVzIHRoZSBjb21taXR0ZWQgdXBkYXRlLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJzaWR4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwNTk2NjkiLz48L21hcmtlcj4KPG1hcmtlciBpZD0ic2lkeHEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzYzNjZmMSIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iMjIiIHk9IjQwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjU2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iOTIiIHk9IjYzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+VXBkYXRlSXRlbTwvdGV4dD4KPHRleHQgeD0iOTIiIHk9IjgxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+c3RhdHVzID0gU0hJUFBFRDwvdGV4dD4KPGxpbmUgeDE9IjE2MiIgeTE9IjY4IiB4Mj0iMjA4IiB5Mj0iNjgiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI3NpZHgpIi8+CjxyZWN0IHg9IjIxNCIgeT0iMjYiIHdpZHRoPSIzMzAiIGhlaWdodD0iMTA2IiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iMzc5IiB5PSI0NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC13ZWlnaHQ6NzAwIj5vbmUgd3JpdGUsIG9uZSB0cmFuc2FjdGlvbjwvdGV4dD4KPHJlY3QgeD0iMjMwIiB5PSI1NiIgd2lkdGg9IjE0NCIgaGVpZ2h0PSI0MCIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iMzAyIiB5PSI3MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPmJhc2Ugcm93PC90ZXh0Pgo8dGV4dCB4PSIzMDIiIHk9Ijg4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+b3JkZXJzIC8gbyM0MjwvdGV4dD4KPHJlY3QgeD0iMzg2IiB5PSI1NiIgd2lkdGg9IjE0NCIgaGVpZ2h0PSI0MCIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iNDU4IiB5PSI3MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPnNlY29uZGFyeSBpbmRleDwvdGV4dD4KPHRleHQgeD0iNDU4IiB5PSI4OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPnN0YXR1cywgaWQ8L3RleHQ+Cjx0ZXh0IHg9IjM3OSIgeT0iMTIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5Sb3cgYW5kIGluZGV4IGNvbW1pdCB0b2dldGhlcjwvdGV4dD4KPHJlY3QgeD0iNTk2IiB5PSIzNCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI1NiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjcwNiIgeT0iNTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTIuNXB4Ij5RdWVyeSB0aGUgR1NJPC90ZXh0Pgo8dGV4dCB4PSI3MDYiIHk9Ijc1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+c3RhdHVzID0gU0hJUFBFRDwvdGV4dD4KPGxpbmUgeDE9IjcwNiIgeTE9IjkwIiB4Mj0iNzA2IiB5Mj0iMTEyIiBzdHJva2U9IiM2MzY2ZjEiIHN0cm9rZS13aWR0aD0iMS44Ii8+CjxsaW5lIHgxPSI3MDYiIHkxPSIxMTIiIHgyPSI1NDYiIHkyPSIxMTIiIHN0cm9rZT0iIzYzNjZmMSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjc2lkeHEpIi8+Cjx0ZXh0IHg9IjYyNiIgeT0iMTA1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZmlsbDojNjM2NmYxIj5JbmRleCBsb29rdXA8L3RleHQ+Cjx0ZXh0IHg9IjM3OSIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+Um93IGFuZCBpbmRleCB1cGRhdGUgaW4gb25lIHRyYW5zYWN0aW9uPC90ZXh0Pgo8L3N2Zz4=" alt="Spanner updates the row and secondary index in one transaction. A subsequent strong index read includes the committed update." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA4IiB2aWV3Qm94PSIwIDAgODM2IDIwOCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJTcGFubmVyIHVwZGF0ZXMgdGhlIHJvdyBhbmQgc2Vjb25kYXJ5IGluZGV4IGluIG9uZSB0cmFuc2FjdGlvbi4gQSBzdWJzZXF1ZW50IHN0cm9uZyBpbmRleCByZWFkIGluY2x1ZGVzIHRoZSBjb21taXR0ZWQgdXBkYXRlLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJzaWR4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMyMGY3YjQiLz48L21hcmtlcj4KPG1hcmtlciBpZD0ic2lkeHEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzYzNjZmMSIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iMjIiIHk9IjQwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjU2IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iOTIiIHk9IjYzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+VXBkYXRlSXRlbTwvdGV4dD4KPHRleHQgeD0iOTIiIHk9IjgxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+c3RhdHVzID0gU0hJUFBFRDwvdGV4dD4KPGxpbmUgeDE9IjE2MiIgeTE9IjY4IiB4Mj0iMjA4IiB5Mj0iNjgiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI3NpZHgpIi8+CjxyZWN0IHg9IjIxNCIgeT0iMjYiIHdpZHRoPSIzMzAiIGhlaWdodD0iMTA2IiByeD0iMTIiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iMzc5IiB5PSI0NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj5vbmUgd3JpdGUsIG9uZSB0cmFuc2FjdGlvbjwvdGV4dD4KPHJlY3QgeD0iMjMwIiB5PSI1NiIgd2lkdGg9IjE0NCIgaGVpZ2h0PSI0MCIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNjY1MyIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iMzAyIiB5PSI3MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPmJhc2Ugcm93PC90ZXh0Pgo8dGV4dCB4PSIzMDIiIHk9Ijg4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+b3JkZXJzIC8gbyM0MjwvdGV4dD4KPHJlY3QgeD0iMzg2IiB5PSI1NiIgd2lkdGg9IjE0NCIgaGVpZ2h0PSI0MCIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNjY1MyIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iNDU4IiB5PSI3MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPnNlY29uZGFyeSBpbmRleDwvdGV4dD4KPHRleHQgeD0iNDU4IiB5PSI4OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPnN0YXR1cywgaWQ8L3RleHQ+Cjx0ZXh0IHg9IjM3OSIgeT0iMTIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5Sb3cgYW5kIGluZGV4IGNvbW1pdCB0b2dldGhlcjwvdGV4dD4KPHJlY3QgeD0iNTk2IiB5PSIzNCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI1NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjcwNiIgeT0iNTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTIuNXB4Ij5RdWVyeSB0aGUgR1NJPC90ZXh0Pgo8dGV4dCB4PSI3MDYiIHk9Ijc1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+c3RhdHVzID0gU0hJUFBFRDwvdGV4dD4KPGxpbmUgeDE9IjcwNiIgeTE9IjkwIiB4Mj0iNzA2IiB5Mj0iMTEyIiBzdHJva2U9IiMzZDNlNjYiIHN0cm9rZS13aWR0aD0iMS44Ii8+CjxsaW5lIHgxPSI3MDYiIHkxPSIxMTIiIHgyPSI1NDYiIHkyPSIxMTIiIHN0cm9rZT0iIzNkM2U2NiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjc2lkeHEpIi8+Cjx0ZXh0IHg9IjYyNiIgeT0iMTA1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzYzNjZmMSI+SW5kZXggbG9va3VwPC90ZXh0Pgo8dGV4dCB4PSIzNzkiIHk9IjE3NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPlJvdyBhbmQgaW5kZXggdXBkYXRlIGluIG9uZSB0cmFuc2FjdGlvbjwvdGV4dD4KPC9zdmc+" alt="Spanner updates the row and secondary index in one transaction. A subsequent strong index read includes the committed update." />
</div>

<p className="t9-caption">Spanner commits row and index updates together. A subsequent strong index read includes the update.</p>

#### Limitations

△ Where DynamoDB and Spanner diverge, read before you adopt

* **Provisioned compute bills through quiet periods.** Both services charge for stored data; Spanner also charges for provisioned compute. Steady utilization can amortize it, but savings depend on workload, capacity, region and replication topology.
* **A hot item still contends.** The adapter hashes partition routes to spread independent keys. Repeated updates to one item still compete; a uniform-key benchmark does not establish hot-item performance.
* **A projected index cannot serve a full-item read.** `Select=ALL_ATTRIBUTES` against a global secondary index that does not project every attribute is rejected rather than quietly fetching the missing columns from the base table. The error names the index, so the fix is either to query the attributes the index already has, or to declare it so it includes them all.
* **Scan competes for provisioned compute.** Paging limits response size, but a broad scan still reads the table and competes with point operations. Prefer a selective `Query` when possible.
* **DynamoDB Streams are not served.** The write executor rejects stream-enabled writes. Use another backend if the application requires an atomic DynamoDB change log.
* **Some writes use read-modify-write.** Conditions, responses that need the existing item, nested updates, arithmetic, changes to secondary-index keys and updates to tables with an LSI take this path. The adapter reads the item, evaluates the condition and computes the change, then commits it in the same Spanner transaction. A transaction conflict can repeat that work. Eligible top-level SET/REMOVE updates avoid the item read; this can include `UPDATED_NEW` when the response is known from assigned values.
* **Measured latency depends on the request type.** The 2026-08-31 workload measured simple unconditional updates. It does not measure the extra read or conflict retries of read-modify-write. The run used 1,000 processing units in us-west1, 100,000 records and a 50/50 read/update workload. With 16 worker threads, steady median throughput was 2,403.0 operations/s through Spanner versus 5,929.5 on native DynamoDB in us-west-2, using three 200,000-operation repetitions after warm-up. Spanner served strong reads; DynamoDB served eventual reads. The standalone adapter capture excluded appliance authorization and durable control-plane logging. These are complete-path results with different regions and consistency, not isolated adapter overhead or measurements of transactions and hot-item contention.

#### Other considerations

* **Data migration.** The Spanner database is provisioned empty. Existing DynamoDB items are not moved in place. Load them through the adapter's DynamoDB API, validate the data and representative queries before switching application traffic. For an online migration, coordinate backfill and ongoing writes so changes made during the copy reach Spanner before cutover.
* **Capacity planning.** Size Spanner compute in processing units. Start from the read and write rates the DynamoDB table was provisioned for rather than from its storage size, and expect to tune once under real load. Spanner's throughput per unit depends heavily on how well the primary key distributes.
* **Operations and ownership.** Google operates Spanner: replication, backups, and failover are theirs. Tensor9 operates the adapter. Spanner stores the data; the adapter runs beside the application.
* **Authentication.** The adapter authenticates to Spanner with the workload's own identity through GKE Workload Identity. There is no key file and no secret to rotate.

### Via Cloud Bigtable

| Operation                                                            | Area                | Support      | Depth        | Notes                                                                                                                                                                                                                            |
| -------------------------------------------------------------------- | ------------------- | ------------ | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BatchGetItem / BatchWriteItem                                        | Batch               | Supported    | Most usage   | independent item operations, without atomicity across the batch                                                                                                                                                                  |
| ConditionExpression                                                  | Conditional writes  | Supported    | Common       | read-modify-write under an atomic row-version guard; conflicting writes repeat the read and condition check, up to eight attempts                                                                                                |
| DynamoDB Streams                                                     | Indexes + streams   | Out of scope | Full surface | no DynamoDB-compatible atomic change log; Bigtable change streams are not exposed as DynamoDB Streams                                                                                                                            |
| Query (GSI / LSI)                                                    | Indexes + streams   | Out of scope | Most usage   | the adapter does not implement DynamoDB secondary-index behavior; native Bigtable materialized views are not exposed as GSI or LSI queries                                                                                       |
| Query / Scan                                                         | Reads               | Supported    | Common       | base-table ordered row ranges with pagination and adapter-side filters; filters can read more rows than they return                                                                                                              |
| PutItem / GetItem / DeleteItem                                       | Single item         | Supported    | Common       | exact DynamoDB item types; reads use a verified single-cluster route                                                                                                                                                             |
| UpdateItem                                                           | Single item         | Partial      | Common       | eligible top-level SET/REMOVE avoids a read but does not enforce the aggregate 400-KiB post-image limit; conditions, returned item images and other update shapes use guarded read-modify-write, except eligible native counters |
| UpdateTimeToLive                                                     | TTL                 | Out of scope | Most usage   | column-family garbage collection does not implement a per-item DynamoDB TTL attribute                                                                                                                                            |
| CreateTable / DescribeTable / UpdateTable / DeleteTable / ListTables | Table control plane | Partial      | Most usage   | logical table lifecycle inside a pre-provisioned physical table; billing-mode metadata does not provision capacity, and indexes, streams and TTL are rejected                                                                    |
| TransactWriteItems / TransactGetItems / ExecuteTransaction           | Transactions        | Out of scope | Most usage   | Bigtable cannot atomically commit or snapshot multiple item rows; these requests are rejected                                                                                                                                    |

#### How it works

Tensor9 runs a DynamoDB adapter beside your application in the customer's environment. It configures `AWS_ENDPOINT_URL_DYNAMODB` to send the AWS SDK's requests to the adapter over the local loopback network. Your SDK and application code stay unchanged. The adapter accepts DynamoDB requests and data types, returns DynamoDB responses and errors, and stores data in Google Cloud Bigtable. It connects to Bigtable over pooled gRPC using the workload identity; no key file is required.

Bigtable provides atomic writes for one row, not across rows , and the adapter maps each DynamoDB item to exactly one row. The adapter uses row mutations and version guards for item writes. This mapping rejects multi-item transactions, secondary indexes, DynamoDB Streams and per-item TTL; the limitations below describe the missing behavior.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogb24gR29vZ2xlIENsb3VkIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGFuZCBTREsgY2FsbCBhIFRlbnNvcjkgYWRhcHRlciwgd2hpY2ggc2VydmVzIHRoZSBEeW5hbW9EQiBBUEkgZnJvbSBDbG91ZCBCaWd0YWJsZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImJ0YSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQ2IiB3aWR0aD0iMzU4IiBoZWlnaHQ9IjExOCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzAiIHk9IjY0IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojOTRhM2I4Ij5PTiBBV1MgVE9EQVk8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI4MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjkwIiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTIuNXB4Ij5Zb3VyIGFwcDwvdGV4dD4KPHRleHQgeD0iOTAiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkR5bmFtb0RCIFNESzwvdGV4dD4KPGxpbmUgeDE9IjE1MCIgeTE9IjExMyIgeDI9IjIxMCIgeTI9IjExMyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYnRhKSIvPgo8dGV4dCB4PSIxODEiIHk9IjEwNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGI7IGZvbnQtc2l6ZTo4LjVweCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8cmVjdCB4PSIyMTQiIHk9IjgwIiB3aWR0aD0iMTQ4IiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjg4IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTEuNXB4Ij5BbWF6b24gRHluYW1vREI8L3RleHQ+Cjx0ZXh0IHg9IjI4OCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+QVdTLW1hbmFnZWQ8L3RleHQ+CjxsaW5lIHgxPSI0MTgiIHkxPSI0MCIgeDI9IjQxOCIgeTI9IjE2MCIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8cmVjdCB4PSI0NjIiIHk9IjQ2IiB3aWR0aD0iMzYyIiBoZWlnaHQ9IjExOCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDc2IiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzA0Nzg1NyI+T04gR09PR0xFIENMT1VEPC90ZXh0Pgo8cmVjdCB4PSI0NzQiIHk9IjgwIiB3aWR0aD0iOTIiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5Zb3VyIGFwcDwvdGV4dD4KPHRleHQgeD0iNTIwIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA1OTY2OSI+c2FtZSBTREs8L3RleHQ+CjxsaW5lIHgxPSI1NjYiIHkxPSIxMTMiIHgyPSI1OTAiIHkyPSIxMTMiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2J0YSkiLz4KPHJlY3QgeD0iNTk0IiB5PSI3NiIgd2lkdGg9IjExMCIgaGVpZ2h0PSI3NCIgcng9IjExIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjY0OSIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEycHgiPlRlbnNvcjk8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5zZXJ2aWNlPC90ZXh0Pgo8dGV4dCB4PSI2NDkiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+YWRhcHRlcjwvdGV4dD4KPGxpbmUgeDE9IjcwNCIgeTE9IjExMyIgeDI9IjcxMiIgeTI9IjExMyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYnRhKSIvPgo8cmVjdCB4PSI3MTYiIHk9IjgwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNzY2IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTFweCI+Q2xvdWQgQmlndGFibGU8L3RleHQ+Cjx0ZXh0IHg9Ijc2NiIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+c2luZ2xlLWNsdXN0ZXI8L3RleHQ+Cjwvc3ZnPg==" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: on Google Cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from Cloud Bigtable." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogb24gR29vZ2xlIENsb3VkIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGFuZCBTREsgY2FsbCBhIFRlbnNvcjkgYWRhcHRlciwgd2hpY2ggc2VydmVzIHRoZSBEeW5hbW9EQiBBUEkgZnJvbSBDbG91ZCBCaWd0YWJsZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImJ0YSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQ2IiB3aWR0aD0iMzU4IiBoZWlnaHQ9IjExOCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzAiIHk9IjY0IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogIzk0YTNiOCI+T04gQVdTIFRPREFZPC90ZXh0Pgo8cmVjdCB4PSIzMCIgeT0iODAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI5MCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+WW91ciBhcHA8L3RleHQ+Cjx0ZXh0IHg9IjkwIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5EeW5hbW9EQiBTREs8L3RleHQ+CjxsaW5lIHgxPSIxNTAiIHkxPSIxMTMiIHgyPSIyMTAiIHkyPSIxMTMiIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2J0YSkiLz4KPHRleHQgeD0iMTgxIiB5PSIxMDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6OC41cHgiPkR5bmFtb0RCIEFQSTwvdGV4dD4KPHJlY3QgeD0iMjE0IiB5PSI4MCIgd2lkdGg9IjE0OCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjI4OCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExLjVweCI+QW1hem9uIER5bmFtb0RCPC90ZXh0Pgo8dGV4dCB4PSIyODgiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkFXUy1tYW5hZ2VkPC90ZXh0Pgo8bGluZSB4MT0iNDE4IiB5MT0iNDAiIHgyPSI0MTgiIHkyPSIxNjAiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHJlY3QgeD0iNDYyIiB5PSI0NiIgd2lkdGg9IjM2MiIgaGVpZ2h0PSIxMTgiIHJ4PSIxNCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjQ3NiIgeT0iNjQiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTBkZWM4Ij5PTiBHT09HTEUgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjQ3NCIgeT0iODAiIHdpZHRoPSI5MiIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyMCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEycHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI1MjAiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM2Ij5zYW1lIFNESzwvdGV4dD4KPGxpbmUgeDE9IjU2NiIgeTE9IjExMyIgeDI9IjU5MCIgeTI9IjExMyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYnRhKSIvPgo8cmVjdCB4PSI1OTQiIHk9Ijc2IiB3aWR0aD0iMTEwIiBoZWlnaHQ9Ijc0IiByeD0iMTEiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iNjQ5IiB5PSIxMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTJweCI+VGVuc29yOTwvdGV4dD4KPHRleHQgeD0iNjQ5IiB5PSIxMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnNlcnZpY2U8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5hZGFwdGVyPC90ZXh0Pgo8bGluZSB4MT0iNzA0IiB5MT0iMTEzIiB4Mj0iNzEyIiB5Mj0iMTEzIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNidGEpIi8+CjxyZWN0IHg9IjcxNiIgeT0iODAiIHdpZHRoPSIxMDAiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI3NjYiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMXB4Ij5DbG91ZCBCaWd0YWJsZTwvdGV4dD4KPHRleHQgeD0iNzY2IiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5zaW5nbGUtY2x1c3RlcjwvdGV4dD4KPC9zdmc+" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: on Google Cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from Cloud Bigtable." />
</div>

<p className="t9-caption">Your application uses the DynamoDB API through an adapter in the customer environment.</p>

#### Architecture

The adapter translates DynamoDB keys and operations into Bigtable row keys, row ranges and mutations. Ordered key ranges implement base-table queries. DynamoDB attribute filters run in the adapter over the selected rows.

A conditional write reads the item, evaluates the DynamoDB condition and uses `CheckAndMutateRow` to commit only if the row version still matches. Another writer changing the row triggers a retry of the read and condition check.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgQmlndGFibGUgcGh5c2ljYWwgcGxhbiwgd2hpY2ggZXhlY3V0ZXMgYXMgb25lIFJlYWRSb3dzIHJhbmdlLCBvciBhIE11dGF0ZVJvdyBvciBDaGVja0FuZE11dGF0ZVJvdy4gQmlndGFibGUgc3RvcmVzIG9uZSByb3cgcGVyIGl0ZW0gYW5kIGlzIGF0b21pYyBmb3Igb25lIHJvdywgbm90IGFjcm9zcyByb3dzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYWJ0MSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPgo8bWFya2VyIGlkPSJhYnQyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDU5NjY5Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQwIiB3aWR0aD0iMzkyIiBoZWlnaHQ9IjE0MCIgcng9IjE0IiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMzNGQzOTkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzIiIHk9IjMwIiBmaWxsPSIjMTU4MDNkIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+VEhFIEFEQVBURVI8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iODMiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+RHluYW1vREIgQVBJPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj50aGUgcmVxdWVzdDwvdGV4dD4KPGxpbmUgeDE9IjEzNiIgeTE9Ijg3IiB4Mj0iMTU4IiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYWJ0MikiLz4KPHJlY3QgeD0iMTY0IiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMjE3IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPkxvZ2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMjE3IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmJhY2tlbmQtbmV1dHJhbDwvdGV4dD4KPGxpbmUgeDE9IjI3MCIgeTE9Ijg3IiB4Mj0iMjkyIiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYWJ0MikiLz4KPHJlY3QgeD0iMjk4IiB5PSI2NCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMzQ4IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPlBoeXNpY2FsIHBsYW48L3RleHQ+Cjx0ZXh0IHg9IjM0OCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5CaWd0YWJsZS1zcGVjaWZpYzwvdGV4dD4KPHRleHQgeD0iMjEyIiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5vbmUgUmVhZFJvd3MgcmFuZ2UgwrcgTXV0YXRlUm93IG9yIENoZWNrQW5kTXV0YXRlUm93PC90ZXh0Pgo8bGluZSB4MT0iNDEyIiB5MT0iODciIHgyPSI0NTIiIHkyPSI4NyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhYnQxKSIvPgo8cmVjdCB4PSI0NTgiIHk9IjQwIiB3aWR0aD0iMzYyIiBoZWlnaHQ9IjE0MCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDc0IiB5PSIzMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkNMT1VEIEJJR1RBQkxFPC90ZXh0Pgo8cmVjdCB4PSI0NzYiIHk9IjY0IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjQ0IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI1NTEiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+T25lIHJvdyBwZXIgaXRlbTwvdGV4dD4KPHRleHQgeD0iNTUxIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmtleSBzb3J0cyBieSB0YWJsZSwgdGhlbiBzazwvdGV4dD4KPHJlY3QgeD0iNjQyIiB5PSI2NCIgd2lkdGg9IjE2MiIgaGVpZ2h0PSI0NCIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNzIzIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPkF0b21pYyBwZXIgcm93PC90ZXh0Pgo8dGV4dCB4PSI3MjMiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+bm90IGFjcm9zcyByb3dzPC90ZXh0Pgo8dGV4dCB4PSI2MzkiIHk9IjE0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9uZSBpbnN0YW5jZSwgc2luZ2xlLWNsdXN0ZXIgYXBwIHByb2ZpbGU8L3RleHQ+Cjwvc3ZnPg==" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Bigtable physical plan, which executes as one ReadRows range, or a MutateRow or CheckAndMutateRow. Bigtable stores one row per item and is atomic for one row, not across rows." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgQmlndGFibGUgcGh5c2ljYWwgcGxhbiwgd2hpY2ggZXhlY3V0ZXMgYXMgb25lIFJlYWRSb3dzIHJhbmdlLCBvciBhIE11dGF0ZVJvdyBvciBDaGVja0FuZE11dGF0ZVJvdy4gQmlndGFibGUgc3RvcmVzIG9uZSByb3cgcGVyIGl0ZW0gYW5kIGlzIGF0b21pYyBmb3Igb25lIHJvdywgbm90IGFjcm9zcyByb3dzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYWJ0MSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPgo8bWFya2VyIGlkPSJhYnQyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMjBmN2I0Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQwIiB3aWR0aD0iMzkyIiBoZWlnaHQ9IjE0MCIgcng9IjE0IiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMzNGQzOTkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzIiIHk9IjMwIiBmaWxsPSIjMzlkZTc3IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+VEhFIEFEQVBURVI8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iODMiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij50aGUgcmVxdWVzdDwvdGV4dD4KPGxpbmUgeDE9IjEzNiIgeTE9Ijg3IiB4Mj0iMTU4IiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYWJ0MikiLz4KPHJlY3QgeD0iMTY0IiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMjE3IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPkxvZ2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMjE3IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmJhY2tlbmQtbmV1dHJhbDwvdGV4dD4KPGxpbmUgeDE9IjI3MCIgeTE9Ijg3IiB4Mj0iMjkyIiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYWJ0MikiLz4KPHJlY3QgeD0iMjk4IiB5PSI2NCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMzQ4IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPlBoeXNpY2FsIHBsYW48L3RleHQ+Cjx0ZXh0IHg9IjM0OCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5CaWd0YWJsZS1zcGVjaWZpYzwvdGV4dD4KPHRleHQgeD0iMjEyIiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5vbmUgUmVhZFJvd3MgcmFuZ2UgwrcgTXV0YXRlUm93IG9yIENoZWNrQW5kTXV0YXRlUm93PC90ZXh0Pgo8bGluZSB4MT0iNDEyIiB5MT0iODciIHgyPSI0NTIiIHkyPSI4NyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhYnQxKSIvPgo8cmVjdCB4PSI0NTgiIHk9IjQwIiB3aWR0aD0iMzYyIiBoZWlnaHQ9IjE0MCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDc0IiB5PSIzMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkNMT1VEIEJJR1RBQkxFPC90ZXh0Pgo8cmVjdCB4PSI0NzYiIHk9IjY0IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjQ0IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI1NTEiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+T25lIHJvdyBwZXIgaXRlbTwvdGV4dD4KPHRleHQgeD0iNTUxIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmtleSBzb3J0cyBieSB0YWJsZSwgdGhlbiBzazwvdGV4dD4KPHJlY3QgeD0iNjQyIiB5PSI2NCIgd2lkdGg9IjE2MiIgaGVpZ2h0PSI0NCIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNzIzIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPkF0b21pYyBwZXIgcm93PC90ZXh0Pgo8dGV4dCB4PSI3MjMiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+bm90IGFjcm9zcyByb3dzPC90ZXh0Pgo8dGV4dCB4PSI2MzkiIHk9IjE0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9uZSBpbnN0YW5jZSwgc2luZ2xlLWNsdXN0ZXIgYXBwIHByb2ZpbGU8L3RleHQ+Cjwvc3ZnPg==" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Bigtable physical plan, which executes as one ReadRows range, or a MutateRow or CheckAndMutateRow. Bigtable stores one row per item and is atomic for one row, not across rows." />
</div>

<p className="t9-caption">The adapter first builds a storage-independent request plan, then converts it to a Bigtable-specific plan for execution.</p>

#### One row per item

Every logical DynamoDB table lives in one provisioned Bigtable table, and each item is one row there. A metadata row records each logical schema and its generation, so the logical tables stay separated inside the shared physical one rather than colliding.

The row key is what makes reads efficient. It is laid out as the logical table, then the partition route, then the *collated* sort key, then an item digest. A generation identifier separates each table incarnation, so a table dropped and recreated cannot read its predecessor's rows. Because the sort key is collated into the key in DynamoDB's own order, one DynamoDB partition becomes one **contiguous** Bigtable range, and a `Query` over a key range is a range read in the right order rather than a filter over unrelated rows.

Item data lives in a raw column family. A second family is an INT64 SUM aggregate, which exists so an integral counter can be updated by Bigtable itself in a single round trip instead of being read, added to and written back. See the next section.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA4IiB2aWV3Qm94PSIwIDAgODM2IDIwOCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIGRhdGEgcm93IGtleSBpcyBjb21wb3NlZCBvZiB0aGUgbG9naWNhbCB0YWJsZSwgdGhlIHBhcnRpdGlvbiByb3V0ZSwgdGhlIGNvbGxhdGVkIHNvcnQga2V5IGFuZCBhbiBpdGVtIGRpZ2VzdCwgd2hpY2ggbWFrZXMgb25lIER5bmFtb0RCIHBhcnRpdGlvbiBhIGNvbnRpZ3VvdXMgQmlndGFibGUgcmFuZ2UgaW4gc29ydC1rZXkgb3JkZXIuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImJ0ciIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDU5NjY5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB4PSIyMCIgeT0iMzQiIHdpZHRoPSIxODAiIGhlaWdodD0iMTA0IiByeD0iMTIiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMTEwIiB5PSI1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMi41cHgiPkR5bmFtb0RCIGl0ZW08L3RleHQ+Cjx0ZXh0IHg9IjM0IiB5PSI4MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPnBrID0gImN1c3QjNyI8L3RleHQ+Cjx0ZXh0IHg9IjM0IiB5PSI5OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPnNrID0gIjIwMjYtMDktMDkiPC90ZXh0Pgo8dGV4dCB4PSIzNCIgeT0iMTE2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OSI+dG90YWwgPSAxMjMuNDU8L3RleHQ+CjxsaW5lIHgxPSIyMDAiIHkxPSI4NiIgeDI9IjI0NiIgeTI9Ijg2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNidHIpIi8+CjxyZWN0IHg9IjI1MiIgeT0iMjYiIHdpZHRoPSIzNjgiIGhlaWdodD0iMTIwIiByeD0iMTMiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iNDM2IiB5PSI0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPm9uZSBCaWd0YWJsZSByb3c8L3RleHQ+CjxyZWN0IHg9IjI2OCIgeT0iNjAiIHdpZHRoPSIzMzYiIGhlaWdodD0iMzQiIHJ4PSI4IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjQzNiIgeT0iNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmb250LXNpemU6MTAuNXB4Ij50YWJsZSB8IHJvdXRlIHwgY29sbGF0ZWQgc29ydCBrZXkgfCBkaWdlc3Q8L3RleHQ+Cjx0ZXh0IHg9IjQzNiIgeT0iODgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiIj50YWJsZSBnZW5lcmF0aW9uIGluIGtleTwvdGV4dD4KPHRleHQgeD0iNDM2IiB5PSIxMTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPnJhdyBmYW1pbHkgZCBmb3IgaXRlbSBkYXRhPC90ZXh0Pgo8dGV4dCB4PSI0MzYiIHk9IjEzMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+SU5UNjQgU1VNIGZhbWlseSBuIGZvciBjb3VudGVyczwvdGV4dD4KPGxpbmUgeDE9IjYyMCIgeTE9Ijg2IiB4Mj0iNjY2IiB5Mj0iODYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2J0cikiLz4KPHJlY3QgeD0iNjcyIiB5PSI0OCIgd2lkdGg9IjE0NiIgaGVpZ2h0PSI3NiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijc0NSIgeT0iNzEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA1OTY2OSI+b25lIHBhcnRpdGlvbiA9PC90ZXh0Pgo8dGV4dCB4PSI3NDUiIHk9Ijg5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b25lIGNvbnRpZ3VvdXMgcmFuZ2UsPC90ZXh0Pgo8dGV4dCB4PSI3NDUiIHk9IjEwNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmluIHNvcnQta2V5IG9yZGVyPC90ZXh0Pgo8dGV4dCB4PSI0MzYiIHk9IjE4NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkVWRVJZIExPR0lDQUwgVEFCTEUgU0hBUkVTIE9ORSBQUk9WSVNJT05FRCBCSUdUQUJMRSBUQUJMRTwvdGV4dD4KPC9zdmc+" alt="A data row key is composed of the logical table, the partition route, the collated sort key and an item digest, which makes one DynamoDB partition a contiguous Bigtable range in sort-key order." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA4IiB2aWV3Qm94PSIwIDAgODM2IDIwOCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIGRhdGEgcm93IGtleSBpcyBjb21wb3NlZCBvZiB0aGUgbG9naWNhbCB0YWJsZSwgdGhlIHBhcnRpdGlvbiByb3V0ZSwgdGhlIGNvbGxhdGVkIHNvcnQga2V5IGFuZCBhbiBpdGVtIGRpZ2VzdCwgd2hpY2ggbWFrZXMgb25lIER5bmFtb0RCIHBhcnRpdGlvbiBhIGNvbnRpZ3VvdXMgQmlndGFibGUgcmFuZ2UgaW4gc29ydC1rZXkgb3JkZXIuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImJ0ciIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMjBmN2I0Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB4PSIyMCIgeT0iMzQiIHdpZHRoPSIxODAiIGhlaWdodD0iMTA0IiByeD0iMTIiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMTEwIiB5PSI1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMi41cHgiPkR5bmFtb0RCIGl0ZW08L3RleHQ+Cjx0ZXh0IHg9IjM0IiB5PSI4MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPnBrID0gImN1c3QjNyI8L3RleHQ+Cjx0ZXh0IHg9IjM0IiB5PSI5OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPnNrID0gIjIwMjYtMDktMDkiPC90ZXh0Pgo8dGV4dCB4PSIzNCIgeT0iMTE2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+dG90YWwgPSAxMjMuNDU8L3RleHQ+CjxsaW5lIHgxPSIyMDAiIHkxPSI4NiIgeDI9IjI0NiIgeTI9Ijg2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNidHIpIi8+CjxyZWN0IHg9IjI1MiIgeT0iMjYiIHdpZHRoPSIzNjgiIGhlaWdodD0iMTIwIiByeD0iMTMiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iNDM2IiB5PSI0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPm9uZSBCaWd0YWJsZSByb3c8L3RleHQ+CjxyZWN0IHg9IjI2OCIgeT0iNjAiIHdpZHRoPSIzMzYiIGhlaWdodD0iMzQiIHJ4PSI4IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjQzNiIgeT0iNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6MTAuNXB4Ij50YWJsZSB8IHJvdXRlIHwgY29sbGF0ZWQgc29ydCBrZXkgfCBkaWdlc3Q8L3RleHQ+Cjx0ZXh0IHg9IjQzNiIgeT0iODgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij50YWJsZSBnZW5lcmF0aW9uIGluIGtleTwvdGV4dD4KPHRleHQgeD0iNDM2IiB5PSIxMTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnJhdyBmYW1pbHkgZCBmb3IgaXRlbSBkYXRhPC90ZXh0Pgo8dGV4dCB4PSI0MzYiIHk9IjEzMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+SU5UNjQgU1VNIGZhbWlseSBuIGZvciBjb3VudGVyczwvdGV4dD4KPGxpbmUgeDE9IjYyMCIgeTE9Ijg2IiB4Mj0iNjY2IiB5Mj0iODYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2J0cikiLz4KPHJlY3QgeD0iNjcyIiB5PSI0OCIgd2lkdGg9IjE0NiIgaGVpZ2h0PSI3NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijc0NSIgeT0iNzEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjNiI+b25lIHBhcnRpdGlvbiA9PC90ZXh0Pgo8dGV4dCB4PSI3NDUiIHk9Ijg5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+b25lIGNvbnRpZ3VvdXMgcmFuZ2UsPC90ZXh0Pgo8dGV4dCB4PSI3NDUiIHk9IjEwNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmluIHNvcnQta2V5IG9yZGVyPC90ZXh0Pgo8dGV4dCB4PSI0MzYiIHk9IjE4NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkVWRVJZIExPR0lDQUwgVEFCTEUgU0hBUkVTIE9ORSBQUk9WSVNJT05FRCBCSUdUQUJMRSBUQUJMRTwvdGV4dD4KPC9zdmc+" alt="A data row key is composed of the logical table, the partition route, the collated sort key and an item digest, which makes one DynamoDB partition a contiguous Bigtable range in sort-key order." />
</div>

<p className="t9-caption">The row key is built so a DynamoDB partition is one contiguous Bigtable range, in the origin's sort order.</p>

#### Writes and atomicity

An unconditional `PutItem` or `DeleteItem`, and a top-level SET/REMOVE `UpdateItem`, use a single `MutateRow`, with no read of the old item and one round trip. A single integral numeric `ADD`, or a SET computed from the attribute's own current value, uses Bigtable's INT64 SUM aggregate cell, so Bigtable performs the addition itself in one RPC rather than the adapter reading, adding and writing back.

Conditions, returned item values, nested changes and arithmetic beyond the supported counter case require a read. The adapter computes the change and commits it with `CheckAndMutateRow` against a version field. Conflicting writes repeat the read and condition check, up to eight attempts.

All of this is atomic for one item and linearizable because the configured app profile routes to a single cluster. Multi-cluster routing would break the row-transaction contract, so the adapter verifies the routing and the column-family contracts through the Bigtable Admin API at startup, before it serves any traffic, rather than discovering a misconfiguration under load.

A top-level SET/REMOVE that skips the item read cannot check the size of the item it produces, so that path relaxes DynamoDB's aggregate 400 KiB limit. An application that depends on that limit being enforced exactly should use a backend that reads before writing.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjMwIiB2aWV3Qm94PSIwIDAgODM2IDIzMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaHJlZSB3cml0ZSBwYXRoczogYW4gdW5jb25kaXRpb25hbCB3cml0ZSBpcyBvbmUgTXV0YXRlUm93LCBhbiBpbnRlZ3JhbCBjb3VudGVyIGFkZCB1c2VzIHRoZSBhZ2dyZWdhdGUgY2VsbCBpbiBvbmUgUlBDLCBhbmQgZXZlcnl0aGluZyBlbHNlIHJlYWRzIHRoZSByb3cgYW5kIGNvbW1pdHMgdGhyb3VnaCBDaGVja0FuZE11dGF0ZVJvdyBhZ2FpbnN0IGEgdmVyc2lvbiBjZWxsLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJidHciIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzA1OTY2OSIvPjwvbWFya2VyPgo8bWFya2VyIGlkPSJidHcyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiNiNDUzMDkiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjIwIiB5PSIzMCIgd2lkdGg9IjE5NiIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjExOCIgeT0iNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTJweCI+dW5jb25kaXRpb25hbCB3cml0ZTwvdGV4dD4KPHRleHQgeD0iMTE4IiB5PSI2NSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPlB1dCwgRGVsZXRlLCB0b3AtbGV2ZWwgU0VUL1JFTU9WRTwvdGV4dD4KPGxpbmUgeDE9IjIxNiIgeTE9IjUyIiB4Mj0iMjg2IiB5Mj0iNTIiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2J0dykiLz4KPHJlY3QgeD0iMjkyIiB5PSIzMCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjM4MiIgeT0iNTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTJweCI+TXV0YXRlUm93PC90ZXh0Pgo8dGV4dCB4PSIzODIiIHk9IjY2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5vbmUgUlBDLCBubyByZWFkPC90ZXh0Pgo8cmVjdCB4PSIyMCIgeT0iOTIiIHdpZHRoPSIxOTYiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMTgiIHk9IjExMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5pbnRlZ3JhbCBjb3VudGVyIEFERDwvdGV4dD4KPHRleHQgeD0iMTE4IiB5PSIxMjciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5vciBzZWxmLWFyaXRobWV0aWMgU0VUPC90ZXh0Pgo8bGluZSB4MT0iMjE2IiB5MT0iMTE0IiB4Mj0iMjg2IiB5Mj0iMTE0IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNidHcpIi8+CjxyZWN0IHg9IjI5MiIgeT0iOTIiIHdpZHRoPSIxODAiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8dGV4dCB4PSIzODIiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtc2l6ZToxMnB4Ij5hZ2dyZWdhdGUgY2VsbDwvdGV4dD4KPHRleHQgeD0iMzgyIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPkJpZ3RhYmxlIHN1bXMgaXQsIG9uZSBSUEM8L3RleHQ+CjxyZWN0IHg9IjIwIiB5PSIxNTQiIHdpZHRoPSIxOTYiIGhlaWdodD0iNDgiIHJ4PSIxMCIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMTgiIHk9IjE3MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5ldmVyeXRoaW5nIGVsc2U8L3RleHQ+Cjx0ZXh0IHg9IjExOCIgeT0iMTg5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+Y29uZGl0aW9ucywgcmV0dXJuIGltYWdlcyw8L3RleHQ+Cjx0ZXh0IHg9IjExOCIgeT0iMjAxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+bmVzdGVkIG9yIGFyaXRobWV0aWMgdXBkYXRlczwvdGV4dD4KPGxpbmUgeDE9IjIxNiIgeTE9IjE3OCIgeDI9IjI4NiIgeTI9IjE3OCIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYnR3MikiLz4KPHJlY3QgeD0iMjkyIiB5PSIxNTAiIHdpZHRoPSIxODAiIGhlaWdodD0iNTYiIHJ4PSIxMCIgZmlsbD0iI2ZmZmJlYiIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIzODIiIHk9IjE3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4O2ZpbGw6I2I0NTMwOSI+cmVhZCwgdGhlbjwvdGV4dD4KPHRleHQgeD0iMzgyIiB5PSIxODYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTJweDtmaWxsOiNiNDUzMDkiPkNoZWNrQW5kTXV0YXRlUm93PC90ZXh0Pgo8dGV4dCB4PSIzODIiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmd1YXJkZWQgYnkgYSB2ZXJzaW9uIGNlbGw8L3RleHQ+CjxyZWN0IHg9IjUwMCIgeT0iNjYiIHdpZHRoPSIzMTYiIGhlaWdodD0iOTgiIHJ4PSIxMiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI2NTgiIHk9IjkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNTk2NjkiPmF0b21pYyBmb3IgT05FIHJvdzwvdGV4dD4KPHRleHQgeD0iNjU4IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5hbmQgbGluZWFyaXphYmxlLCBiZWNhdXNlIHRoZSBhcHAgcHJvZmlsZTwvdGV4dD4KPHRleHQgeD0iNjU4IiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5yb3V0ZXMgdG8gYSBzaW5nbGUgY2x1c3Rlci4gdmVyaWZpZWQgdGhyb3VnaDwvdGV4dD4KPHRleHQgeD0iNjU4IiB5PSIxNDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj50aGUgQWRtaW4gQVBJIGJlZm9yZSBzZXJ2aW5nIHRyYWZmaWM8L3RleHQ+Cjwvc3ZnPg==" alt="Three write paths: an unconditional write is one MutateRow, an integral counter add uses the aggregate cell in one RPC, and everything else reads the row and commits through CheckAndMutateRow against a version cell." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjMwIiB2aWV3Qm94PSIwIDAgODM2IDIzMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaHJlZSB3cml0ZSBwYXRoczogYW4gdW5jb25kaXRpb25hbCB3cml0ZSBpcyBvbmUgTXV0YXRlUm93LCBhbiBpbnRlZ3JhbCBjb3VudGVyIGFkZCB1c2VzIHRoZSBhZ2dyZWdhdGUgY2VsbCBpbiBvbmUgUlBDLCBhbmQgZXZlcnl0aGluZyBlbHNlIHJlYWRzIHRoZSByb3cgYW5kIGNvbW1pdHMgdGhyb3VnaCBDaGVja0FuZE11dGF0ZVJvdyBhZ2FpbnN0IGEgdmVyc2lvbiBjZWxsLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJidHciIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzIwZjdiNCIvPjwvbWFya2VyPgo8bWFya2VyIGlkPSJidHcyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiNiNDUzMDkiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjIwIiB5PSIzMCIgd2lkdGg9IjE5NiIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjExOCIgeT0iNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+dW5jb25kaXRpb25hbCB3cml0ZTwvdGV4dD4KPHRleHQgeD0iMTE4IiB5PSI2NSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPlB1dCwgRGVsZXRlLCB0b3AtbGV2ZWwgU0VUL1JFTU9WRTwvdGV4dD4KPGxpbmUgeDE9IjIxNiIgeTE9IjUyIiB4Mj0iMjg2IiB5Mj0iNTIiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2J0dykiLz4KPHJlY3QgeD0iMjkyIiB5PSIzMCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjM4MiIgeT0iNTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTJweCI+TXV0YXRlUm93PC90ZXh0Pgo8dGV4dCB4PSIzODIiIHk9IjY2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5vbmUgUlBDLCBubyByZWFkPC90ZXh0Pgo8cmVjdCB4PSIyMCIgeT0iOTIiIHdpZHRoPSIxOTYiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMTgiIHk9IjExMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMnB4Ij5pbnRlZ3JhbCBjb3VudGVyIEFERDwvdGV4dD4KPHRleHQgeD0iMTE4IiB5PSIxMjciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5vciBzZWxmLWFyaXRobWV0aWMgU0VUPC90ZXh0Pgo8bGluZSB4MT0iMjE2IiB5MT0iMTE0IiB4Mj0iMjg2IiB5Mj0iMTE0IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNidHcpIi8+CjxyZWN0IHg9IjI5MiIgeT0iOTIiIHdpZHRoPSIxODAiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8dGV4dCB4PSIzODIiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtc2l6ZToxMnB4Ij5hZ2dyZWdhdGUgY2VsbDwvdGV4dD4KPHRleHQgeD0iMzgyIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPkJpZ3RhYmxlIHN1bXMgaXQsIG9uZSBSUEM8L3RleHQ+CjxyZWN0IHg9IjIwIiB5PSIxNTQiIHdpZHRoPSIxOTYiIGhlaWdodD0iNDgiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMTgiIHk9IjE3MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMnB4Ij5ldmVyeXRoaW5nIGVsc2U8L3RleHQ+Cjx0ZXh0IHg9IjExOCIgeT0iMTg5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+Y29uZGl0aW9ucywgcmV0dXJuIGltYWdlcyw8L3RleHQ+Cjx0ZXh0IHg9IjExOCIgeT0iMjAxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+bmVzdGVkIG9yIGFyaXRobWV0aWMgdXBkYXRlczwvdGV4dD4KPGxpbmUgeDE9IjIxNiIgeTE9IjE3OCIgeDI9IjI4NiIgeTI9IjE3OCIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYnR3MikiLz4KPHJlY3QgeD0iMjkyIiB5PSIxNTAiIHdpZHRoPSIxODAiIGhlaWdodD0iNTYiIHJ4PSIxMCIgZmlsbD0iIzMxMmQxYSIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIzODIiIHk9IjE3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMnB4O2ZpbGw6ICNkZWIyOTAiPnJlYWQsIHRoZW48L3RleHQ+Cjx0ZXh0IHg9IjM4MiIgeT0iMTg2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEycHg7ZmlsbDogI2RlYjI5MCI+Q2hlY2tBbmRNdXRhdGVSb3c8L3RleHQ+Cjx0ZXh0IHg9IjM4MiIgeT0iMjAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+Z3VhcmRlZCBieSBhIHZlcnNpb24gY2VsbDwvdGV4dD4KPHJlY3QgeD0iNTAwIiB5PSI2NiIgd2lkdGg9IjMxNiIgaGVpZ2h0PSI5OCIgcng9IjEyIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjY1OCIgeT0iOTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjNiI+YXRvbWljIGZvciBPTkUgcm93PC90ZXh0Pgo8dGV4dCB4PSI2NTgiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmFuZCBsaW5lYXJpemFibGUsIGJlY2F1c2UgdGhlIGFwcCBwcm9maWxlPC90ZXh0Pgo8dGV4dCB4PSI2NTgiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnJvdXRlcyB0byBhIHNpbmdsZSBjbHVzdGVyLiB2ZXJpZmllZCB0aHJvdWdoPC90ZXh0Pgo8dGV4dCB4PSI2NTgiIHk9IjE0NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnRoZSBBZG1pbiBBUEkgYmVmb3JlIHNlcnZpbmcgdHJhZmZpYzwvdGV4dD4KPC9zdmc+" alt="Three write paths: an unconditional write is one MutateRow, an integral counter add uses the aggregate cell in one RPC, and everything else reads the row and commits through CheckAndMutateRow against a version cell." />
</div>

<p className="t9-caption">Simple mutations and supported counters can avoid a read; other writes read the item and use a version guard.</p>

#### Reads and filters

A `Query` is a range read. Because the sort key is encoded in DynamoDB order in the row key, the key condition, the direction and the page boundary are all served by the row range itself, and results come back in DynamoDB's order without the adapter re-sorting them.

For a `FilterExpression`, **filters are evaluated in the adapter, not in storage**. Bigtable's own row filters work on families, qualifiers and versions rather than on DynamoDB's typed attribute predicates, so the adapter reads the range and applies your filter to the items it read. As a result, a filtered read can *read more rows than it returns*, and a highly selective filter over a wide range costs what the range costs, not what the result costs. Prefer a selective key condition over a broad range plus a filter.

`Scan` pages through the table the same way. Paging bounds the response, but a broad scan still reads the rows it passes over and competes with point operations for the instance's provisioned capacity.

Reads are strongly consistent through the single-cluster app profile. `ConsistentRead=false` does not select a cheaper or staler path. A request that would be eventually consistent on DynamoDB is simply served strongly here.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjEwIiB2aWV3Qm94PSIwIDAgODM2IDIxMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIFF1ZXJ5J3Mga2V5IGNvbmRpdGlvbiBiZWNvbWVzIGEgQmlndGFibGUgcm93IHJhbmdlLCBzbyBzdG9yYWdlIHJldHVybnMgZXZlcnkgcm93IGluIHRoYXQgcmFuZ2UuIFRoZSBhZGFwdGVyIHRoZW4gYXBwbGllcyB0aGUgRmlsdGVyRXhwcmVzc2lvbiB0byB0aG9zZSByb3dzLCBzbyBhIGZpbHRlcmVkIHJlYWQgY2FuIGV4YW1pbmUgZmFyIG1vcmUgcm93cyB0aGFuIGl0IHJldHVybnM6IHRoZSByYW5nZSBjb3N0IGlzIHdoYXQgeW91IHBheSwgbm90IHRoZSByZXN1bHQgY29zdC4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImJyZiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDU5NjY5Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImJycyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHRleHQgeD0iMjQiIHk9IjI2IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+SU4gQklHVEFCTEU8L3RleHQ+CjxyZWN0IHg9IjI0IiB5PSIzNiIgd2lkdGg9IjIyOCIgaGVpZ2h0PSIxNDgiIHJ4PSIxMiIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSIxMzgiIHk9IjU4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+a2V5IGNvbmRpdGlvbiAmIzg1OTQ7IHJvdyByYW5nZTwvdGV4dD4KPHJlY3QgeD0iNDIiIHk9IjcwIiB3aWR0aD0iMTkyIiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjNmVlN2I3Ii8+Cjx0ZXh0IHg9IjEzOCIgeT0iODQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTciPmN1c3QjNyB8IDIwMjYtMDktMDE8L3RleHQ+CjxyZWN0IHg9IjQyIiB5PSI5NCIgd2lkdGg9IjE5MiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzZlZTdiNyIvPgo8dGV4dCB4PSIxMzgiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+Y3VzdCM3IHwgMjAyNi0wOS0wMjwvdGV4dD4KPHJlY3QgeD0iNDIiIHk9IjExOCIgd2lkdGg9IjE5MiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzZlZTdiNyIvPgo8dGV4dCB4PSIxMzgiIHk9IjEzMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+Y3VzdCM3IHwgMjAyNi0wOS0wMzwvdGV4dD4KPHJlY3QgeD0iNDIiIHk9IjE0MiIgd2lkdGg9IjE5MiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzZlZTdiNyIvPgo8dGV4dCB4PSIxMzgiIHk9IjE1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+Y3VzdCM3IHwgMjAyNi0wOS0wNDwvdGV4dD4KPHRleHQgeD0iMTM4IiB5PSIxNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5SZWFkUm93cyByZXR1cm5zIGFsbCBmb3VyPC90ZXh0Pgo8bGluZSB4MT0iMjUyIiB5MT0iMTEwIiB4Mj0iMzA4IiB5Mj0iMTEwIiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNicnMpIi8+Cjx0ZXh0IHg9IjI4MCIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+NCByb3dzPC90ZXh0Pgo8cmVjdCB4PSIzMTIiIHk9IjU2IiB3aWR0aD0iMjEyIiBoZWlnaHQ9IjEwOCIgcng9IjEyIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMzNGQzOTkiIHN0cm9rZS13aWR0aD0iMS42IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDE4IiB5PSI0NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPklOIFRIRSBBREFQVEVSPC90ZXh0Pgo8dGV4dCB4PSI0MTgiIHk9Ijg2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEyLjVweCI+RmlsdGVyRXhwcmVzc2lvbjwvdGV4dD4KPHRleHQgeD0iNDE4IiB5PSIxMDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj50b3RhbCAmZ3Q7IDEwMDwvdGV4dD4KPHRleHQgeD0iNDE4IiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPmFwcGxpZWQgaGVyZSwgbm90IGluIHN0b3JhZ2U8L3RleHQ+Cjx0ZXh0IHg9IjQxOCIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+U2Nhbm5lZENvdW50IDQ8L3RleHQ+CjxsaW5lIHgxPSI1MjQiIHkxPSIxMTAiIHgyPSI1ODAiIHkyPSIxMTAiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2JyZikiLz4KPHRleHQgeD0iNTUyIiB5PSIxMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiIj4xIHJvdzwvdGV4dD4KPHJlY3QgeD0iNTg0IiB5PSI3MCIgd2lkdGg9IjIyOCIgaGVpZ2h0PSI4MCIgcng9IjEyIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjY5OCIgeT0iOTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTIuNXB4Ij55b3VyIHJlc3VsdDwvdGV4dD4KPHJlY3QgeD0iNjAyIiB5PSIxMDYiIHdpZHRoPSIxOTIiIGhlaWdodD0iMjAiIHJ4PSI1IiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiM2ZWU3YjciLz4KPHRleHQgeD0iNjk4IiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTciPmN1c3QjNyB8IDIwMjYtMDktMDM8L3RleHQ+Cjx0ZXh0IHg9IjY5OCIgeT0iMTQyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+Q291bnQgMTwvdGV4dD4KPC9zdmc+" alt="A Query's key condition becomes a Bigtable row range, so storage returns every row in that range. The adapter then applies the FilterExpression to those rows, so a filtered read can examine far more rows than it returns: the range cost is what you pay, not the result cost." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjEwIiB2aWV3Qm94PSIwIDAgODM2IDIxMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIFF1ZXJ5J3Mga2V5IGNvbmRpdGlvbiBiZWNvbWVzIGEgQmlndGFibGUgcm93IHJhbmdlLCBzbyBzdG9yYWdlIHJldHVybnMgZXZlcnkgcm93IGluIHRoYXQgcmFuZ2UuIFRoZSBhZGFwdGVyIHRoZW4gYXBwbGllcyB0aGUgRmlsdGVyRXhwcmVzc2lvbiB0byB0aG9zZSByb3dzLCBzbyBhIGZpbHRlcmVkIHJlYWQgY2FuIGV4YW1pbmUgZmFyIG1vcmUgcm93cyB0aGFuIGl0IHJldHVybnM6IHRoZSByYW5nZSBjb3N0IGlzIHdoYXQgeW91IHBheSwgbm90IHRoZSByZXN1bHQgY29zdC4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImJyZiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMjBmN2I0Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImJycyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHRleHQgeD0iMjQiIHk9IjI2IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+SU4gQklHVEFCTEU8L3RleHQ+CjxyZWN0IHg9IjI0IiB5PSIzNiIgd2lkdGg9IjIyOCIgaGVpZ2h0PSIxNDgiIHJ4PSIxMiIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSIxMzgiIHk9IjU4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+a2V5IGNvbmRpdGlvbiAmIzg1OTQ7IHJvdyByYW5nZTwvdGV4dD4KPHJlY3QgeD0iNDIiIHk9IjcwIiB3aWR0aD0iMTkyIiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjM2Q2NjU1Ii8+Cjx0ZXh0IHg9IjEzOCIgeT0iODQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij5jdXN0IzcgfCAyMDI2LTA5LTAxPC90ZXh0Pgo8cmVjdCB4PSI0MiIgeT0iOTQiIHdpZHRoPSIxOTIiIGhlaWdodD0iMjAiIHJ4PSI1IiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMzZDY2NTUiLz4KPHRleHQgeD0iMTM4IiB5PSIxMDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij5jdXN0IzcgfCAyMDI2LTA5LTAyPC90ZXh0Pgo8cmVjdCB4PSI0MiIgeT0iMTE4IiB3aWR0aD0iMTkyIiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjM2Q2NjU1Ii8+Cjx0ZXh0IHg9IjEzOCIgeT0iMTMyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+Y3VzdCM3IHwgMjAyNi0wOS0wMzwvdGV4dD4KPHJlY3QgeD0iNDIiIHk9IjE0MiIgd2lkdGg9IjE5MiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzNkNjY1NSIvPgo8dGV4dCB4PSIxMzgiIHk9IjE1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICM5MGRlYzgiPmN1c3QjNyB8IDIwMjYtMDktMDQ8L3RleHQ+Cjx0ZXh0IHg9IjEzOCIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+UmVhZFJvd3MgcmV0dXJucyBhbGwgZm91cjwvdGV4dD4KPGxpbmUgeDE9IjI1MiIgeTE9IjExMCIgeDI9IjMwOCIgeTI9IjExMCIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYnJzKSIvPgo8dGV4dCB4PSIyODAiIHk9IjEwMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPjQgcm93czwvdGV4dD4KPHJlY3QgeD0iMzEyIiB5PSI1NiIgd2lkdGg9IjIxMiIgaGVpZ2h0PSIxMDgiIHJ4PSIxMiIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMzRkMzk5IiBzdHJva2Utd2lkdGg9IjEuNiIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjQxOCIgeT0iNDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMzOWRlNzciIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5JTiBUSEUgQURBUFRFUjwvdGV4dD4KPHRleHQgeD0iNDE4IiB5PSI4NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtc2l6ZToxMi41cHgiPkZpbHRlckV4cHJlc3Npb248L3RleHQ+Cjx0ZXh0IHg9IjQxOCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+dG90YWwgJmd0OyAxMDA8L3RleHQ+Cjx0ZXh0IHg9IjQxOCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5hcHBsaWVkIGhlcmUsIG5vdCBpbiBzdG9yYWdlPC90ZXh0Pgo8dGV4dCB4PSI0MTgiIHk9IjE1MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPlNjYW5uZWRDb3VudCA0PC90ZXh0Pgo8bGluZSB4MT0iNTI0IiB5MT0iMTEwIiB4Mj0iNTgwIiB5Mj0iMTEwIiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNicmYpIi8+Cjx0ZXh0IHg9IjU1MiIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+MSByb3c8L3RleHQ+CjxyZWN0IHg9IjU4NCIgeT0iNzAiIHdpZHRoPSIyMjgiIGhlaWdodD0iODAiIHJ4PSIxMiIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI2OTgiIHk9Ijk2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+eW91ciByZXN1bHQ8L3RleHQ+CjxyZWN0IHg9IjYwMiIgeT0iMTA2IiB3aWR0aD0iMTkyIiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjM2Q2NjU1Ii8+Cjx0ZXh0IHg9IjY5OCIgeT0iMTIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+Y3VzdCM3IHwgMjAyNi0wOS0wMzwvdGV4dD4KPHRleHQgeD0iNjk4IiB5PSIxNDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5Db3VudCAxPC90ZXh0Pgo8L3N2Zz4=" alt="A Query's key condition becomes a Bigtable row range, so storage returns every row in that range. The adapter then applies the FilterExpression to those rows, so a filtered read can examine far more rows than it returns: the range cost is what you pay, not the result cost." />
</div>

<p className="t9-caption">A filtered read examines every row in the selected key range. The adapter returns only rows that match the filter.</p>

#### Limitations

The following features require operations across multiple rows or per-item deletion rules that this Bigtable layout cannot provide. The adapter rejects these requests.

* **Multi-item transactions.** `TransactWriteItems`, `TransactGetItems` and transactional PartiQL are rejected: Bigtable cannot atomically commit or snapshot several item rows. An application that needs cross-item atomicity wants Spanner or a Postgres target.
* **Secondary indexes.** A GSI or LSI query is not served. There is no maintained index to seek, so the adapter rejects these requests without scanning the table. Native Bigtable materialized views are not exposed as DynamoDB indexes either.
* **DynamoDB Streams.** Not served. Bigtable change streams are not a DynamoDB-compatible atomic change log. A stream record cannot be committed in the same atomic unit as the write it describes.
* **Per-item TTL.** Bigtable does expire data, but only through a column-family garbage-collection policy: a uniform max age or version count for the whole family. DynamoDB's TTL is per item, driven by an epoch attribute the application sets on each row, and a family-wide rule cannot express that. Configuring TTL fails rather than silently applying a different expiry rule.
* **The blind-write size check.** A top-level SET/REMOVE that skips the read also skips the aggregate 400 KiB validation, as described above.
* **Filters are adapter-side.** A filtered read can read more rows than it returns; see the previous section.
* **A hot item still contends.** Row keys spread independent partitions, but repeated updates to one item serialize on that row. A uniform-key benchmark does not predict hot-item behaviour.

### Via Cloud SQL for PostgreSQL

| Operation           | Area               | Support   | Depth        | Notes                                                                                                                                                                 |
| ------------------- | ------------------ | --------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ConditionExpression | Conditional writes | Supported | Common       | evaluated against the live item under a row-level lock; commits atomically                                                                                            |
| DescribeStream      | Indexes + streams  | Supported | Full surface | shard list + stream ARN                                                                                                                                               |
| GetRecords          | Indexes + streams  | Supported | Full surface | DynamoDB Streams served from an in-transaction outbox co-committed with each write                                                                                    |
| GetShardIterator    | Indexes + streams  | Supported | Full surface | -                                                                                                                                                                     |
| ListStreams         | Indexes + streams  | Supported | Full surface | the streamed-table registry                                                                                                                                           |
| Query (GSI / LSI)   | Indexes + streams  | Supported | Most usage   | indexes declared before deployment and maintained in the item transaction; queries use the index                                                                      |
| Query               | Reads              | Supported | Common       | ordering, filters and pagination honored                                                                                                                              |
| Scan                | Reads              | Supported | Common       | streamed page by page                                                                                                                                                 |
| DeleteItem          | Single item        | Supported | Common       | -                                                                                                                                                                     |
| GetItem             | Single item        | Supported | Common       | -                                                                                                                                                                     |
| PutItem             | Single item        | Supported | Common       | items kept in native shape; numbers at exact decimal precision                                                                                                        |
| UpdateItem          | Single item        | Supported | Common       | update expressions evaluated by the adapter                                                                                                                           |
| TransactWriteItems  | Transactions       | Supported | Most usage   | one serializable PostgreSQL transaction across tables; at most 100 actions and one operation per item; ClientRequestToken idempotency; stream-enabled tables excluded |

#### How it works

Tensor9 runs a DynamoDB adapter beside your application in the customer's environment. It configures `AWS_ENDPOINT_URL_DYNAMODB` to send the AWS SDK's requests to the adapter over the local loopback network. Your SDK and application code stay unchanged. The adapter accepts DynamoDB requests and data types, returns DynamoDB responses and errors, and stores data in PostgreSQL.

DynamoDB supports numbers with up to 38 significant digits, typed sets, conditional writes, secondary indexes, and atomic transactions. The adapter implements these using PostgreSQL storage and transactions. PostgreSQL supports multi-table transactions and synchronously updated indexes, but has different concurrency, capacity, and identifier limits. Unsupported requests return errors; the limitations below describe the differences.

For base-table `Query` and `Scan` requests, the adapter compiles supported filters into parameterized SQL `WHERE` predicates over the JSONB item. Number comparisons cast stored decimal text to PostgreSQL `numeric`. An order-preserving key column supplies sort bounds, cursor position, and direction. The query uses a server-side cursor to fetch bounded batches until the requested `Limit` or 1 MiB of item data. Expressions that cannot be represented in SQL are evaluated in the adapter over the rows selected by the SQL predicate. Secondary-index queries use the separate path described below.

For conditional writes, the adapter opens a transaction, locks the row with `SELECT ... FOR UPDATE`, evaluates the `ConditionExpression`, and writes within that transaction. This requires an extra round trip, but prevents a concurrent writer from changing the item between the check and write. A failed condition returns `ConditionalCheckFailed` and can return the item that failed it. Some unconditional writes skip the read: a top-level SET/REMOVE patch or integral counter add uses one statement when it has no condition, requests no returned item image, and affects no secondary index or stream.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogaW4gdGhlIHRhcmdldCBjbG91ZCB0aGUgc2FtZSBhcHBsaWNhdGlvbiBhbmQgU0RLIGNhbGwgYSBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgRHluYW1vREIgQVBJIGZyb20gYSBQb3N0Z3JlU1FMIGRhdGFiYXNlLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYWgxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDYiIHdpZHRoPSIzNTgiIGhlaWdodD0iMTE4IiByeD0iMTQiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMCIgeT0iNjQiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiM5NGEzYjgiPk9OIEFXUyBUT0RBWTwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjgwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iOTAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMi41cHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI5MCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+RHluYW1vREIgU0RLPC90ZXh0Pgo8bGluZSB4MT0iMTUwIiB5MT0iMTEzIiB4Mj0iMjEwIiB5Mj0iMTEzIiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhaDEpIi8+Cjx0ZXh0IHg9IjE4MSIgeT0iMTA0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+CjxyZWN0IHg9IjIxNCIgeT0iODAiIHdpZHRoPSIxNDgiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyODgiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPkFtYXpvbiBEeW5hbW9EQjwvdGV4dD4KPHRleHQgeD0iMjg4IiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5BV1MtbWFuYWdlZDwvdGV4dD4KPGxpbmUgeDE9IjQxOCIgeTE9IjQwIiB4Mj0iNDE4IiB5Mj0iMTYwIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS40Ii8+CjxyZWN0IHg9IjQ2MiIgeT0iNDYiIHdpZHRoPSIzNjIiIGhlaWdodD0iMTE4IiByeD0iMTQiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSI0NzYiIHk9IjY0IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojMDQ3ODU3Ij5PTiBUSEUgVEFSR0VUIENMT1VEPC90ZXh0Pgo8cmVjdCB4PSI0NzQiIHk9IjgwIiB3aWR0aD0iOTIiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5Zb3VyIGFwcDwvdGV4dD4KPHRleHQgeD0iNTIwIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA1OTY2OSI+c2FtZSBTREs8L3RleHQ+CjxsaW5lIHgxPSI1NjYiIHkxPSIxMTMiIHgyPSI1OTAiIHkyPSIxMTMiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2FoMSkiLz4KPHJlY3QgeD0iNTk0IiB5PSI3NiIgd2lkdGg9IjExMCIgaGVpZ2h0PSI3NCIgcng9IjExIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjY0OSIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEycHgiPlRlbnNvcjk8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5zZXJ2aWNlPC90ZXh0Pgo8dGV4dCB4PSI2NDkiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+YWRhcHRlcjwvdGV4dD4KPGxpbmUgeDE9IjcwNCIgeTE9IjExMyIgeDI9IjcyOCIgeTI9IjExMyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYWgxKSIvPgo8cmVjdCB4PSI3MzIiIHk9IjgwIiB3aWR0aD0iODQiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI3NzQiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMXB4Ij5Qb3N0Z3JlU1FMPC90ZXh0Pgo8dGV4dCB4PSI3NzQiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnJlbGF0aW9uYWw8L3RleHQ+Cjwvc3ZnPg==" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: in the target cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from a PostgreSQL database." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogaW4gdGhlIHRhcmdldCBjbG91ZCB0aGUgc2FtZSBhcHBsaWNhdGlvbiBhbmQgU0RLIGNhbGwgYSBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgRHluYW1vREIgQVBJIGZyb20gYSBQb3N0Z3JlU1FMIGRhdGFiYXNlLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYWgxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDYiIHdpZHRoPSIzNTgiIGhlaWdodD0iMTE4IiByeD0iMTQiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMCIgeT0iNjQiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTRhM2I4Ij5PTiBBV1MgVE9EQVk8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI4MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjkwIiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTIuNXB4Ij5Zb3VyIGFwcDwvdGV4dD4KPHRleHQgeD0iOTAiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkR5bmFtb0RCIFNESzwvdGV4dD4KPGxpbmUgeDE9IjE1MCIgeTE9IjExMyIgeDI9IjIxMCIgeTI9IjExMyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYWgxKSIvPgo8dGV4dCB4PSIxODEiIHk9IjEwNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo4LjVweCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8cmVjdCB4PSIyMTQiIHk9IjgwIiB3aWR0aD0iMTQ4IiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjg4IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5BbWF6b24gRHluYW1vREI8L3RleHQ+Cjx0ZXh0IHg9IjI4OCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+QVdTLW1hbmFnZWQ8L3RleHQ+CjxsaW5lIHgxPSI0MTgiIHkxPSI0MCIgeDI9IjQxOCIgeTI9IjE2MCIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8cmVjdCB4PSI0NjIiIHk9IjQ2IiB3aWR0aD0iMzYyIiBoZWlnaHQ9IjExOCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDc2IiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPk9OIFRIRSBUQVJHRVQgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjQ3NCIgeT0iODAiIHdpZHRoPSI5MiIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyMCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEycHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI1MjAiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM2Ij5zYW1lIFNESzwvdGV4dD4KPGxpbmUgeDE9IjU2NiIgeTE9IjExMyIgeDI9IjU5MCIgeTI9IjExMyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYWgxKSIvPgo8cmVjdCB4PSI1OTQiIHk9Ijc2IiB3aWR0aD0iMTEwIiBoZWlnaHQ9Ijc0IiByeD0iMTEiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iNjQ5IiB5PSIxMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTJweCI+VGVuc29yOTwvdGV4dD4KPHRleHQgeD0iNjQ5IiB5PSIxMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnNlcnZpY2U8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5hZGFwdGVyPC90ZXh0Pgo8bGluZSB4MT0iNzA0IiB5MT0iMTEzIiB4Mj0iNzI4IiB5Mj0iMTEzIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhaDEpIi8+CjxyZWN0IHg9IjczMiIgeT0iODAiIHdpZHRoPSI4NCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijc3NCIgeT0iMTA4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExcHgiPlBvc3RncmVTUUw8L3RleHQ+Cjx0ZXh0IHg9Ijc3NCIgeT0iMTI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cmVsYXRpb25hbDwvdGV4dD4KPC9zdmc+" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: in the target cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from a PostgreSQL database." />
</div>

<p className="t9-caption">Your application uses the DynamoDB API through an adapter in the customer environment.</p>

#### Architecture

The adapter is a stateless Rust service. It parses DynamoDB expressions, translates requests into PostgreSQL operations, and returns DynamoDB responses. It connects to PostgreSQL through a connection pool using the customer's credentials. Durable state stays in PostgreSQL, so adapter instances can restart or scale out without coordinating local state. Stream-enabled tables have the separate single-writer restriction below.

Each DynamoDB table has a PostgreSQL table named `ddb_<name>` in one database. The `ddb_tables` registry records its generated physical name, key schema, billing mode, time-to-live (TTL) settings, global secondary indexes (GSIs), and stream settings. A write or query for a table absent from the registry returns `ResourceNotFoundException`; writes do not create tables implicitly. At runtime, `CreateTable` creates a PostgreSQL expression index for each declared GSI. Each stream-enabled table also has a `_strm` table that stores change records.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBcmNoaXRlY3R1cmU6IHRoZSBhcHAncyBEeW5hbW9EQiBTREsgY2FsbHMgYSBzdGF0ZWxlc3MgUnVzdCBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgQVBJIGZyb20gUG9zdGdyZVNRTC4gUG9zdGdyZXMgaG9sZHMgYWxsIHN0YXRlOiBlYWNoIER5bmFtb0RCIHRhYmxlIGlzIGl0cyBvd24gcGh5c2ljYWwgcmVsYXRpb24gZGRiX25hbWUgaW4gb25lIGRhdGFiYXNlLCBhbiBhdXRob3JpdGF0aXZlIGRkYl90YWJsZXMgcmVnaXN0cnkgcmVsYXRpb24sIGEgbmF0aXZlIHBlci10YWJsZSBleHByZXNzaW9uIGluZGV4IHBlciBkZWNsYXJlZCBHU0ksIGFuZCBhIGNvLWxvY2F0ZWQgX3N0cm0gb3V0Ym94IHJlbGF0aW9uIHBlciBzdHJlYW1lZCB0YWJsZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImFyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSI4IiB5PSIzNCIgd2lkdGg9IjgyMCIgaGVpZ2h0PSIyMDgiIHJ4PSIxNiIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjI2IiB5PSI1NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkNVU1RPTUVSJ1MgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxMTAiIHdpZHRoPSIxMTQiIGhlaWdodD0iOTIiIHJ4PSIxMiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI4MyIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEzcHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTY4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+RHluYW1vREIgU0RLPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNTk2NjkiPnVuY2hhbmdlZDwvdGV4dD4KPGxpbmUgeDE9IjE0MCIgeTE9IjE1NiIgeDI9IjE5MiIgeTI9IjE1NiIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYXIpIi8+Cjx0ZXh0IHg9IjE2NiIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+CjxyZWN0IHg9IjE5NiIgeT0iMTIyIiB3aWR0aD0iMTY4IiBoZWlnaHQ9IjY4IiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iMjgwIiB5PSIxNTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTNweCI+YWRhcHRlcjwvdGV4dD4KPHRleHQgeD0iMjgwIiB5PSIxNjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPnN0YXRlbGVzcyDCtyBSdXN0PC90ZXh0Pgo8bGluZSB4MT0iMzY0IiB5MT0iMTU2IiB4Mj0iNDM2IiB5Mj0iMTU2IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhcikiLz4KPHRleHQgeD0iNDAwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiIj5TUUw8L3RleHQ+Cjx0ZXh0IHg9IjQwMCIgeT0iMTcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+cG9vbGVkPC90ZXh0Pgo8cmVjdCB4PSI0NDAiIHk9Ijg2IiB3aWR0aD0iMzcyIiBoZWlnaHQ9IjE0OCIgcng9IjEzIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjYyNiIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+UG9zdGdyZVNRTCDCtyBvbmUgZGF0YWJhc2U8L3RleHQ+CjxyZWN0IHg9IjQ1NCIgeT0iMTE2IiB3aWR0aD0iMjMwIiBoZWlnaHQ9IjEwOCIgcng9IjEwIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTMyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDA7ZmlsbDojNDc1NTY5Ij5wZXItdGFibGUgcmVsYXRpb25zPC90ZXh0Pgo8dGV4dCB4PSI1NjkiIHk9IjE0NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6IzY0NzQ4YiI+b25lIGRkYl8mbHQ7bmFtZSZndDsgcGVyIHRhYmxlPC90ZXh0Pgo8cmVjdCB4PSI0NjYiIHk9IjE1MiIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSI1NjkiIHk9IjE2NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6IzQ3NTU2OSI+ZGRiX29yZGVycyAgIChwaywgc2ssIGl0ZW0pPC90ZXh0Pgo8cmVjdCB4PSI0NjYiIHk9IjE3NiIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSI1NjkiIHk9IjE5MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6IzQ3NTU2OSI+ZGRiX3Nlc3Npb25zIChwaywgc2ssIGl0ZW0pPC90ZXh0Pgo8cmVjdCB4PSI0NjYiIHk9IjIwMCIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSI1NjkiIHk9IjIxNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6IzQ3NTU2OSI+ZGRiX3RhYmxlcyAgIOKGkiByZWdpc3RyeTwvdGV4dD4KPHJlY3QgeD0iNjk2IiB5PSIxMTYiIHdpZHRoPSIxMDIiIGhlaWdodD0iMTA4IiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNzQ3IiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMDtmaWxsOiM0NzU1NjkiPmV4cHJlc3Npb248L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDA7ZmlsbDojNDc1NTY5Ij5pbmRleCAvIEdTSTwvdGV4dD4KPHRleHQgeD0iNzQ3IiB5PSIxNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj4rIF9zdHJtIG91dGJveDwvdGV4dD4KPHRleHQgeD0iNzQ3IiB5PSIxOTEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5wZXIgc3RyZWFtZWQgdGFibGU8L3RleHQ+Cjwvc3ZnPg==" alt="Architecture: the app's DynamoDB SDK calls a stateless Rust Tensor9 adapter, which serves the API from PostgreSQL. Postgres holds all state: each DynamoDB table is its own physical relation ddb_name in one database, an authoritative ddb_tables registry relation, a native per-table expression index per declared GSI, and a co-located _strm outbox relation per streamed table." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBcmNoaXRlY3R1cmU6IHRoZSBhcHAncyBEeW5hbW9EQiBTREsgY2FsbHMgYSBzdGF0ZWxlc3MgUnVzdCBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgQVBJIGZyb20gUG9zdGdyZVNRTC4gUG9zdGdyZXMgaG9sZHMgYWxsIHN0YXRlOiBlYWNoIER5bmFtb0RCIHRhYmxlIGlzIGl0cyBvd24gcGh5c2ljYWwgcmVsYXRpb24gZGRiX25hbWUgaW4gb25lIGRhdGFiYXNlLCBhbiBhdXRob3JpdGF0aXZlIGRkYl90YWJsZXMgcmVnaXN0cnkgcmVsYXRpb24sIGEgbmF0aXZlIHBlci10YWJsZSBleHByZXNzaW9uIGluZGV4IHBlciBkZWNsYXJlZCBHU0ksIGFuZCBhIGNvLWxvY2F0ZWQgX3N0cm0gb3V0Ym94IHJlbGF0aW9uIHBlciBzdHJlYW1lZCB0YWJsZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImFyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSI4IiB5PSIzNCIgd2lkdGg9IjgyMCIgaGVpZ2h0PSIyMDgiIHJ4PSIxNiIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjI2IiB5PSI1NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkNVU1RPTUVSJ1MgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxMTAiIHdpZHRoPSIxMTQiIGhlaWdodD0iOTIiIHJ4PSIxMiIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI4MyIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEzcHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTY4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+RHluYW1vREIgU0RLPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzYiPnVuY2hhbmdlZDwvdGV4dD4KPGxpbmUgeDE9IjE0MCIgeTE9IjE1NiIgeDI9IjE5MiIgeTI9IjE1NiIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYXIpIi8+Cjx0ZXh0IHg9IjE2NiIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjguNXB4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+CjxyZWN0IHg9IjE5NiIgeT0iMTIyIiB3aWR0aD0iMTY4IiBoZWlnaHQ9IjY4IiByeD0iMTIiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iMjgwIiB5PSIxNTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTNweCI+YWRhcHRlcjwvdGV4dD4KPHRleHQgeD0iMjgwIiB5PSIxNjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnN0YXRlbGVzcyDCtyBSdXN0PC90ZXh0Pgo8bGluZSB4MT0iMzY0IiB5MT0iMTU2IiB4Mj0iNDM2IiB5Mj0iMTU2IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhcikiLz4KPHRleHQgeD0iNDAwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5TUUw8L3RleHQ+Cjx0ZXh0IHg9IjQwMCIgeT0iMTcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+cG9vbGVkPC90ZXh0Pgo8cmVjdCB4PSI0NDAiIHk9Ijg2IiB3aWR0aD0iMzcyIiBoZWlnaHQ9IjE0OCIgcng9IjEzIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjYyNiIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+UG9zdGdyZVNRTCDCtyBvbmUgZGF0YWJhc2U8L3RleHQ+CjxyZWN0IHg9IjQ1NCIgeT0iMTE2IiB3aWR0aD0iMjMwIiBoZWlnaHQ9IjEwOCIgcng9IjEwIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTMyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXdlaWdodDo3MDA7ZmlsbDogI2M5Y2ZkOCI+cGVyLXRhYmxlIHJlbGF0aW9uczwvdGV4dD4KPHRleHQgeD0iNTY5IiB5PSIxNDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjEwcHggJ1NGIE1vbm8nLE1lbmxvLG1vbm9zcGFjZTtmaWxsOiAjYzljZmQ4Ij5vbmUgZGRiXyZsdDtuYW1lJmd0OyBwZXIgdGFibGU8L3RleHQ+CjxyZWN0IHg9IjQ2NiIgeT0iMTUyIiB3aWR0aD0iMjA2IiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTY2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDogI2M5Y2ZkOCI+ZGRiX29yZGVycyAgIChwaywgc2ssIGl0ZW0pPC90ZXh0Pgo8cmVjdCB4PSI0NjYiIHk9IjE3NiIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIvPgo8dGV4dCB4PSI1NjkiIHk9IjE5MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6ICNjOWNmZDgiPmRkYl9zZXNzaW9ucyAocGssIHNrLCBpdGVtKTwvdGV4dD4KPHJlY3QgeD0iNDY2IiB5PSIyMDAiIHdpZHRoPSIyMDYiIGhlaWdodD0iMjAiIHJ4PSI1IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iNTY5IiB5PSIyMTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjEwcHggJ1NGIE1vbm8nLE1lbmxvLG1vbm9zcGFjZTtmaWxsOiAjYzljZmQ4Ij5kZGJfdGFibGVzICAg4oaSIHJlZ2lzdHJ5PC90ZXh0Pgo8cmVjdCB4PSI2OTYiIHk9IjExNiIgd2lkdGg9IjEwMiIgaGVpZ2h0PSIxMDgiIHJ4PSIxMCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI3NDciIHk9IjE0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwO2ZpbGw6ICNjOWNmZDgiPmV4cHJlc3Npb248L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXdlaWdodDo3MDA7ZmlsbDogI2M5Y2ZkOCI+aW5kZXggLyBHU0k8L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+KyBfc3RybSBvdXRib3g8L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTkxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cGVyIHN0cmVhbWVkIHRhYmxlPC90ZXh0Pgo8L3N2Zz4=" alt="Architecture: the app's DynamoDB SDK calls a stateless Rust Tensor9 adapter, which serves the API from PostgreSQL. Postgres holds all state: each DynamoDB table is its own physical relation ddb_name in one database, an authoritative ddb_tables registry relation, a native per-table expression index per declared GSI, and a co-located _strm outbox relation per streamed table." />
</div>

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgUG9zdGdyZXMgcGh5c2ljYWwgcGxhbiwgd2hvc2UgcmVhZHMgZXhlY3V0ZSBhcyBvbmUgU1FMIHN0YXRlbWVudCBhbmQgd2hvc2Ugd3JpdGVzIHJ1biBhcyBvbmUgdHJhbnNhY3Rpb24uIFBvc3RncmVzIGhvbGRzIGEgcmVsYXRpb24gcGVyIER5bmFtb0RCIHRhYmxlIHBsdXMgYSBuYXRpdmUgZXhwcmVzc2lvbiBpbmRleCBwZXIgZGVjbGFyZWQgc2Vjb25kYXJ5IGluZGV4LiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYXBnMSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPgo8bWFya2VyIGlkPSJhcGcyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDU5NjY5Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQwIiB3aWR0aD0iMzkyIiBoZWlnaHQ9IjE0MCIgcng9IjE0IiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMzNGQzOTkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzIiIHk9IjMwIiBmaWxsPSIjMTU4MDNkIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+VEhFIEFEQVBURVI8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iODMiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+RHluYW1vREIgQVBJPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj50aGUgcmVxdWVzdDwvdGV4dD4KPGxpbmUgeDE9IjEzNiIgeTE9Ijg3IiB4Mj0iMTU4IiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYXBnMikiLz4KPHJlY3QgeD0iMTY0IiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMjE3IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPkxvZ2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMjE3IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmJhY2tlbmQtbmV1dHJhbDwvdGV4dD4KPGxpbmUgeDE9IjI3MCIgeTE9Ijg3IiB4Mj0iMjkyIiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYXBnMikiLz4KPHJlY3QgeD0iMjk4IiB5PSI2NCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMzQ4IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPlBoeXNpY2FsIHBsYW48L3RleHQ+Cjx0ZXh0IHg9IjM0OCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5Qb3N0Z3Jlcy1zcGVjaWZpYzwvdGV4dD4KPHRleHQgeD0iMjEyIiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5yZWFkczogb25lIFNRTCBzdGF0ZW1lbnQgwrcgd3JpdGVzOiBvbmUgdHJhbnNhY3Rpb248L3RleHQ+CjxsaW5lIHgxPSI0MTIiIHkxPSI4NyIgeDI9IjQ1MiIgeTI9Ijg3IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2FwZzEpIi8+CjxyZWN0IHg9IjQ1OCIgeT0iNDAiIHdpZHRoPSIzNjIiIGhlaWdodD0iMTQwIiByeD0iMTQiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSI0NzQiIHk9IjMwIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+UE9TVEdSRVNRTDwvdGV4dD4KPHJlY3QgeD0iNDc2IiB5PSI2NCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI0NCIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNTUxIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPkEgcmVsYXRpb24gcGVyIHRhYmxlPC90ZXh0Pgo8dGV4dCB4PSI1NTEiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+ZGRiXyZsdDtuYW1lJmd0OzwvdGV4dD4KPHJlY3QgeD0iNjQyIiB5PSI2NCIgd2lkdGg9IjE2MiIgaGVpZ2h0PSI0NCIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNzIzIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPk5hdGl2ZSBHU0kgaW5kZXhlczwvdGV4dD4KPHRleHQgeD0iNzIzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9uZSBleHByZXNzaW9uIGluZGV4IGVhY2g8L3RleHQ+Cjx0ZXh0IHg9IjYzOSIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b25lIGRhdGFiYXNlIGZvciB0aGUgc3RhY2s8L3RleHQ+Cjwvc3ZnPg==" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Postgres physical plan, whose reads execute as one SQL statement and whose writes run as one transaction. Postgres holds a relation per DynamoDB table plus a native expression index per declared secondary index." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgUG9zdGdyZXMgcGh5c2ljYWwgcGxhbiwgd2hvc2UgcmVhZHMgZXhlY3V0ZSBhcyBvbmUgU1FMIHN0YXRlbWVudCBhbmQgd2hvc2Ugd3JpdGVzIHJ1biBhcyBvbmUgdHJhbnNhY3Rpb24uIFBvc3RncmVzIGhvbGRzIGEgcmVsYXRpb24gcGVyIER5bmFtb0RCIHRhYmxlIHBsdXMgYSBuYXRpdmUgZXhwcmVzc2lvbiBpbmRleCBwZXIgZGVjbGFyZWQgc2Vjb25kYXJ5IGluZGV4LiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYXBnMSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPgo8bWFya2VyIGlkPSJhcGcyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMjBmN2I0Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQwIiB3aWR0aD0iMzkyIiBoZWlnaHQ9IjE0MCIgcng9IjE0IiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMzNGQzOTkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzIiIHk9IjMwIiBmaWxsPSIjMzlkZTc3IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+VEhFIEFEQVBURVI8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iODMiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij50aGUgcmVxdWVzdDwvdGV4dD4KPGxpbmUgeDE9IjEzNiIgeTE9Ijg3IiB4Mj0iMTU4IiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYXBnMikiLz4KPHJlY3QgeD0iMTY0IiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMjE3IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPkxvZ2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMjE3IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmJhY2tlbmQtbmV1dHJhbDwvdGV4dD4KPGxpbmUgeDE9IjI3MCIgeTE9Ijg3IiB4Mj0iMjkyIiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYXBnMikiLz4KPHJlY3QgeD0iMjk4IiB5PSI2NCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMzQ4IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPlBoeXNpY2FsIHBsYW48L3RleHQ+Cjx0ZXh0IHg9IjM0OCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5Qb3N0Z3Jlcy1zcGVjaWZpYzwvdGV4dD4KPHRleHQgeD0iMjEyIiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5yZWFkczogb25lIFNRTCBzdGF0ZW1lbnQgwrcgd3JpdGVzOiBvbmUgdHJhbnNhY3Rpb248L3RleHQ+CjxsaW5lIHgxPSI0MTIiIHkxPSI4NyIgeDI9IjQ1MiIgeTI9Ijg3IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2FwZzEpIi8+CjxyZWN0IHg9IjQ1OCIgeT0iNDAiIHdpZHRoPSIzNjIiIGhlaWdodD0iMTQwIiByeD0iMTQiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSI0NzQiIHk9IjMwIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+UE9TVEdSRVNRTDwvdGV4dD4KPHJlY3QgeD0iNDc2IiB5PSI2NCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI0NCIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNTUxIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPkEgcmVsYXRpb24gcGVyIHRhYmxlPC90ZXh0Pgo8dGV4dCB4PSI1NTEiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+ZGRiXyZsdDtuYW1lJmd0OzwvdGV4dD4KPHJlY3QgeD0iNjQyIiB5PSI2NCIgd2lkdGg9IjE2MiIgaGVpZ2h0PSI0NCIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNzIzIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPk5hdGl2ZSBHU0kgaW5kZXhlczwvdGV4dD4KPHRleHQgeD0iNzIzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9uZSBleHByZXNzaW9uIGluZGV4IGVhY2g8L3RleHQ+Cjx0ZXh0IHg9IjYzOSIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+b25lIGRhdGFiYXNlIGZvciB0aGUgc3RhY2s8L3RleHQ+Cjwvc3ZnPg==" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Postgres physical plan, whose reads execute as one SQL statement and whose writes run as one transaction. Postgres holds a relation per DynamoDB table plus a native expression index per declared secondary index." />
</div>

<p className="t9-caption">A stateless Rust adapter serves the DynamoDB API in front of Postgres; all durable state lives in one Postgres database, where each DynamoDB table is its own physical relation.</p>

<p className="t9-caption">The adapter first builds a storage-independent request plan, then converts it to a Postgres-specific plan for execution.</p>

#### Schemas

A DynamoDB item occupies one PostgreSQL row with columns `pk TEXT`, `sk TEXT`, `okey TEXT` and `item JSONB`. The `PRIMARY KEY (pk, sk)` index serves `GetItem`. A separate index over `pk` and bytewise-collated `okey` serves ordered base-table `Query` requests.

The `item JSONB` column preserves DynamoDB's typed attribute representation, including `{"N":"123.45"}`, `{"B":"<b64>"}`, and typed sets. Numbers remain decimal strings, so a 38-digit amount or a Snowflake ID is not rounded through a floating-point conversion. Type tags preserve the distinction between numbers and numeric strings. Conditional writes use row locks, not a separate version column. Enabling TTL builds an expression index over the configured epoch attribute inside the JSONB item. A bounded, leader-elected reaper deletes eligible rows through that index. Expired items remain readable until physical deletion; reads do not filter on TTL.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIER5bmFtb0RCIGl0ZW0gYmVjb21lcyBvbmUgcm93OiBwayBURVhULCBzayBURVhULCBva2V5IFRFWFQgYW5kIGl0ZW0gSlNPTkIsIHdpdGggUFJJTUFSWSBLRVkgKHBrLCBzaykuIFRoZSBva2V5IGNvbHVtbiBwcmVzZXJ2ZXMgc29ydCBvcmRlci4gVGhlIHdob2xlIGl0ZW0gbGl2ZXMgaW4gSlNPTkIgaW4gaXRzIER5bmFtb0RCIHdpcmUgZm9ybSwgc28gYSBudW1iZXIga2VlcHMgaXRzIGV4YWN0IGRlY2ltYWwgdGV4dCBpbnN0ZWFkIG9mIGJlY29taW5nIGEgZmxvYXQuIFRUTCB1c2VzIGFuIGV4cHJlc3Npb24gaW5kZXggb3ZlciB0aGUgaXRlbSwgbm90IGEgc2VwYXJhdGUgY29sdW1uLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJhMyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDU5NjY5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8dGV4dCB4PSIyNiIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiM2NDc0OGIiPkRZTkFNT0RCIElURU08L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSI0MiIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxODAiIHJ4PSIxMiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI0NCIgeT0iNzQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPiYjMTIzOzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9Ijk4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4icGsiOiAgICAmIzEyMzsgIlMiOiAidXNlciM0MiIgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iMTIyIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4ic2siOiAgICAmIzEyMzsgIlMiOiAib3JkZXIjNyIgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iMTQ2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojYjQ1MzA5Ij4idG90YWwiOiAmIzEyMzsgIk4iOiAiMTIzLjQ1IiAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjYwIiB5PSIxNzAiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPiJ0YWdzIjogICYjMTIzOyAiU1MiOiBbInZpcCJdICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNDQiIHk9IjE5NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+JiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0NCIgeT0iMjE0IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZmlsbDojYjQ1MzA5Ij5OIGlzIGV4YWN0IGRlY2ltYWwsIG5vdCBhIGZsb2F0PC90ZXh0Pgo8bGluZSB4MT0iMzM0IiB5MT0iMTMyIiB4Mj0iMzg2IiB5Mj0iMTMyIiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhMykiLz4KPHRleHQgeD0iMzYwIiB5PSIxMjMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+c3RvcmU8L3RleHQ+Cjx0ZXh0IHg9IjM5NiIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiMwNDc4NTciPmRkYl9vcmRlcnMgUk9XIMK3IFBSSU1BUlkgS0VZIChwaywgc2spPC90ZXh0Pgo8cmVjdCB4PSIzOTYiIHk9IjQyIiB3aWR0aD0iNDE0IiBoZWlnaHQ9IjE5OCIgcng9IjEyIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjQxNCIgeT0iNjYiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPnBrICAgICAgICA8dHNwYW4gc3R5bGU9ImZpbGw6IzMzNDE1NSI+VEVYVDwvdHNwYW4+ICAgICJ1c2VyIzQyIjwvdGV4dD4KPHRleHQgeD0iNDE0IiB5PSI4OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+c2sgICAgICAgIDx0c3BhbiBzdHlsZT0iZmlsbDojMzM0MTU1Ij5URVhUPC90c3Bhbj4gICAgIm9yZGVyIzciPC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9IjExMCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+aXRlbSAgICAgIDx0c3BhbiBzdHlsZT0iZmlsbDojMzM0MTU1Ij5KU09OQjwvdHNwYW4+PC90ZXh0Pgo8cmVjdCB4PSI0MzAiIHk9IjEyMCIgd2lkdGg9IjM2NiIgaGVpZ2h0PSI1MiIgcng9IjciIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIvPgo8dGV4dCB4PSI0NDQiIHk9IjEzOSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+JiMxMjM7ICJ0b3RhbCI6ICYjMTIzOyAiTiI6ICIxMjMuNDUiICYjMTI1Oyw8L3RleHQ+Cjx0ZXh0IHg9IjQ0NCIgeT0iMTU4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4gICJ0YWdzIjogJiMxMjM7ICJTUyI6IFsidmlwIl0gJiMxMjU7LCDigKYgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9IjE5NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+b2tleSAgICAgIDx0c3BhbiBzdHlsZT0iZmlsbDojMzM0MTU1Ij5URVhUPC90c3Bhbj4gICAgcHJlc2VydmVzIHNvcnQgb3JkZXI8L3RleHQ+Cjx0ZXh0IHg9IjQxNCIgeT0iMjE2IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZmlsbDojNDc1NTY5Ij5UVEw6IGV4cHJlc3Npb24gaW5kZXggb3ZlciBpdGVtIEpTT05CPC90ZXh0Pgo8L3N2Zz4=" alt="A DynamoDB item becomes one row: pk TEXT, sk TEXT, okey TEXT and item JSONB, with PRIMARY KEY (pk, sk). The okey column preserves sort order. The whole item lives in JSONB in its DynamoDB wire form, so a number keeps its exact decimal text instead of becoming a float. TTL uses an expression index over the item, not a separate column." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIER5bmFtb0RCIGl0ZW0gYmVjb21lcyBvbmUgcm93OiBwayBURVhULCBzayBURVhULCBva2V5IFRFWFQgYW5kIGl0ZW0gSlNPTkIsIHdpdGggUFJJTUFSWSBLRVkgKHBrLCBzaykuIFRoZSBva2V5IGNvbHVtbiBwcmVzZXJ2ZXMgc29ydCBvcmRlci4gVGhlIHdob2xlIGl0ZW0gbGl2ZXMgaW4gSlNPTkIgaW4gaXRzIER5bmFtb0RCIHdpcmUgZm9ybSwgc28gYSBudW1iZXIga2VlcHMgaXRzIGV4YWN0IGRlY2ltYWwgdGV4dCBpbnN0ZWFkIG9mIGJlY29taW5nIGEgZmxvYXQuIFRUTCB1c2VzIGFuIGV4cHJlc3Npb24gaW5kZXggb3ZlciB0aGUgaXRlbSwgbm90IGEgc2VwYXJhdGUgY29sdW1uLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJhMyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMjBmN2I0Ii8+PC9tYXJrZXI+PC9kZWZzPgo8dGV4dCB4PSIyNiIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjYzljZmQ4Ij5EWU5BTU9EQiBJVEVNPC90ZXh0Pgo8cmVjdCB4PSIyNiIgeT0iNDIiIHdpZHRoPSIzMDAiIGhlaWdodD0iMTgwIiByeD0iMTIiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNDQiIHk9Ijc0IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+JiMxMjM7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iOTgiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij4icGsiOiAgICAmIzEyMzsgIlMiOiAidXNlciM0MiIgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iMTIyIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+InNrIjogICAgJiMxMjM7ICJTIjogIm9yZGVyIzciICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9IjE0NiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNkZWIyOTAiPiJ0b3RhbCI6ICYjMTIzOyAiTiI6ICIxMjMuNDUiICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9IjE3MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiJ0YWdzIjogICYjMTIzOyAiU1MiOiBbInZpcCJdICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNDQiIHk9IjE5NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNDQiIHk9IjIxNCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNkZWIyOTAiPk4gaXMgZXhhY3QgZGVjaW1hbCwgbm90IGEgZmxvYXQ8L3RleHQ+CjxsaW5lIHgxPSIzMzQiIHkxPSIxMzIiIHgyPSIzODYiIHkyPSIxMzIiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2EzKSIvPgo8dGV4dCB4PSIzNjAiIHk9IjEyMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj5zdG9yZTwvdGV4dD4KPHRleHQgeD0iMzk2IiB5PSIzMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPmRkYl9vcmRlcnMgUk9XIMK3IFBSSU1BUlkgS0VZIChwaywgc2spPC90ZXh0Pgo8cmVjdCB4PSIzOTYiIHk9IjQyIiB3aWR0aD0iNDE0IiBoZWlnaHQ9IjE5OCIgcng9IjEyIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjQxNCIgeT0iNjYiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5wayAgICAgICAgPHRzcGFuIHN0eWxlPSJmaWxsOiAjYzljZmQ4Ij5URVhUPC90c3Bhbj4gICAgInVzZXIjNDIiPC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9Ijg4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+c2sgICAgICAgIDx0c3BhbiBzdHlsZT0iZmlsbDogI2M5Y2ZkOCI+VEVYVDwvdHNwYW4+ICAgICJvcmRlciM3IjwvdGV4dD4KPHRleHQgeD0iNDE0IiB5PSIxMTAiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij5pdGVtICAgICAgPHRzcGFuIHN0eWxlPSJmaWxsOiAjYzljZmQ4Ij5KU09OQjwvdHNwYW4+PC90ZXh0Pgo8cmVjdCB4PSI0MzAiIHk9IjEyMCIgd2lkdGg9IjM2NiIgaGVpZ2h0PSI1MiIgcng9IjciIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNjY1MyIvPgo8dGV4dCB4PSI0NDQiIHk9IjEzOSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiYjMTIzOyAidG90YWwiOiAmIzEyMzsgIk4iOiAiMTIzLjQ1IiAmIzEyNTssPC90ZXh0Pgo8dGV4dCB4PSI0NDQiIHk9IjE1OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiAgInRhZ3MiOiAmIzEyMzsgIlNTIjogWyJ2aXAiXSAmIzEyNTssIOKApiAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjQxNCIgeT0iMTk0IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+b2tleSAgICAgIDx0c3BhbiBzdHlsZT0iZmlsbDogI2M5Y2ZkOCI+VEVYVDwvdHNwYW4+ICAgIHByZXNlcnZlcyBzb3J0IG9yZGVyPC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9IjIxNiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPlRUTDogZXhwcmVzc2lvbiBpbmRleCBvdmVyIGl0ZW0gSlNPTkI8L3RleHQ+Cjwvc3ZnPg==" alt="A DynamoDB item becomes one row: pk TEXT, sk TEXT, okey TEXT and item JSONB, with PRIMARY KEY (pk, sk). The okey column preserves sort order. The whole item lives in JSONB in its DynamoDB wire form, so a number keeps its exact decimal text instead of becoming a float. TTL uses an expression index over the item, not a separate column." />
</div>

<p className="t9-caption">Each attribute keeps its DynamoDB type tag inside item JSONB , so \{"N":"123.45"} keeps its exact decimal string.</p>

#### Where tables live

Each DynamoDB table has its own PostgreSQL table, indexes and optional `_strm` change-record table. `CreateTable` creates those database objects and their registry entry; `DeleteTable` drops them. Storage, indexes and vacuum settings can be tuned per table.

The adapter checks a 500-table guardrail per namespace when creating a physical DynamoDB table. Concurrent creates of different tables can exceed that guardrail; it is not a hard PostgreSQL quota. Plan database capacity and table placement for larger deployments. Provisioned instances continue to incur compute costs while idle.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFYWNoIGRlY2xhcmVkIER5bmFtb0RCIHRhYmxlIGlzIGl0cyBvd24gcGh5c2ljYWwgcmVsYXRpb24gaW5zaWRlIG9uZSBQb3N0Z3JlcyBkYXRhYmFzZSwgYWxvbmdzaWRlIHRoZSBhdXRob3JpdGF0aXZlIGRkYl90YWJsZXMgcmVnaXN0cnkgYW5kIGVhY2ggdGFibGUncyBuYXRpdmUgZXhwcmVzc2lvbiBpbmRleGVzLiBUaGUgYWRhcHRlciBhcHBsaWVzIGEgNTAwLXRhYmxlIGd1YXJkcmFpbCBwZXIgbmFtZXNwYWNlLiBMYXJnZXIgZGVwbG95bWVudHMgbmVlZCBjYXBhY2l0eSBhbmQgdGFibGUtcGxhY2VtZW50IHBsYW5uaW5nLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8dGV4dCB4PSIyNiIgeT0iMjgiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiMwNDc4NTciPk9ORSBQT1NUR1JFUyBEQVRBQkFTRSDCtyBwZXItdGFibGUgcGh5c2ljYWwgcmVsYXRpb25zPC90ZXh0Pgo8cmVjdCB4PSIyNiIgeT0iNDAiIHdpZHRoPSI1MjAiIGhlaWdodD0iMTY2IiByeD0iMTQiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHJlY3QgeD0iNDQiIHk9IjY2IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjEyNCIgcng9IjEwIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjExOSIgeT0iODgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTciPmRkYl9vcmRlcnM8L3RleHQ+CjxyZWN0IHg9IjU4IiB5PSIxMDAiIHdpZHRoPSIxMjIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iMTE5IiB5PSIxMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPnJvd3MgKHBrLCBzayk8L3RleHQ+CjxyZWN0IHg9IjU4IiB5PSIxMzIiIHdpZHRoPSIxMjIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iMTE5IiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPkdTSSBleHByIGluZGV4PC90ZXh0Pgo8dGV4dCB4PSIxMTkiIHk9IjE3OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPml0cyBvd24gcmVsYXRpb248L3RleHQ+CjxyZWN0IHg9IjIwNiIgeT0iNjYiIHdpZHRoPSIxNTAiIGhlaWdodD0iMTI0IiByeD0iMTAiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMjgxIiB5PSI4OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+ZGRiX3Nlc3Npb25zPC90ZXh0Pgo8cmVjdCB4PSIyMjAiIHk9IjEwMCIgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSIyODEiIHk9IjExNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+cm93cyAocGssIHNrKTwvdGV4dD4KPHJlY3QgeD0iMjIwIiB5PSIxMzIiIHdpZHRoPSIxMjIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iMjgxIiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPl9zdHJtIG91dGJveDwvdGV4dD4KPHRleHQgeD0iMjgxIiB5PSIxNzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5jcmVhdGVkIGF0IHJ1bnRpbWU8L3RleHQ+CjxyZWN0IHg9IjM2OCIgeT0iNjYiIHdpZHRoPSIxNjAiIGhlaWdodD0iMTI0IiByeD0iMTAiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNDQ4IiB5PSI4OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+ZGRiX3RhYmxlczwvdGV4dD4KPHJlY3QgeD0iMzgyIiB5PSIxMDAiIHdpZHRoPSIxMzIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iNDQ4IiB5PSIxMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPm9yZGVycyDihpIgcGh5czwvdGV4dD4KPHJlY3QgeD0iMzgyIiB5PSIxMzIiIHdpZHRoPSIxMzIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iNDQ4IiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPnNlc3Npb25zIOKGkiBwaHlzPC90ZXh0Pgo8dGV4dCB4PSI0NDgiIHk9IjE3OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmF1dGhvcml0YXRpdmUgcmVnaXN0cnk8L3RleHQ+Cjx0ZXh0IHg9IjU3NiIgeT0iMjgiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiM2NDc0OGIiPkxhcmdlciB0YWJsZSBzZXRzPC90ZXh0Pgo8cmVjdCB4PSI1NzYiIHk9IjQwIiB3aWR0aD0iMjM2IiBoZWlnaHQ9IjE2NiIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI0IDQiLz4KPHRleHQgeD0iNjk0IiB5PSI2NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZvbnQtd2VpZ2h0OjcwMDtmaWxsOiM0NzU1NjkiPlBsYW4gY2FwYWNpdHkgYW5kIHRhYmxlIHBsYWNlbWVudDwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSI4NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkd1YXJkcmFpbDogNTAwIHRhYmxlcyBwZXIgbmFtZXNwYWNlPC90ZXh0Pgo8cmVjdCB4PSI1OTYiIHk9IjEwMCIgd2lkdGg9IjkyIiBoZWlnaHQ9IjMwIiByeD0iNyIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIi8+Cjx0ZXh0IHg9IjY0MiIgeT0iMTIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojNDc1NTY5Ij5jYXBhY2l0eTwvdGV4dD4KPHJlY3QgeD0iNzAwIiB5PSIxMDAiIHdpZHRoPSI5MiIgaGVpZ2h0PSIzMCIgcng9IjciIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSI3NDYiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+dGFibGUgY291bnQ8L3RleHQ+Cjx0ZXh0IHg9IjY5NCIgeT0iMTUyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+Tm8gYXV0b21hdGljIHBsYWNlbWVudDwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSIxNjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5hY3Jvc3MgZGF0YWJhc2UgaW5zdGFuY2VzPC90ZXh0Pgo8dGV4dCB4PSI2OTQiIHk9IjE5MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnByb3Zpc2lvbmVkIC8gYWx3YXlzLW9uPC90ZXh0Pgo8L3N2Zz4=" alt="Each declared DynamoDB table is its own physical relation inside one Postgres database, alongside the authoritative ddb_tables registry and each table's native expression indexes. The adapter applies a 500-table guardrail per namespace. Larger deployments need capacity and table-placement planning." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFYWNoIGRlY2xhcmVkIER5bmFtb0RCIHRhYmxlIGlzIGl0cyBvd24gcGh5c2ljYWwgcmVsYXRpb24gaW5zaWRlIG9uZSBQb3N0Z3JlcyBkYXRhYmFzZSwgYWxvbmdzaWRlIHRoZSBhdXRob3JpdGF0aXZlIGRkYl90YWJsZXMgcmVnaXN0cnkgYW5kIGVhY2ggdGFibGUncyBuYXRpdmUgZXhwcmVzc2lvbiBpbmRleGVzLiBUaGUgYWRhcHRlciBhcHBsaWVzIGEgNTAwLXRhYmxlIGd1YXJkcmFpbCBwZXIgbmFtZXNwYWNlLiBMYXJnZXIgZGVwbG95bWVudHMgbmVlZCBjYXBhY2l0eSBhbmQgdGFibGUtcGxhY2VtZW50IHBsYW5uaW5nLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8dGV4dCB4PSIyNiIgeT0iMjgiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTBkZWM4Ij5PTkUgUE9TVEdSRVMgREFUQUJBU0UgwrcgcGVyLXRhYmxlIHBoeXNpY2FsIHJlbGF0aW9uczwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQwIiB3aWR0aD0iNTIwIiBoZWlnaHQ9IjE2NiIgcng9IjE0IiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+CjxyZWN0IHg9IjQ0IiB5PSI2NiIgd2lkdGg9IjE1MCIgaGVpZ2h0PSIxMjQiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q2NjUzIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIxMTkiIHk9Ijg4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+ZGRiX29yZGVyczwvdGV4dD4KPHJlY3QgeD0iNTgiIHk9IjEwMCIgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGU2NiIvPgo8dGV4dCB4PSIxMTkiIHk9IjExNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPnJvd3MgKHBrLCBzayk8L3RleHQ+CjxyZWN0IHg9IjU4IiB5PSIxMzIiIHdpZHRoPSIxMjIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iMTE5IiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5HU0kgZXhwciBpbmRleDwvdGV4dD4KPHRleHQgeD0iMTE5IiB5PSIxNzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5pdHMgb3duIHJlbGF0aW9uPC90ZXh0Pgo8cmVjdCB4PSIyMDYiIHk9IjY2IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjEyNCIgcng9IjEwIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjI4MSIgeT0iODgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij5kZGJfc2Vzc2lvbnM8L3RleHQ+CjxyZWN0IHg9IjIyMCIgeT0iMTAwIiB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI2IiByeD0iNiIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjI4MSIgeT0iMTE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+cm93cyAocGssIHNrKTwvdGV4dD4KPHJlY3QgeD0iMjIwIiB5PSIxMzIiIHdpZHRoPSIxMjIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iMjgxIiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5fc3RybSBvdXRib3g8L3RleHQ+Cjx0ZXh0IHg9IjI4MSIgeT0iMTc4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+Y3JlYXRlZCBhdCBydW50aW1lPC90ZXh0Pgo8cmVjdCB4PSIzNjgiIHk9IjY2IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjEyNCIgcng9IjEwIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjQ0OCIgeT0iODgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij5kZGJfdGFibGVzPC90ZXh0Pgo8cmVjdCB4PSIzODIiIHk9IjEwMCIgd2lkdGg9IjEzMiIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGU2NiIvPgo8dGV4dCB4PSI0NDgiIHk9IjExNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPm9yZGVycyDihpIgcGh5czwvdGV4dD4KPHJlY3QgeD0iMzgyIiB5PSIxMzIiIHdpZHRoPSIxMzIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iNDQ4IiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5zZXNzaW9ucyDihpIgcGh5czwvdGV4dD4KPHRleHQgeD0iNDQ4IiB5PSIxNzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5hdXRob3JpdGF0aXZlIHJlZ2lzdHJ5PC90ZXh0Pgo8dGV4dCB4PSI1NzYiIHk9IjI4IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogI2M5Y2ZkOCI+TGFyZ2VyIHRhYmxlIHNldHM8L3RleHQ+CjxyZWN0IHg9IjU3NiIgeT0iNDAiIHdpZHRoPSIyMzYiIGhlaWdodD0iMTY2IiByeD0iMTQiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjQgNCIvPgo8dGV4dCB4PSI2OTQiIHk9IjY2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZm9udC13ZWlnaHQ6NzAwO2ZpbGw6ICNjOWNmZDgiPlBsYW4gY2FwYWNpdHkgYW5kIHRhYmxlIHBsYWNlbWVudDwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSI4NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkd1YXJkcmFpbDogNTAwIHRhYmxlcyBwZXIgbmFtZXNwYWNlPC90ZXh0Pgo8cmVjdCB4PSI1OTYiIHk9IjEwMCIgd2lkdGg9IjkyIiBoZWlnaHQ9IjMwIiByeD0iNyIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjY0MiIgeT0iMTIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+Y2FwYWNpdHk8L3RleHQ+CjxyZWN0IHg9IjcwMCIgeT0iMTAwIiB3aWR0aD0iOTIiIGhlaWdodD0iMzAiIHJ4PSI3IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iNzQ2IiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij50YWJsZSBjb3VudDwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSIxNTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5ObyBhdXRvbWF0aWMgcGxhY2VtZW50PC90ZXh0Pgo8dGV4dCB4PSI2OTQiIHk9IjE2OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmFjcm9zcyBkYXRhYmFzZSBpbnN0YW5jZXM8L3RleHQ+Cjx0ZXh0IHg9IjY5NCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cHJvdmlzaW9uZWQgLyBhbHdheXMtb248L3RleHQ+Cjwvc3ZnPg==" alt="Each declared DynamoDB table is its own physical relation inside one Postgres database, alongside the authoritative ddb_tables registry and each table's native expression indexes. The adapter applies a 500-table guardrail per namespace. Larger deployments need capacity and table-placement planning." />
</div>

<p className="t9-caption">Each declared table is its own physical relation. CreateTable and DeleteTable create and drop PostgreSQL relations. The adapter applies a 500-table guardrail per namespace.</p>

#### Conditional writes

To evaluate a conditional write, the adapter locks the item's `(pk, sk)` row with `SELECT … FOR UPDATE`, checks the `ConditionExpression` against that row, then writes and commits. The lock prevents another writer from changing the item between the check and write.

A false condition returns the non-retryable `ConditionalCheckFailed` error. A PostgreSQL serialization failure or lock timeout (`40001`/lock-not-available) instead returns a retryable throughput error, allowing the SDK to back off and retry. Concurrency failures are not reported as failed conditions.

For `attribute_not_exists(pk)`, the PostgreSQL primary-key constraint prevents two concurrent requests from creating the same item. Only one insert can succeed for a given `(pk, sk)`.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIGNvbmRpdGlvbmFsIHdyaXRlIHRha2VzIGEgcm93IGxvY2sgd2l0aCBTRUxFQ1QgZm9yIHVwZGF0ZSwgZXZhbHVhdGVzIHRoZSBEeW5hbW9EQiBjb25kaXRpb24gaW5zaWRlIHRoZSBsYXllciBhZ2FpbnN0IHRoZSBsb2NrZWQgcm93LCB0aGVuIHdyaXRlcyBhbmQgY29tbWl0cy4gQSBmYWxzZSBjb25kaXRpb24gcmV0dXJucyBhIGZhaXRoZnVsIENvbmRpdGlvbmFsQ2hlY2tGYWlsZWQ7IGEgbG9zaW5nIGNvbmN1cnJlbmN5IHJhY2UgcmV0dXJucyBhIHJldHJ5YWJsZSBjb25mbGljdCwgbmV2ZXIgYSBzcHVyaW91cyBjb25kaXRpb24gZmFpbHVyZS4gVW5pcXVlIGNyZWF0aW9uIGlzIGVuZm9yY2VkIGJ5IHRoZSBwcmltYXJ5IGtleS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0iYTUiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPGNpcmNsZSBjeD0iNDAiIGN5PSI2MCIgcj0iMTMiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48dGV4dCB4PSI0MCIgeT0iNjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+MTwvdGV4dD4KPHJlY3QgeD0iNjIiIHk9IjQyIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjQ4IiByeD0iMTAiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iNzYiIHk9IjYyIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+TG9jayBjdXJyZW50IHJvdzwvdGV4dD4KPHRleHQgeD0iNzYiIHk9Ijc5IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+PHRzcGFuIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPlNFTEVDVCDigKYgRk9SIFVQREFURTwvdHNwYW4+PC90ZXh0Pgo8bGluZSB4MT0iMTcyIiB5MT0iOTAiIHgyPSIxNzIiIHkyPSIxMTIiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYTUpIi8+CjxjaXJjbGUgY3g9IjQwIiBjeT0iMTM0IiByPSIxMyIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPjx0ZXh0IHg9IjQwIiB5PSIxMzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+MjwvdGV4dD4KPHJlY3QgeD0iNjIiIHk9IjExNiIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjEwIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijc2IiB5PSIxMzYiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTIuNXB4Ij5FdmFsdWF0ZSBjb25kaXRpb248L3RleHQ+Cjx0ZXh0IHg9Ijc2IiB5PSIxNTMiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPmFnYWluc3QgdGhlIGxvY2tlZCByb3c8L3RleHQ+CjxsaW5lIHgxPSIxNzIiIHkxPSIxNjQiIHgyPSIxNzIiIHkyPSIxODYiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYTUpIi8+CjxjaXJjbGUgY3g9IjQwIiBjeT0iMjA4IiByPSIxMyIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPjx0ZXh0IHg9IjQwIiB5PSIyMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+MzwvdGV4dD4KPHJlY3QgeD0iNjIiIHk9IjE5MCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjEwIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9Ijc2IiB5PSIyMTAiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTIuNXB4Ij5Xcml0ZSAmYW1wOyBDT01NSVQ8L3RleHQ+Cjx0ZXh0IHg9Ijc2IiB5PSIyMjciIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj50aGUgbG9jayByZWxlYXNlcyBhdG9taWNhbGx5PC90ZXh0Pgo8bGluZSB4MT0iMjgyIiB5MT0iMTQwIiB4Mj0iMzU0IiB5Mj0iMTQwIiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2E1KSIvPgo8cmVjdCB4PSIzNTYiIHk9IjExOCIgd2lkdGg9IjM0MCIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyNiIgeT0iMTM2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEycHgiPmNvbmRpdGlvbiBmYWxzZSDihpI8L3RleHQ+Cjx0ZXh0IHg9IjUyNiIgeT0iMTUyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5Db25kaXRpb25hbENoZWNrRmFpbGVkPC90ZXh0Pgo8bGluZSB4MT0iMjgyIiB5MT0iMjE0IiB4Mj0iMzU0IiB5Mj0iMjE0IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2E1KSIvPgo8cmVjdCB4PSIzNTYiIHk9IjE5MiIgd2lkdGg9IjM0MCIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjZmZmYmViIiBzdHJva2U9IiNmZGU2OGEiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyNiIgeT0iMjEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDo2MDAgMTJweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6I2I0NTMwOSI+bG9jayB0aW1lb3V0IC8gNDAwMDEg4oaSPC90ZXh0Pgo8dGV4dCB4PSI1MjYiIHk9IjIyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6I2I0NTMwOSI+cmV0cnlhYmxlIGNvbmZsaWN0LCBub3QgYSBjb25kaXRpb24gZmFpbHVyZTwvdGV4dD4KPC9zdmc+" alt="A conditional write takes a row lock with SELECT for update, evaluates the DynamoDB condition inside the layer against the locked row, then writes and commits. A false condition returns a faithful ConditionalCheckFailed; a losing concurrency race returns a retryable conflict, never a spurious condition failure. Unique creation is enforced by the primary key." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIGNvbmRpdGlvbmFsIHdyaXRlIHRha2VzIGEgcm93IGxvY2sgd2l0aCBTRUxFQ1QgZm9yIHVwZGF0ZSwgZXZhbHVhdGVzIHRoZSBEeW5hbW9EQiBjb25kaXRpb24gaW5zaWRlIHRoZSBsYXllciBhZ2FpbnN0IHRoZSBsb2NrZWQgcm93LCB0aGVuIHdyaXRlcyBhbmQgY29tbWl0cy4gQSBmYWxzZSBjb25kaXRpb24gcmV0dXJucyBhIGZhaXRoZnVsIENvbmRpdGlvbmFsQ2hlY2tGYWlsZWQ7IGEgbG9zaW5nIGNvbmN1cnJlbmN5IHJhY2UgcmV0dXJucyBhIHJldHJ5YWJsZSBjb25mbGljdCwgbmV2ZXIgYSBzcHVyaW91cyBjb25kaXRpb24gZmFpbHVyZS4gVW5pcXVlIGNyZWF0aW9uIGlzIGVuZm9yY2VkIGJ5IHRoZSBwcmltYXJ5IGtleS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0iYTUiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPGNpcmNsZSBjeD0iNDAiIGN5PSI2MCIgcj0iMTMiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48dGV4dCB4PSI0MCIgeT0iNjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMCI+MTwvdGV4dD4KPHJlY3QgeD0iNjIiIHk9IjQyIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjQ4IiByeD0iMTAiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iNzYiIHk9IjYyIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+TG9jayBjdXJyZW50IHJvdzwvdGV4dD4KPHRleHQgeD0iNzYiIHk9Ijc5IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+PHRzcGFuIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5TRUxFQ1Qg4oCmIEZPUiBVUERBVEU8L3RzcGFuPjwvdGV4dD4KPGxpbmUgeDE9IjE3MiIgeTE9IjkwIiB4Mj0iMTcyIiB5Mj0iMTEyIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2E1KSIvPgo8Y2lyY2xlIGN4PSI0MCIgY3k9IjEzNCIgcj0iMTMiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48dGV4dCB4PSI0MCIgeT0iMTM4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXdlaWdodDo3MDAiPjI8L3RleHQ+CjxyZWN0IHg9IjYyIiB5PSIxMTYiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDgiIHJ4PSIxMCIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI3NiIgeT0iMTM2IiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEyLjVweCI+RXZhbHVhdGUgY29uZGl0aW9uPC90ZXh0Pgo8dGV4dCB4PSI3NiIgeT0iMTUzIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5hZ2FpbnN0IHRoZSBsb2NrZWQgcm93PC90ZXh0Pgo8bGluZSB4MT0iMTcyIiB5MT0iMTY0IiB4Mj0iMTcyIiB5Mj0iMTg2IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2E1KSIvPgo8Y2lyY2xlIGN4PSI0MCIgY3k9IjIwOCIgcj0iMTMiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48dGV4dCB4PSI0MCIgeT0iMjEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXdlaWdodDo3MDAiPjM8L3RleHQ+CjxyZWN0IHg9IjYyIiB5PSIxOTAiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDgiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSI3NiIgeT0iMjEwIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+V3JpdGUgJmFtcDsgQ09NTUlUPC90ZXh0Pgo8dGV4dCB4PSI3NiIgeT0iMjI3IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+dGhlIGxvY2sgcmVsZWFzZXMgYXRvbWljYWxseTwvdGV4dD4KPGxpbmUgeDE9IjI4MiIgeTE9IjE0MCIgeDI9IjM1NCIgeTI9IjE0MCIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhNSkiLz4KPHJlY3QgeD0iMzU2IiB5PSIxMTgiIHdpZHRoPSIzNDAiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjYiIHk9IjEzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtc2l6ZToxMnB4Ij5jb25kaXRpb24gZmFsc2Ug4oaSPC90ZXh0Pgo8dGV4dCB4PSI1MjYiIHk9IjE1MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+Q29uZGl0aW9uYWxDaGVja0ZhaWxlZDwvdGV4dD4KPGxpbmUgeDE9IjI4MiIgeTE9IjIxNCIgeDI9IjM1NCIgeTI9IjIxNCIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhNSkiLz4KPHJlY3QgeD0iMzU2IiB5PSIxOTIiIHdpZHRoPSIzNDAiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iIzMxMmQxYSIgc3Ryb2tlPSIjNjY1ZDNkIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjYiIHk9IjIxMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjAwIDEycHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiAjZGViMjkwIj5sb2NrIHRpbWVvdXQgLyA0MDAwMSDihpI8L3RleHQ+Cjx0ZXh0IHg9IjUyNiIgeT0iMjI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2RlYjI5MCI+cmV0cnlhYmxlIGNvbmZsaWN0LCBub3QgYSBjb25kaXRpb24gZmFpbHVyZTwvdGV4dD4KPC9zdmc+" alt="A conditional write takes a row lock with SELECT for update, evaluates the DynamoDB condition inside the layer against the locked row, then writes and commits. A false condition returns a faithful ConditionalCheckFailed; a losing concurrency race returns a retryable conflict, never a spurious condition failure. Unique creation is enforced by the primary key." />
</div>

<p className="t9-caption">Failed conditions and PostgreSQL concurrency conflicts return different error types.</p>

#### Secondary indexes

On each write, the adapter adds two index fields to the item's JSONB. The partition-key field, `_idx_<name>_h`, normalizes equivalent values such as `1` and `1.0`. The sort-key field, `_idx_<name>_o`, preserves sort order and uses the base key to break ties. A PostgreSQL expression index over these fields locates matching partition keys. The adapter then evaluates sort-key conditions, ordering, pagination, and any `FilterExpression` over the retrieved items.

The index fields and item commit in the same transaction, so GSI queries are strongly consistent. DynamoDB's own GSIs update asynchronously and are eventually consistent. Each index lookup is limited to 10,000 candidate items for one index partition-key value. Exceeding this limit returns an error; choose index keys with this limit in mind.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjEwIiB2aWV3Qm94PSIwIDAgODM2IDIxMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJPbiBlYWNoIHdyaXRlIHRoZSBsYXllciBzdGFtcHMgYSBub3JtYWxpemVkLWhhc2ggZmllbGQgYW5kIGEgY29sbGF0ZWQtcmFuZ2UgZmllbGQgaW50byB0aGUgaXRlbSdzIEpTT05CLCBhbmQgUG9zdGdyZXMgbWFpbnRhaW5zIGEgbmF0aXZlIGV4cHJlc3Npb24gaW5kZXggb3ZlciB0aGVtLiBBIEdTSSBxdWVyeSBpcyBhbiBpbmRleCBzZWVrIGJ5IHRoZSBzdGFtcGVkIGhhc2ggcGx1cyBmaWx0ZXJpbmcgaW4gdGhlIGFkYXB0ZXIuIFRoZSBzdGFtcHMgY28tY29tbWl0IHdpdGggdGhlIGl0ZW0sIHNvIHRoZSBpbmRleCBpcyBzdHJvbmdseSBjb25zaXN0ZW50LiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJhNiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDU5NjY5Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImE2cSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjNjM2NmYxIi8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB4PSIyNiIgeT0iNDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNTgiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMDEiIHk9IjY1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+UHV0SXRlbTwvdGV4dD4KPHRleHQgeD0iMTAxIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnN0YXR1cyA9IFNISVBQRUQ8L3RleHQ+CjxsaW5lIHgxPSIxNzYiIHkxPSI2OSIgeDI9IjIzMiIgeTI9IjY5IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhNikiLz4KPHRleHQgeD0iMjA0IiB5PSI2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC13ZWlnaHQ6NzAwIj5pbmRleCBrZXlzPC90ZXh0Pgo8cmVjdCB4PSIyMzYiIHk9IjM0IiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjcwIiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iMzI2IiB5PSI1OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtc2l6ZToxMnB4Ij5pdGVtIEpTT05CPC90ZXh0Pgo8dGV4dCB4PSIzMjYiIHk9Ijc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij4rIF9pZHhfeF9oICAobm9ybS4gaGFzaCk8L3RleHQ+Cjx0ZXh0IHg9IjMyNiIgeT0iOTEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPisgX2lkeF94X28gIChjb2xsYXRlZCByYW5nZSk8L3RleHQ+CjxsaW5lIHgxPSIzMjYiIHkxPSIxMDQiIHgyPSIzMjYiIHkyPSIxMzIiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2E2KSIvPgo8dGV4dCB4PSIzMzgiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC13ZWlnaHQ6NzAwIj5zYW1lIHRyYW5zYWN0aW9uPC90ZXh0Pgo8cmVjdCB4PSIyMzYiIHk9IjEzNCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI2MCIgcng9IjEyIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjMyNiIgeT0iMTU4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjExLjVweCI+bmF0aXZlIGV4cHJlc3Npb24gaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjMyNiIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojNDc1NTY5Ij5vbiAoX2lkeF94X2gsIF9pZHhfeF9vKTwvdGV4dD4KPHJlY3QgeD0iNTAwIiB5PSI0MCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI1OCIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjU3NSIgeT0iNjUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTIuNXB4Ij5RdWVyeSBHU0k8L3RleHQ+Cjx0ZXh0IHg9IjU3NSIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5zdGF0dXMgPSBTSElQUEVEPC90ZXh0Pgo8bGluZSB4MT0iNTc1IiB5MT0iOTgiIHgyPSI1NzUiIHkyPSIxNjQiIHN0cm9rZT0iIzYzNjZmMSIgc3Ryb2tlLXdpZHRoPSIxLjgiLz4KPGxpbmUgeDE9IjU3NSIgeTE9IjE2NCIgeDI9IjQxOCIgeTI9IjE2NCIgc3Ryb2tlPSIjNjM2NmYxIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhNnEpIi8+Cjx0ZXh0IHg9IjQ5NiIgeT0iMTU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDojNjM2NmYxIj5pbmRleCBsb29rdXAgKyBmaWx0ZXI8L3RleHQ+Cjx0ZXh0IHg9IjY5MCIgeT0iNzAiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmaWxsOiM0NzU1Njk7Zm9udC13ZWlnaHQ6NjAwIj5TdHJvbmdseSBjb25zaXN0ZW50OjwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSI5MCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnRoZSBpdGVtIGFuZCBpbmRleDwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSIxMDYiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5jb21taXQgdG9nZXRoZXIuPC90ZXh0Pgo8dGV4dCB4PSI2OTAiIHk9IjEzMCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkR5bmFtb0RCIEdTSXMgYXJlPC90ZXh0Pgo8dGV4dCB4PSI2OTAiIHk9IjE0NiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmV2ZW50dWFsbHkgY29uc2lzdGVudC48L3RleHQ+Cjwvc3ZnPg==" alt="On each write the layer stamps a normalized-hash field and a collated-range field into the item's JSONB, and Postgres maintains a native expression index over them. A GSI query is an index seek by the stamped hash plus filtering in the adapter. The stamps co-commit with the item, so the index is strongly consistent." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjEwIiB2aWV3Qm94PSIwIDAgODM2IDIxMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJPbiBlYWNoIHdyaXRlIHRoZSBsYXllciBzdGFtcHMgYSBub3JtYWxpemVkLWhhc2ggZmllbGQgYW5kIGEgY29sbGF0ZWQtcmFuZ2UgZmllbGQgaW50byB0aGUgaXRlbSdzIEpTT05CLCBhbmQgUG9zdGdyZXMgbWFpbnRhaW5zIGEgbmF0aXZlIGV4cHJlc3Npb24gaW5kZXggb3ZlciB0aGVtLiBBIEdTSSBxdWVyeSBpcyBhbiBpbmRleCBzZWVrIGJ5IHRoZSBzdGFtcGVkIGhhc2ggcGx1cyBmaWx0ZXJpbmcgaW4gdGhlIGFkYXB0ZXIuIFRoZSBzdGFtcHMgY28tY29tbWl0IHdpdGggdGhlIGl0ZW0sIHNvIHRoZSBpbmRleCBpcyBzdHJvbmdseSBjb25zaXN0ZW50LiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJhNiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMjBmN2I0Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImE2cSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjNjM2NmYxIi8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB4PSIyNiIgeT0iNDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNTgiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMDEiIHk9IjY1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+UHV0SXRlbTwvdGV4dD4KPHRleHQgeD0iMTAxIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnN0YXR1cyA9IFNISVBQRUQ8L3RleHQ+CjxsaW5lIHgxPSIxNzYiIHkxPSI2OSIgeDI9IjIzMiIgeTI9IjY5IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhNikiLz4KPHRleHQgeD0iMjA0IiB5PSI2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj5pbmRleCBrZXlzPC90ZXh0Pgo8cmVjdCB4PSIyMzYiIHk9IjM0IiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjcwIiByeD0iMTIiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iMzI2IiB5PSI1OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtc2l6ZToxMnB4Ij5pdGVtIEpTT05CPC90ZXh0Pgo8dGV4dCB4PSIzMjYiIHk9Ijc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij4rIF9pZHhfeF9oICAobm9ybS4gaGFzaCk8L3RleHQ+Cjx0ZXh0IHg9IjMyNiIgeT0iOTEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPisgX2lkeF94X28gIChjb2xsYXRlZCByYW5nZSk8L3RleHQ+CjxsaW5lIHgxPSIzMjYiIHkxPSIxMDQiIHgyPSIzMjYiIHkyPSIxMzIiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2E2KSIvPgo8dGV4dCB4PSIzMzgiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj5zYW1lIHRyYW5zYWN0aW9uPC90ZXh0Pgo8cmVjdCB4PSIyMzYiIHk9IjEzNCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI2MCIgcng9IjEyIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjMyNiIgeT0iMTU4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExLjVweCI+bmF0aXZlIGV4cHJlc3Npb24gaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjMyNiIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+b24gKF9pZHhfeF9oLCBfaWR4X3hfbyk8L3RleHQ+CjxyZWN0IHg9IjUwMCIgeT0iNDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNTgiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1NzUiIHk9IjY1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+UXVlcnkgR1NJPC90ZXh0Pgo8dGV4dCB4PSI1NzUiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+c3RhdHVzID0gU0hJUFBFRDwvdGV4dD4KPGxpbmUgeDE9IjU3NSIgeTE9Ijk4IiB4Mj0iNTc1IiB5Mj0iMTY0IiBzdHJva2U9IiMzZDNlNjYiIHN0cm9rZS13aWR0aD0iMS44Ii8+CjxsaW5lIHgxPSI1NzUiIHkxPSIxNjQiIHgyPSI0MTgiIHkyPSIxNjQiIHN0cm9rZT0iIzNkM2U2NiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYTZxKSIvPgo8dGV4dCB4PSI0OTYiIHk9IjE1NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6ICM2MzY2ZjEiPmluZGV4IGxvb2t1cCArIGZpbHRlcjwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSI3MCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDg7Zm9udC13ZWlnaHQ6NjAwIj5TdHJvbmdseSBjb25zaXN0ZW50OjwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSI5MCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnRoZSBpdGVtIGFuZCBpbmRleDwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSIxMDYiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5jb21taXQgdG9nZXRoZXIuPC90ZXh0Pgo8dGV4dCB4PSI2OTAiIHk9IjEzMCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkR5bmFtb0RCIEdTSXMgYXJlPC90ZXh0Pgo8dGV4dCB4PSI2OTAiIHk9IjE0NiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmV2ZW50dWFsbHkgY29uc2lzdGVudC48L3RleHQ+Cjwvc3ZnPg==" alt="On each write the layer stamps a normalized-hash field and a collated-range field into the item's JSONB, and Postgres maintains a native expression index over them. A GSI query is an index seek by the stamped hash plus filtering in the adapter. The stamps co-commit with the item, so the index is strongly consistent." />
</div>

<p className="t9-caption">A GSI uses a PostgreSQL expression index to find candidates, then the adapter filters and orders them. Index updates commit with the item, making GSI queries strongly consistent.</p>

#### Transactions

`TransactWriteItems` executes in one PostgreSQL `BEGIN…COMMIT` transaction at `SERIALIZABLE` isolation. A debit in one table and a credit in another either both commit or both fail, as in DynamoDB.

Transactions enforce DynamoDB's 100-action limit and one-operation-per-item rule. The adapter records `ClientRequestToken` in the same transaction as the writes. Within DynamoDB's idempotency window, a retry with the same token returns the prior success without committing the writes again. The adapter acquires row locks in a consistent order to prevent opposite-direction transfers from deadlocking. Serialization or deadlock failures return retryable conflicts.

`TransactWriteItems` is not supported on stream-enabled tables. A request that touches any such table returns `ValidationException` before execution, because the transaction path does not create the required stream records.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA2IiB2aWV3Qm94PSIwIDAgODM2IDIwNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIFRyYW5zYWN0V3JpdGVJdGVtcyBzcGFubmluZyB0d28gdGFibGVzLCBhIGRlYml0IGluIG9uZSByZWxhdGlvbiBhbmQgYSBjcmVkaXQgaW4gYW5vdGhlciwgY29tbWl0cyBhdG9taWNhbGx5IGluIG9uZSBCRUdJTuKApkNPTU1JVCBhdCBTRVJJQUxJWkFCTEUgaXNvbGF0aW9uLCBleGFjdGx5IGxpa2UgcmVhbCBEeW5hbW9EQi4gIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImE3IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwNTk2NjkiLz48L21hcmtlcj48L2RlZnM+Cjx0ZXh0IHg9IjI2IiB5PSIyOCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzA0Nzg1NyI+Q1JPU1MtVEFCTEUg4oaSIE9ORSBBVE9NSUMgQ09NTUlUPC90ZXh0Pgo8cmVjdCB4PSIyNiIgeT0iNDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iMTI2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMTAxIiB5PSI2NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5UcmFuc2FjdFdyaXRlPC90ZXh0Pgo8cmVjdCB4PSI0MCIgeT0iNzgiIHdpZHRoPSIxMjIiIGhlaWdodD0iMzQiIHJ4PSI3IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iMTAxIiB5PSI5MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+ZGViaXQ8L3RleHQ+Cjx0ZXh0IHg9IjEwMSIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMDU5NjY5Ij5kZGJfYWNjb3VudHM8L3RleHQ+CjxyZWN0IHg9IjQwIiB5PSIxMTgiIHdpZHRoPSIxMjIiIGhlaWdodD0iMzQiIHJ4PSI3IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iMTAxIiB5PSIxMzMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPmNyZWRpdDwvdGV4dD4KPHRleHQgeD0iMTAxIiB5PSIxNDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNTk2NjkiPmRkYl9sZWRnZXI8L3RleHQ+CjxsaW5lIHgxPSIxNzYiIHkxPSIxMDMiIHgyPSIyMzYiIHkyPSIxMDMiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2E3KSIvPgo8dGV4dCB4PSIyMDYiIHk9Ijk0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDAiPm9uZSB0eG48L3RleHQ+CjxyZWN0IHg9IjI0MCIgeT0iNTIiIHdpZHRoPSIyMjgiIGhlaWdodD0iMTAyIiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iMzU0IiB5PSI3OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtc2l6ZToxMnB4Ij5CRUdJTiDigKYgQ09NTUlUPC90ZXh0Pgo8dGV4dCB4PSIzNTQiIHk9Ijk2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5TRVJJQUxJWkFCTEUgaXNvbGF0aW9uPC90ZXh0Pgo8dGV4dCB4PSIzNTQiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+Ym90aCByZWxhdGlvbnMsIGF0b21pY2FsbHk8L3RleHQ+Cjx0ZXh0IHg9IjM1NCIgeT0iMTMyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmaWxsOiM0NzU1NjkiPmxvY2stb3JkZXIgc29ydCBhdm9pZHMgZGVhZGxvY2s8L3RleHQ+Cjx0ZXh0IHg9IjM1NCIgeT0iMTQ2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmaWxsOiM0NzU1NjkiPkNsaWVudFJlcXVlc3RUb2tlbiDihpIgY29tbWl0cyBvbmNlPC90ZXh0Pgo8bGluZSB4MT0iNDg0IiB5MT0iMzQiIHgyPSI0ODQiIHkyPSIxNzIiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iNTA4IiB5PSI2NiIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4O2ZpbGw6IzA0Nzg1NyI+Q3Jvc3MtdGFibGUgQUNJRDwvdGV4dD4KPHRleHQgeD0iNTA4IiB5PSI5MCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+RHluYW1vREIgYW5kIHRoaXMgdGFyZ2V0PC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjEwNyIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+Y29tbWl0IGFjcm9zcyB0YWJsZXMuPC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjEyNyIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+U3RyZWFtLWVuYWJsZWQgdGFibGVzPC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjE0NCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+ZG8gbm90IHNlcnZlIHRyYW5zYWN0aW9uPC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjE2MSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+cmVxdWVzdHMgaW4gdGhpcyBtYXBwaW5nLjwvdGV4dD4KPC9zdmc+" alt="A TransactWriteItems spanning two tables, a debit in one relation and a credit in another, commits atomically in one BEGIN…COMMIT at SERIALIZABLE isolation, exactly like real DynamoDB." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA2IiB2aWV3Qm94PSIwIDAgODM2IDIwNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIFRyYW5zYWN0V3JpdGVJdGVtcyBzcGFubmluZyB0d28gdGFibGVzLCBhIGRlYml0IGluIG9uZSByZWxhdGlvbiBhbmQgYSBjcmVkaXQgaW4gYW5vdGhlciwgY29tbWl0cyBhdG9taWNhbGx5IGluIG9uZSBCRUdJTuKApkNPTU1JVCBhdCBTRVJJQUxJWkFCTEUgaXNvbGF0aW9uLCBleGFjdGx5IGxpa2UgcmVhbCBEeW5hbW9EQi4gIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImE3IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMyMGY3YjQiLz48L21hcmtlcj48L2RlZnM+Cjx0ZXh0IHg9IjI2IiB5PSIyOCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPkNST1NTLVRBQkxFIOKGkiBPTkUgQVRPTUlDIENPTU1JVDwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQwIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjEyNiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjEwMSIgeT0iNjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+VHJhbnNhY3RXcml0ZTwvdGV4dD4KPHJlY3QgeD0iNDAiIHk9Ijc4IiB3aWR0aD0iMTIyIiBoZWlnaHQ9IjM0IiByeD0iNyIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjEwMSIgeT0iOTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5kZWJpdDwvdGV4dD4KPHRleHQgeD0iMTAxIiB5PSIxMDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM2Ij5kZGJfYWNjb3VudHM8L3RleHQ+CjxyZWN0IHg9IjQwIiB5PSIxMTgiIHdpZHRoPSIxMjIiIGhlaWdodD0iMzQiIHJ4PSI3IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iMTAxIiB5PSIxMzMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5jcmVkaXQ8L3RleHQ+Cjx0ZXh0IHg9IjEwMSIgeT0iMTQ2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjNiI+ZGRiX2xlZGdlcjwvdGV4dD4KPGxpbmUgeDE9IjE3NiIgeTE9IjEwMyIgeDI9IjIzNiIgeTI9IjEwMyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYTcpIi8+Cjx0ZXh0IHg9IjIwNiIgeT0iOTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMCI+b25lIHR4bjwvdGV4dD4KPHJlY3QgeD0iMjQwIiB5PSI1MiIgd2lkdGg9IjIyOCIgaGVpZ2h0PSIxMDIiIHJ4PSIxMiIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNyIvPgo8dGV4dCB4PSIzNTQiIHk9Ijc4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEycHgiPkJFR0lOIOKApiBDT01NSVQ8L3RleHQ+Cjx0ZXh0IHg9IjM1NCIgeT0iOTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPlNFUklBTElaQUJMRSBpc29sYXRpb248L3RleHQ+Cjx0ZXh0IHg9IjM1NCIgeT0iMTEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5ib3RoIHJlbGF0aW9ucywgYXRvbWljYWxseTwvdGV4dD4KPHRleHQgeD0iMzU0IiB5PSIxMzIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZpbGw6ICNjOWNmZDgiPmxvY2stb3JkZXIgc29ydCBhdm9pZHMgZGVhZGxvY2s8L3RleHQ+Cjx0ZXh0IHg9IjM1NCIgeT0iMTQ2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmaWxsOiAjYzljZmQ4Ij5DbGllbnRSZXF1ZXN0VG9rZW4g4oaSIGNvbW1pdHMgb25jZTwvdGV4dD4KPGxpbmUgeDE9IjQ4NCIgeTE9IjM0IiB4Mj0iNDg0IiB5Mj0iMTcyIiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjUwOCIgeT0iNjYiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweDtmaWxsOiAjOTBkZWM4Ij5Dcm9zcy10YWJsZSBBQ0lEPC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjkwIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+RHluYW1vREIgYW5kIHRoaXMgdGFyZ2V0PC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjEwNyIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPmNvbW1pdCBhY3Jvc3MgdGFibGVzLjwvdGV4dD4KPHRleHQgeD0iNTA4IiB5PSIxMjciIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5TdHJlYW0tZW5hYmxlZCB0YWJsZXM8L3RleHQ+Cjx0ZXh0IHg9IjUwOCIgeT0iMTQ0IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+ZG8gbm90IHNlcnZlIHRyYW5zYWN0aW9uPC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjE2MSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPnJlcXVlc3RzIGluIHRoaXMgbWFwcGluZy48L3RleHQ+Cjwvc3ZnPg==" alt="A TransactWriteItems spanning two tables, a debit in one relation and a credit in another, commits atomically in one BEGIN…COMMIT at SERIALIZABLE isolation, exactly like real DynamoDB." />
</div>

<p className="t9-caption">TransactWriteItems runs in one native Postgres BEGIN…COMMIT at SERIALIZABLE, atomic and isolated across tables.</p>

#### Limitations

PostgreSQL limitations

* **One PostgreSQL instance serves each table.** Heavy contention on one key can cause serialization failures and row-lock conflicts. The adapter returns retryable errors, but sustained contention can exhaust the SDK retry budget and appear as throttling.
* **Stream-enabled tables allow one writer at a time.** An owner lease of about 90 seconds preserves stream record order. A second adapter instance attempting to write while that lease is active receives a retryable `ThrottlingException`. Throughput depends on the writer, database and request workload. Tables without streams support concurrent writers.
* **`DescribeStream` lists at most 100 shards.** A stream with more shards is not fully enumerated in one call.
* **Transactions on stream-enabled tables are unsupported.** A `TransactWriteItems` request touching one returns `ValidationException` because the transaction path does not create stream records.
* **DynamoDB backup and global-table APIs are unsupported.** Use PostgreSQL backups, snapshots, point-in-time recovery (PITR), and replica/failover procedures. DynamoDB on-demand backup/restore, PITR, and global-table replication APIs are not implemented.
* **Instances incur costs when idle.** Size and pay for PostgreSQL capacity ahead of demand. Larger table counts require more instances and table-placement planning.
* **Index lookups have a 10,000-item limit.** A lookup that exceeds 10,000 candidate items for one index partition-key value returns an error.
* **Plan for the table-count guardrail.** The adapter checks 500 physical DynamoDB tables per namespace. Larger deployments need database capacity and table-placement planning.
* **Expired items remain readable until deletion.** A bounded, leader-elected reaper uses the TTL expression index to delete eligible rows asynchronously. Until physical deletion, GetItem, Query and Scan can return the expired item, and it continues to consume storage.

#### Other considerations

* **Stream records commit with the write.** The adapter stores each record in the table's `_strm` table within the same transaction as the item write. A record exists if and only if its write committed. The single-writer lease keeps stream sequence order aligned with commit order so a cursor can resume without skipping records.
* **Use PostgreSQL recovery procedures.** Backups, PITR, snapshots, and replica/failover procedures operate on the PostgreSQL database. The adapter does not implement DynamoDB backup, PITR, or global-table APIs.
* **Connection pooling.** The adapter uses pooled PostgreSQL connections. Deployments spread across many instances may need a separate pooler to keep total connections within each database's limit.
* **Migrate and test one table at a time.** Separate PostgreSQL tables allow per-table export/import, dual-write, or backfill-and-switch procedures. Application code continues to use the DynamoDB API.
* **Use PostgreSQL operational tools.** Monitor SQL activity, maintain indexes, vacuum tables, and run backups with your existing PostgreSQL tools and procedures.

## On Azure

### Via Azure Cosmos DB (provisioned)

| Operation                                                                   | Area                | Support      | Depth        | Notes                                                                                                                                                                                                                                                                                                          |
| --------------------------------------------------------------------------- | ------------------- | ------------ | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| DescribeContinuousBackups                                                   | Backups             | Partial      | Full surface | PITR status mapped from the Cosmos continuous-backup mode                                                                                                                                                                                                                                                      |
| On-demand backups (CreateBackup / RestoreTableFromBackup / …)               | Backups             | Out of scope | Full surface | the snapshot-backup model differs from Cosmos; Use the target backup and restore workflow.                                                                                                                                                                                                                     |
| UpdateContinuousBackups                                                     | Backups             | Partial      | Full surface | toggles PITR onto Cosmos continuous backup (the retention window differs)                                                                                                                                                                                                                                      |
| ConditionExpression                                                         | Conditional writes  | Supported    | Common       | condition and mutation execute atomically in a stored procedure, eligible PATCH or etag-guarded fallback; write conflicts are retryable                                                                                                                                                                        |
| Global tables (CreateGlobalTable / UpdateGlobalTable / …)                   | Global              | Out of scope | Full surface | DynamoDB global-table control APIs are outside this mapping; configure the target deployment and its region separately.                                                                                                                                                                                        |
| DescribeStream                                                              | Indexes + streams   | Supported    | Full surface | returns the shard list and stream ARN                                                                                                                                                                                                                                                                          |
| GetRecords                                                                  | Indexes + streams   | Supported    | Full surface | records co-commit atomically with the write; all four view types; 24-hour retention with TrimmedDataAccessException below the horizon; one writing instance per streamed table                                                                                                                                 |
| GetShardIterator                                                            | Indexes + streams   | Supported    | Full surface | -                                                                                                                                                                                                                                                                                                              |
| ListStreams                                                                 | Indexes + streams   | Supported    | Full surface | the streamed-table registry                                                                                                                                                                                                                                                                                    |
| Query (GSI)                                                                 | Indexes + streams   | Supported    | Most usage   | each global secondary index is a dedicated Azure-maintained index container, so a GSI query reads its own index rather than scanning the table; propagation is eventually consistent, matching DynamoDB's own GSI behavior, and a strongly-consistent read on a GSI is rejected exactly as DynamoDB rejects it |
| Query (LSI)                                                                 | Indexes + streams   | Supported    | Most usage   | a local secondary index shares the table's own container and partition route, so an LSI query reflects a write immediately; large index partitions are subject to a per-query candidate limit                                                                                                                  |
| S3 import/export + Kinesis streaming + ContributorInsights + ResourcePolicy | Out of scope        | Out of scope | Full surface | These AWS integrations are outside the listed mapping.                                                                                                                                                                                                                                                         |
| BatchExecuteStatement                                                       | PartiQL             | Partial      | Most usage   | batched PartiQL statements, each statement gets its own real outcome                                                                                                                                                                                                                                           |
| ExecuteStatement                                                            | PartiQL             | Partial      | Most usage   | PartiQL select/insert/update/delete compiled to the native Cosmos query / item path; some PartiQL functions differ                                                                                                                                                                                             |
| ExecuteTransaction                                                          | PartiQL             | Out of scope | Most usage   | transactional PartiQL is unavailable on the current Cosmos adapter                                                                                                                                                                                                                                             |
| BatchGetItem                                                                | Reads               | Supported    | Most usage   | the adapter executes each item operation and reports its result                                                                                                                                                                                                                                                |
| BatchWriteItem                                                              | Reads               | Supported    | Most usage   | the adapter executes each item operation and reports its result                                                                                                                                                                                                                                                |
| Query                                                                       | Reads               | Partial      | Common       | native key/range/order/filter pushdown plus residual evaluation; pagination follows Cosmos result windows                                                                                                                                                                                                      |
| Scan                                                                        | Reads               | Partial      | Most usage   | bounded native result windows; Limit and ScannedCount differ from DynamoDB pre-filter examined-item accounting                                                                                                                                                                                                 |
| DeleteItem                                                                  | Single item         | Supported    | Common       | -                                                                                                                                                                                                                                                                                                              |
| GetItem                                                                     | Single item         | Supported    | Common       | strongly consistent from any instance, whatever the ConsistentRead flag (never weaker than asked)                                                                                                                                                                                                              |
| PutItem                                                                     | Single item         | Supported    | Common       | DynamoDB type tags preserved; native Cosmos numbers require at most 15 significant digits and representable range                                                                                                                                                                                              |
| UpdateItem                                                                  | Single item         | Supported    | Common       | eligible removals use native conditional PATCH; ordinary updates run in a partition-scoped stored procedure; other shapes use guarded read-modify-write                                                                                                                                                        |
| DescribeTimeToLive                                                          | TTL                 | Supported    | Most usage   | reads the container's TTL policy                                                                                                                                                                                                                                                                               |
| UpdateTimeToLive                                                            | TTL                 | Supported    | Most usage   | the DynamoDB per-item TTL attribute is mapped to the Cosmos TTL policy                                                                                                                                                                                                                                         |
| CreateTable                                                                 | Table control plane | Supported    | Most usage   | registers a logical table in a deployed container; declared tables receive containers at compile time                                                                                                                                                                                                          |
| DeleteTable                                                                 | Table control plane | Supported    | Most usage   | logical generation change with bounded cleanup and metadata propagation                                                                                                                                                                                                                                        |
| DescribeEndpoints                                                           | Table control plane | Supported    | Full surface | returns the adapter endpoint                                                                                                                                                                                                                                                                                   |
| DescribeLimits                                                              | Table control plane | Supported    | Full surface | account / table limits reported from the compiled config                                                                                                                                                                                                                                                       |
| DescribeTable                                                               | Table control plane | Supported    | Most usage   | returns the key schema and stream identifiers                                                                                                                                                                                                                                                                  |
| ListTables                                                                  | Table control plane | Supported    | Most usage   | -                                                                                                                                                                                                                                                                                                              |
| UpdateTable                                                                 | Table control plane | Supported    | Most usage   | index and stream definitions must match deployed configuration; throughput mode is selected at compile time                                                                                                                                                                                                    |
| ListTagsOfResource                                                          | Tags                | Supported    | Full surface | -                                                                                                                                                                                                                                                                                                              |
| TagResource                                                                 | Tags                | Supported    | Full surface | -                                                                                                                                                                                                                                                                                                              |
| UntagResource                                                               | Tags                | Supported    | Full surface | -                                                                                                                                                                                                                                                                                                              |
| TransactGetItems                                                            | Transactions        | Out of scope | Most usage   | the current Cosmos adapter rejects DynamoDB transactional reads                                                                                                                                                                                                                                                |
| TransactWriteItems                                                          | Transactions        | Out of scope | Most usage   | the current Cosmos adapter rejects DynamoDB multi-item transactions                                                                                                                                                                                                                                            |

#### How it works

Tensor9 runs a DynamoDB adapter beside your application in the customer's environment. It configures `AWS_ENDPOINT_URL_DYNAMODB` to send the AWS SDK's requests to the adapter over the local loopback network. Your SDK and application code stay unchanged. The adapter accepts DynamoDB requests and data types, returns DynamoDB responses and errors, and stores data in Azure Cosmos DB.

The adapter maps DynamoDB items and supported operations onto Cosmos documents. Native numeric precision, result pagination and transaction support differ from DynamoDB; the following sections describe those application-visible limits.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogaW4gdGhlIHRhcmdldCBjbG91ZCB0aGUgc2FtZSBhcHBsaWNhdGlvbiBhbmQgU0RLIGNhbGwgYSBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgRHluYW1vREIgQVBJIGZyb20gQXp1cmUgQ29zbW9zIERCLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYWgxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDYiIHdpZHRoPSIzNTgiIGhlaWdodD0iMTE4IiByeD0iMTQiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMCIgeT0iNjQiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiM5NGEzYjgiPk9OIEFXUyBUT0RBWTwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjgwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iOTAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMi41cHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI5MCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+RHluYW1vREIgU0RLPC90ZXh0Pgo8bGluZSB4MT0iMTUwIiB5MT0iMTEzIiB4Mj0iMjEwIiB5Mj0iMTEzIiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhaDEpIi8+Cjx0ZXh0IHg9IjE4MSIgeT0iMTA0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+CjxyZWN0IHg9IjIxNCIgeT0iODAiIHdpZHRoPSIxNDgiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyODgiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPkFtYXpvbiBEeW5hbW9EQjwvdGV4dD4KPHRleHQgeD0iMjg4IiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5BV1MtbWFuYWdlZDwvdGV4dD4KPGxpbmUgeDE9IjQxOCIgeTE9IjQwIiB4Mj0iNDE4IiB5Mj0iMTYwIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS40Ii8+CjxyZWN0IHg9IjQ2MiIgeT0iNDYiIHdpZHRoPSIzNjIiIGhlaWdodD0iMTE4IiByeD0iMTQiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSI0NzYiIHk9IjY0IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojMDQ3ODU3Ij5PTiBUSEUgVEFSR0VUIENMT1VEPC90ZXh0Pgo8cmVjdCB4PSI0NzQiIHk9IjgwIiB3aWR0aD0iOTIiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5Zb3VyIGFwcDwvdGV4dD4KPHRleHQgeD0iNTIwIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA1OTY2OSI+c2FtZSBTREs8L3RleHQ+CjxsaW5lIHgxPSI1NjYiIHkxPSIxMTMiIHgyPSI1OTAiIHkyPSIxMTMiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2FoMSkiLz4KPHJlY3QgeD0iNTk0IiB5PSI3NiIgd2lkdGg9IjExMCIgaGVpZ2h0PSI3NCIgcng9IjExIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjY0OSIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEycHgiPlRlbnNvcjk8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5zZXJ2aWNlPC90ZXh0Pgo8dGV4dCB4PSI2NDkiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+YWRhcHRlcjwvdGV4dD4KPGxpbmUgeDE9IjcwNCIgeTE9IjExMyIgeDI9IjcyOCIgeTI9IjExMyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYWgxKSIvPgo8cmVjdCB4PSI3MzIiIHk9IjgwIiB3aWR0aD0iODQiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI3NzQiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMXB4Ij5Db3Ntb3MgREI8L3RleHQ+Cjx0ZXh0IHg9Ijc3NCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+Q29yZSBTUUw8L3RleHQ+Cjwvc3ZnPg==" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: in the target cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from Azure Cosmos DB." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogaW4gdGhlIHRhcmdldCBjbG91ZCB0aGUgc2FtZSBhcHBsaWNhdGlvbiBhbmQgU0RLIGNhbGwgYSBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgRHluYW1vREIgQVBJIGZyb20gQXp1cmUgQ29zbW9zIERCLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYWgxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDYiIHdpZHRoPSIzNTgiIGhlaWdodD0iMTE4IiByeD0iMTQiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMCIgeT0iNjQiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTRhM2I4Ij5PTiBBV1MgVE9EQVk8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI4MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjkwIiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTIuNXB4Ij5Zb3VyIGFwcDwvdGV4dD4KPHRleHQgeD0iOTAiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkR5bmFtb0RCIFNESzwvdGV4dD4KPGxpbmUgeDE9IjE1MCIgeTE9IjExMyIgeDI9IjIxMCIgeTI9IjExMyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYWgxKSIvPgo8dGV4dCB4PSIxODEiIHk9IjEwNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo4LjVweCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8cmVjdCB4PSIyMTQiIHk9IjgwIiB3aWR0aD0iMTQ4IiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjg4IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5BbWF6b24gRHluYW1vREI8L3RleHQ+Cjx0ZXh0IHg9IjI4OCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+QVdTLW1hbmFnZWQ8L3RleHQ+CjxsaW5lIHgxPSI0MTgiIHkxPSI0MCIgeDI9IjQxOCIgeTI9IjE2MCIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8cmVjdCB4PSI0NjIiIHk9IjQ2IiB3aWR0aD0iMzYyIiBoZWlnaHQ9IjExOCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDc2IiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPk9OIFRIRSBUQVJHRVQgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjQ3NCIgeT0iODAiIHdpZHRoPSI5MiIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyMCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEycHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI1MjAiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM2Ij5zYW1lIFNESzwvdGV4dD4KPGxpbmUgeDE9IjU2NiIgeTE9IjExMyIgeDI9IjU5MCIgeTI9IjExMyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYWgxKSIvPgo8cmVjdCB4PSI1OTQiIHk9Ijc2IiB3aWR0aD0iMTEwIiBoZWlnaHQ9Ijc0IiByeD0iMTEiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iNjQ5IiB5PSIxMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTJweCI+VGVuc29yOTwvdGV4dD4KPHRleHQgeD0iNjQ5IiB5PSIxMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnNlcnZpY2U8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5hZGFwdGVyPC90ZXh0Pgo8bGluZSB4MT0iNzA0IiB5MT0iMTEzIiB4Mj0iNzI4IiB5Mj0iMTEzIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhaDEpIi8+CjxyZWN0IHg9IjczMiIgeT0iODAiIHdpZHRoPSI4NCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijc3NCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExcHgiPkNvc21vcyBEQjwvdGV4dD4KPHRleHQgeD0iNzc0IiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5Db3JlIFNRTDwvdGV4dD4KPC9zdmc+" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: in the target cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from Azure Cosmos DB." />
</div>

<p className="t9-caption">Your application uses the DynamoDB API through an adapter in the customer environment.</p>

#### Architecture

The adapter parses DynamoDB requests and expressions, executes Cosmos operations and returns DynamoDB responses. Durable item and registry state lives in Cosmos, and requests use the customer's workload identity. Adapter instances can restart without recovering local data; stream-enabled tables still require one active writer.

Tensor9 provisions one Cosmos account and one `ddb` database per stack, with a container for each declared table. The selected target sets provisioned or serverless throughput for the account. Items use table-prefixed partition keys; a reserved `_tablemeta` partition stores the schemas and creation times. Tables created at runtime share an existing container, as described below. LSIs share the source container; the provisioned target uses separate, asynchronously maintained GSI containers.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBcmNoaXRlY3R1cmU6IHRoZSBhcHAncyBEeW5hbW9EQiBTREsgY2FsbHMgYSBzdGF0ZWxlc3MgUnVzdCBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgQVBJIGZyb20gQXp1cmUgQ29zbW9zIERCLiBDb3Ntb3MgaG9sZHMgYWxsIHN0YXRlOiB0aGUgc3RhY2sgc2hhcmVzIG9uZSBhY2NvdW50IHdpdGggb25lIGRhdGFiYXNlIG5hbWVkIGRkYiwgZWFjaCBkZWNsYXJlZCB0YWJsZSBoYXMgaXRzIG93biBjb250YWluZXIgaW5zaWRlIGl0IHBhcnRpdGlvbmVkIG9uIGEgc3ludGhlc2l6ZWQgcGFydGl0aW9uLWtleSBwYXRoLCB3aXRoIGl0ZW1zIGluIHRhYmxlLXByZWZpeGVkIGxvZ2ljYWwgcGFydGl0aW9ucywgYSByZWdpc3RyeSBwYXJ0aXRpb24sIGEgZGVkaWNhdGVkIEF6dXJlLW1haW50YWluZWQgaW5kZXggY29udGFpbmVyIHBlciBnbG9iYWwgc2Vjb25kYXJ5IGluZGV4LCBhbmQgYSBsb2NhbCBzZWNvbmRhcnkgaW5kZXggaW5zaWRlIHRoZSB0YWJsZSdzIG93biBjb250YWluZXIuIFJ1bnRpbWUtY3JlYXRlZCB0YWJsZXMgc2hhcmUgYSBkZXBsb3llZCBjb250YWluZXIgYW5kIGl0cyBjYXBhY2l0eS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImFyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSI4IiB5PSIzNCIgd2lkdGg9IjgyMCIgaGVpZ2h0PSIyMDgiIHJ4PSIxNiIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjI2IiB5PSI1NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkNVU1RPTUVSJ1MgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxMTAiIHdpZHRoPSIxMTQiIGhlaWdodD0iOTIiIHJ4PSIxMiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI4MyIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEzcHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTY4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+RHluYW1vREIgU0RLPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNTk2NjkiPnVuY2hhbmdlZDwvdGV4dD4KPGxpbmUgeDE9IjE0MCIgeTE9IjE1NiIgeDI9IjE5MiIgeTI9IjE1NiIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYXIpIi8+Cjx0ZXh0IHg9IjE2NiIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+CjxyZWN0IHg9IjE5NiIgeT0iMTIyIiB3aWR0aD0iMTY4IiBoZWlnaHQ9IjY4IiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iMjgwIiB5PSIxNTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTNweCI+YWRhcHRlcjwvdGV4dD4KPHRleHQgeD0iMjgwIiB5PSIxNjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPnN0YXRlbGVzcyDCtyBSdXN0PC90ZXh0Pgo8bGluZSB4MT0iMzY0IiB5MT0iMTU2IiB4Mj0iNDM2IiB5Mj0iMTU2IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhcikiLz4KPHRleHQgeD0iNDAwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiIj5Db3Ntb3MgU1FMPC90ZXh0Pgo8dGV4dCB4PSI0MDAiIHk9IjE3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPmtleWxlc3M8L3RleHQ+CjxyZWN0IHg9IjQ0MCIgeT0iNzgiIHdpZHRoPSIzNzIiIGhlaWdodD0iMTU2IiByeD0iMTMiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iNjI2IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMi41cHgiPkF6dXJlIENvc21vcyBEQiDCtyB0aGUgc3RhY2sncyBhY2NvdW50PC90ZXh0Pgo8dGV4dCB4PSI2MjYiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6IzY0NzQ4YiI+ImRkYiIgwrcgY29udGFpbmVyIHBlciBkZWNsYXJlZCB0YWJsZTwvdGV4dD4KPHJlY3QgeD0iNDU0IiB5PSIxMjAiIHdpZHRoPSIyMzAiIGhlaWdodD0iMTA0IiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNTY5IiB5PSIxMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMDtmaWxsOiM0NzU1NjkiPnRoZSB0YWJsZSdzIGNvbnRhaW5lcjwvdGV4dD4KPHRleHQgeD0iNTY5IiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjEwcHggJ1NGIE1vbm8nLE1lbmxvLG1vbm9zcGFjZTtmaWxsOiM2NDc0OGIiPnBhcnRpdGlvbmVkIG9uIC9fcGs8L3RleHQ+CjxyZWN0IHg9IjQ2NiIgeT0iMTUzIiB3aWR0aD0iMjA2IiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIi8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTY3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDojNDc1NTY5Ij5vcmRlcnN8dSM0MiAg4oaSICBpdGVtczwvdGV4dD4KPHJlY3QgeD0iNDY2IiB5PSIxNzciIHdpZHRoPSIyMDYiIGhlaWdodD0iMjAiIHJ4PSI1IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iNTY5IiB5PSIxOTEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjEwcHggJ1NGIE1vbm8nLE1lbmxvLG1vbm9zcGFjZTtmaWxsOiM0NzU1NjkiPm9yZGVyc3x1Izg4ICDihpIgIGl0ZW1zPC90ZXh0Pgo8cmVjdCB4PSI0NjYiIHk9IjIwMSIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSI1NjkiIHk9IjIxNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6IzQ3NTU2OSI+X3RhYmxlbWV0YSAg4oaSICByZWdpc3RyeTwvdGV4dD4KPHJlY3QgeD0iNjk2IiB5PSIxMjAiIHdpZHRoPSIxMDIiIGhlaWdodD0iMTA0IiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNzQ3IiB5PSIxNTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMDtmaWxsOiM0NzU1NjkiPm5hdGl2ZTwvdGV4dD4KPHRleHQgeD0iNzQ3IiB5PSIxNjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMDtmaWxsOiM0NzU1NjkiPmluZGV4PC90ZXh0Pgo8dGV4dCB4PSI3NDciIHk9IjE4NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnBlciBHU0ksPC90ZXh0Pgo8dGV4dCB4PSI3NDciIHk9IjIwMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmV2ZW50dWFsPC90ZXh0Pgo8L3N2Zz4=" alt="Architecture: the app's DynamoDB SDK calls a stateless Rust Tensor9 adapter, which serves the API from Azure Cosmos DB. Cosmos holds all state: the stack shares one account with one database named ddb, each declared table has its own container inside it partitioned on a synthesized partition-key path, with items in table-prefixed logical partitions, a registry partition, a dedicated Azure-maintained index container per global secondary index, and a local secondary index inside the table's own container. Runtime-created tables share a deployed container and its capacity." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBcmNoaXRlY3R1cmU6IHRoZSBhcHAncyBEeW5hbW9EQiBTREsgY2FsbHMgYSBzdGF0ZWxlc3MgUnVzdCBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgQVBJIGZyb20gQXp1cmUgQ29zbW9zIERCLiBDb3Ntb3MgaG9sZHMgYWxsIHN0YXRlOiB0aGUgc3RhY2sgc2hhcmVzIG9uZSBhY2NvdW50IHdpdGggb25lIGRhdGFiYXNlIG5hbWVkIGRkYiwgZWFjaCBkZWNsYXJlZCB0YWJsZSBoYXMgaXRzIG93biBjb250YWluZXIgaW5zaWRlIGl0IHBhcnRpdGlvbmVkIG9uIGEgc3ludGhlc2l6ZWQgcGFydGl0aW9uLWtleSBwYXRoLCB3aXRoIGl0ZW1zIGluIHRhYmxlLXByZWZpeGVkIGxvZ2ljYWwgcGFydGl0aW9ucywgYSByZWdpc3RyeSBwYXJ0aXRpb24sIGEgZGVkaWNhdGVkIEF6dXJlLW1haW50YWluZWQgaW5kZXggY29udGFpbmVyIHBlciBnbG9iYWwgc2Vjb25kYXJ5IGluZGV4LCBhbmQgYSBsb2NhbCBzZWNvbmRhcnkgaW5kZXggaW5zaWRlIHRoZSB0YWJsZSdzIG93biBjb250YWluZXIuIFJ1bnRpbWUtY3JlYXRlZCB0YWJsZXMgc2hhcmUgYSBkZXBsb3llZCBjb250YWluZXIgYW5kIGl0cyBjYXBhY2l0eS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImFyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSI4IiB5PSIzNCIgd2lkdGg9IjgyMCIgaGVpZ2h0PSIyMDgiIHJ4PSIxNiIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjI2IiB5PSI1NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkNVU1RPTUVSJ1MgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxMTAiIHdpZHRoPSIxMTQiIGhlaWdodD0iOTIiIHJ4PSIxMiIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI4MyIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEzcHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTY4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+RHluYW1vREIgU0RLPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzYiPnVuY2hhbmdlZDwvdGV4dD4KPGxpbmUgeDE9IjE0MCIgeTE9IjE1NiIgeDI9IjE5MiIgeTI9IjE1NiIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYXIpIi8+Cjx0ZXh0IHg9IjE2NiIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjguNXB4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+CjxyZWN0IHg9IjE5NiIgeT0iMTIyIiB3aWR0aD0iMTY4IiBoZWlnaHQ9IjY4IiByeD0iMTIiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iMjgwIiB5PSIxNTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTNweCI+YWRhcHRlcjwvdGV4dD4KPHRleHQgeD0iMjgwIiB5PSIxNjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnN0YXRlbGVzcyDCtyBSdXN0PC90ZXh0Pgo8bGluZSB4MT0iMzY0IiB5MT0iMTU2IiB4Mj0iNDM2IiB5Mj0iMTU2IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhcikiLz4KPHRleHQgeD0iNDAwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5Db3Ntb3MgU1FMPC90ZXh0Pgo8dGV4dCB4PSI0MDAiIHk9IjE3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPmtleWxlc3M8L3RleHQ+CjxyZWN0IHg9IjQ0MCIgeT0iNzgiIHdpZHRoPSIzNzIiIGhlaWdodD0iMTU2IiByeD0iMTMiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iNjI2IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMi41cHgiPkF6dXJlIENvc21vcyBEQiDCtyB0aGUgc3RhY2sncyBhY2NvdW50PC90ZXh0Pgo8dGV4dCB4PSI2MjYiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6ICNjOWNmZDgiPiJkZGIiIMK3IGNvbnRhaW5lciBwZXIgZGVjbGFyZWQgdGFibGU8L3RleHQ+CjxyZWN0IHg9IjQ1NCIgeT0iMTIwIiB3aWR0aD0iMjMwIiBoZWlnaHQ9IjEwNCIgcng9IjEwIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXdlaWdodDo3MDA7ZmlsbDogI2M5Y2ZkOCI+dGhlIHRhYmxlJ3MgY29udGFpbmVyPC90ZXh0Pgo8dGV4dCB4PSI1NjkiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6ICNjOWNmZDgiPnBhcnRpdGlvbmVkIG9uIC9fcGs8L3RleHQ+CjxyZWN0IHg9IjQ2NiIgeT0iMTUzIiB3aWR0aD0iMjA2IiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTY3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDogI2M5Y2ZkOCI+b3JkZXJzfHUjNDIgIOKGkiAgaXRlbXM8L3RleHQ+CjxyZWN0IHg9IjQ2NiIgeT0iMTc3IiB3aWR0aD0iMjA2IiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTkxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDogI2M5Y2ZkOCI+b3JkZXJzfHUjODggIOKGkiAgaXRlbXM8L3RleHQ+CjxyZWN0IHg9IjQ2NiIgeT0iMjAxIiB3aWR0aD0iMjA2IiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjU2OSIgeT0iMjE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDogI2M5Y2ZkOCI+X3RhYmxlbWV0YSAg4oaSICByZWdpc3RyeTwvdGV4dD4KPHJlY3QgeD0iNjk2IiB5PSIxMjAiIHdpZHRoPSIxMDIiIGhlaWdodD0iMTA0IiByeD0iMTAiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNzQ3IiB5PSIxNTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMDtmaWxsOiAjYzljZmQ4Ij5uYXRpdmU8L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTY2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXdlaWdodDo3MDA7ZmlsbDogI2M5Y2ZkOCI+aW5kZXg8L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTg3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cGVyIEdTSSw8L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMjAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+ZXZlbnR1YWw8L3RleHQ+Cjwvc3ZnPg==" alt="Architecture: the app's DynamoDB SDK calls a stateless Rust Tensor9 adapter, which serves the API from Azure Cosmos DB. Cosmos holds all state: the stack shares one account with one database named ddb, each declared table has its own container inside it partitioned on a synthesized partition-key path, with items in table-prefixed logical partitions, a registry partition, a dedicated Azure-maintained index container per global secondary index, and a local secondary index inside the table's own container. Runtime-created tables share a deployed container and its capacity." />
</div>

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgQ29zbW9zIHBoeXNpY2FsIHBsYW4sIHdoaWNoIGV4ZWN1dGVzIGFzIGEgcG9pbnQgcmVhZCwgYSBDb3Ntb3MgU1FMIHF1ZXJ5LCBhIG5hdGl2ZSBQQVRDSCBvciBhIHN0b3JlZCBwcm9jZWR1cmUuIENvc21vcyBob2xkcyBhIGNvbnRhaW5lciBwZXIgZGVjbGFyZWQgdGFibGUsIHBhcnRpdGlvbmVkIG9uIGEgc3ludGhlc2l6ZWQgcGFydGl0aW9uLWtleSBwYXRoLCB3aXRoIGFuIEF6dXJlLW1haW50YWluZWQgaW5kZXggY29udGFpbmVyIHBlciBnbG9iYWwgc2Vjb25kYXJ5IGluZGV4LiBSdW50aW1lLWNyZWF0ZWQgdGFibGVzIHNoYXJlIGEgZGVwbG95ZWQgY29udGFpbmVyIGFuZCBpdHMgY2FwYWNpdHkuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPgo8bWFya2VyIGlkPSJhY3gxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImFjeDIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwNTk2NjkiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDAiIHdpZHRoPSIzOTIiIGhlaWdodD0iMTQwIiByeD0iMTQiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMiIgeT0iMzAiIGZpbGw9IiMxNTgwM2QiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5USEUgQURBUFRFUjwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI4MyIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiIj5EeW5hbW9EQiBBUEk8L3RleHQ+Cjx0ZXh0IHg9IjgzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnRoZSByZXF1ZXN0PC90ZXh0Pgo8bGluZSB4MT0iMTM2IiB5MT0iODciIHgyPSIxNTgiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhY3gyKSIvPgo8cmVjdCB4PSIxNjQiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIyMTciIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+TG9naWNhbCBwbGFuPC90ZXh0Pgo8dGV4dCB4PSIyMTciIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+YmFja2VuZC1uZXV0cmFsPC90ZXh0Pgo8bGluZSB4MT0iMjcwIiB5MT0iODciIHgyPSIyOTIiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhY3gyKSIvPgo8cmVjdCB4PSIyOTgiIHk9IjY0IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMzRkMzk5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIzNDgiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+UGh5c2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMzQ4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkNvc21vcy1zcGVjaWZpYzwvdGV4dD4KPHRleHQgeD0iMjEyIiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5hIHBvaW50IHJlYWQsIGEgU1FMIHF1ZXJ5LCBhIFBBVENIIG9yIGEgc3RvcmVkIHByb2NlZHVyZTwvdGV4dD4KPGxpbmUgeDE9IjQxMiIgeTE9Ijg3IiB4Mj0iNDUyIiB5Mj0iODciIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYWN4MSkiLz4KPHJlY3QgeD0iNDU4IiB5PSI0MCIgd2lkdGg9IjM2MiIgaGVpZ2h0PSIxNDAiIHJ4PSIxNCIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjQ3NCIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5BWlVSRSBDT1NNT1MgREI8L3RleHQ+CjxyZWN0IHg9IjQ3NiIgeT0iNjQiIHdpZHRoPSIxNTAiIGhlaWdodD0iNDQiIHJ4PSI5IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjU1MSIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiIj5EZWNsYXJlZCB0YWJsZSBjb250YWluZXI8L3RleHQ+Cjx0ZXh0IHg9IjU1MSIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5wYXJ0aXRpb25lZCBvbiAvX3BrPC90ZXh0Pgo8cmVjdCB4PSI2NDIiIHk9IjY0IiB3aWR0aD0iMTYyIiBoZWlnaHQ9IjQ0IiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI3MjMiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+TmF0aXZlIGluZGV4IHBlciBHU0k8L3RleHQ+Cjx0ZXh0IHg9IjcyMyIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5BenVyZS1tYWludGFpbmVkPC90ZXh0Pgo8dGV4dCB4PSI2MzkiIHk9IjE0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9uZSBkZGIgZGF0YWJhc2UgZm9yIHRoZSBzdGFjazwvdGV4dD4KPC9zdmc+" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Cosmos physical plan, which executes as a point read, a Cosmos SQL query, a native PATCH or a stored procedure. Cosmos holds a container per declared table, partitioned on a synthesized partition-key path, with an Azure-maintained index container per global secondary index. Runtime-created tables share a deployed container and its capacity." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgQ29zbW9zIHBoeXNpY2FsIHBsYW4sIHdoaWNoIGV4ZWN1dGVzIGFzIGEgcG9pbnQgcmVhZCwgYSBDb3Ntb3MgU1FMIHF1ZXJ5LCBhIG5hdGl2ZSBQQVRDSCBvciBhIHN0b3JlZCBwcm9jZWR1cmUuIENvc21vcyBob2xkcyBhIGNvbnRhaW5lciBwZXIgZGVjbGFyZWQgdGFibGUsIHBhcnRpdGlvbmVkIG9uIGEgc3ludGhlc2l6ZWQgcGFydGl0aW9uLWtleSBwYXRoLCB3aXRoIGFuIEF6dXJlLW1haW50YWluZWQgaW5kZXggY29udGFpbmVyIHBlciBnbG9iYWwgc2Vjb25kYXJ5IGluZGV4LiBSdW50aW1lLWNyZWF0ZWQgdGFibGVzIHNoYXJlIGEgZGVwbG95ZWQgY29udGFpbmVyIGFuZCBpdHMgY2FwYWNpdHkuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPgo8bWFya2VyIGlkPSJhY3gxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjOTRhM2I4Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImFjeDIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMyMGY3YjQiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDAiIHdpZHRoPSIzOTIiIGhlaWdodD0iMTQwIiByeD0iMTQiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMiIgeT0iMzAiIGZpbGw9IiMzOWRlNzciIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5USEUgQURBUFRFUjwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI4MyIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+Cjx0ZXh0IHg9IjgzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnRoZSByZXF1ZXN0PC90ZXh0Pgo8bGluZSB4MT0iMTM2IiB5MT0iODciIHgyPSIxNTgiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhY3gyKSIvPgo8cmVjdCB4PSIxNjQiIHk9IjY0IiB3aWR0aD0iMTA2IiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIyMTciIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+TG9naWNhbCBwbGFuPC90ZXh0Pgo8dGV4dCB4PSIyMTciIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+YmFja2VuZC1uZXV0cmFsPC90ZXh0Pgo8bGluZSB4MT0iMjcwIiB5MT0iODciIHgyPSIyOTIiIHkyPSI4NyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhY3gyKSIvPgo8cmVjdCB4PSIyOTgiIHk9IjY0IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQ2IiByeD0iOSIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMzRkMzk5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIzNDgiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+UGh5c2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMzQ4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkNvc21vcy1zcGVjaWZpYzwvdGV4dD4KPHRleHQgeD0iMjEyIiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5hIHBvaW50IHJlYWQsIGEgU1FMIHF1ZXJ5LCBhIFBBVENIIG9yIGEgc3RvcmVkIHByb2NlZHVyZTwvdGV4dD4KPGxpbmUgeDE9IjQxMiIgeTE9Ijg3IiB4Mj0iNDUyIiB5Mj0iODciIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYWN4MSkiLz4KPHJlY3QgeD0iNDU4IiB5PSI0MCIgd2lkdGg9IjM2MiIgaGVpZ2h0PSIxNDAiIHJ4PSIxNCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjQ3NCIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5BWlVSRSBDT1NNT1MgREI8L3RleHQ+CjxyZWN0IHg9IjQ3NiIgeT0iNjQiIHdpZHRoPSIxNTAiIGhlaWdodD0iNDQiIHJ4PSI5IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjU1MSIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5EZWNsYXJlZCB0YWJsZSBjb250YWluZXI8L3RleHQ+Cjx0ZXh0IHg9IjU1MSIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5wYXJ0aXRpb25lZCBvbiAvX3BrPC90ZXh0Pgo8cmVjdCB4PSI2NDIiIHk9IjY0IiB3aWR0aD0iMTYyIiBoZWlnaHQ9IjQ0IiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI3MjMiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+TmF0aXZlIGluZGV4IHBlciBHU0k8L3RleHQ+Cjx0ZXh0IHg9IjcyMyIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5BenVyZS1tYWludGFpbmVkPC90ZXh0Pgo8dGV4dCB4PSI2MzkiIHk9IjE0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9uZSBkZGIgZGF0YWJhc2UgZm9yIHRoZSBzdGFjazwvdGV4dD4KPC9zdmc+" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Cosmos physical plan, which executes as a point read, a Cosmos SQL query, a native PATCH or a stored procedure. Cosmos holds a container per declared table, partitioned on a synthesized partition-key path, with an Azure-maintained index container per global secondary index. Runtime-created tables share a deployed container and its capacity." />
</div>

<p className="t9-caption">A stateless Rust adapter serves the DynamoDB API in front of Cosmos. One account and one "ddb" database hold a container per declared table, partitioned on /\_pk. Runtime-created tables share a deployed container and its capacity.</p>

<p className="t9-caption">The adapter first builds a storage-independent request plan, then converts it to a Cosmos-specific plan for execution. Each declared table has its own container; runtime-created tables share a deployed container and its capacity.</p>

#### Schemas

The adapter preserves DynamoDB type tags inside the `item` envelope. Accepted numbers are stored as native Cosmos JSON numbers; binary payloads use order-preserving hex. Keys and routing fields identify the logical table and partition.

**Numeric precision differs:** values must have at most 15 significant digits and fit the native numeric range. Values outside this supported representation fail validation before storage; the adapter does not preserve DynamoDB's full 38-digit numeric domain as decimal strings.

**Items remain limited to 400 KiB.** Updates check the resulting item, including projected local-index entries where applicable. A larger Cosmos document limit does not disable this DynamoDB compatibility check.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJEeW5hbW9EQiB0eXBlIHRhZ3MgcmVtYWluIGluIGEgQ29zbW9zIGRvY3VtZW50IGVudmVsb3BlLiBBY2NlcHRlZCBudW1lcmljIHBheWxvYWRzIGFyZSBuYXRpdmUgSlNPTiBudW1iZXJzLCBhZnRlciBwcmVjaXNpb24gYW5kIHJhbmdlIHZhbGlkYXRpb24uIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImEzIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwNTk2NjkiLz48L21hcmtlcj48L2RlZnM+Cjx0ZXh0IHg9IjI2IiB5PSIzMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzY0NzQ4YiI+RFlOQU1PREIgSVRFTTwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQyIiB3aWR0aD0iMzAwIiBoZWlnaHQ9IjE4MCIgcng9IjEyIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjQ0IiB5PSI3NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+JiMxMjM7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iOTgiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPiJwayI6ICAgICYjMTIzOyAiUyI6ICJ1c2VyIzQyIiAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjYwIiB5PSIxMjIiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPiJzayI6ICAgICYjMTIzOyAiUyI6ICJvcmRlciM3IiAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjYwIiB5PSIxNDYiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiNiNDUzMDkiPiJ0b3RhbCI6ICYjMTIzOyAiTiI6ICIxMjMuNDUiICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9IjE3MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+InRhZ3MiOiAgJiMxMjM7ICJTUyI6IFsidmlwIl0gJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0NCIgeT0iMTk0IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4mIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjQ0IiB5PSIyMTQiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmaWxsOiNiNDUzMDkiPkFjY2VwdGVkIGhlcmU6IGF0IG1vc3QgMTUgc2lnbmlmaWNhbnQgZGlnaXRzPC90ZXh0Pgo8bGluZSB4MT0iMzM0IiB5MT0iMTMyIiB4Mj0iMzg2IiB5Mj0iMTMyIiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhMykiLz4KPHRleHQgeD0iMzYwIiB5PSIxMjMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+d3JhcDwvdGV4dD4KPHRleHQgeD0iMzk2IiB5PSIzMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzA0Nzg1NyI+Q09TTU9TIERPQ1VNRU5UIChyb3V0aW5nIGZpZWxkcyBvbWl0dGVkKTwvdGV4dD4KPHJlY3QgeD0iMzk2IiB5PSI0MiIgd2lkdGg9IjQxNCIgaGVpZ2h0PSIxOTgiIHJ4PSIxMiIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8dGV4dCB4PSI0MTQiIHk9IjY4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4mIzEyMzs8L3RleHQ+Cjx0ZXh0IHg9IjQzMCIgeT0iODgiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPiJpZCI6ICAgICAgICAicGs9Uzp1c2VyIzQyfHNrPVM6b3JkZXIjNyIsPC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9IjEwNyIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+Il9wayI6ICAgICAgICJvcmRlcnN8Uzp1c2VyIzQyIiw8L3RleHQ+Cjx0ZXh0IHg9IjQzMCIgeT0iMTI2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMDQ3ODU3Ij4iX3RibCI6ICAgICAgIm9yZGVycyIsPC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9IjE0NSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+Il9rZXlBdHRycyI6IFsicGsiLCJzayJdLDwvdGV4dD4KPHRleHQgeD0iNDMwIiB5PSIxNjQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPiJpdGVtIjogJiMxMjM7PC90ZXh0Pgo8dGV4dCB4PSI0NDYiIHk9IjE4MyIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6I2I0NTMwOSI+InRvdGFsIjogJiMxMjM7ICJOIjogMTIzLjQ1ICYjMTI1OywgIOKApjwvdGV4dD4KPHRleHQgeD0iNDMwIiB5PSIyMDIiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPiYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNDE0IiB5PSIyMjEiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPiYjMTI1OzwvdGV4dD4KPC9zdmc+" alt="DynamoDB type tags remain in a Cosmos document envelope. Accepted numeric payloads are native JSON numbers, after precision and range validation." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJEeW5hbW9EQiB0eXBlIHRhZ3MgcmVtYWluIGluIGEgQ29zbW9zIGRvY3VtZW50IGVudmVsb3BlLiBBY2NlcHRlZCBudW1lcmljIHBheWxvYWRzIGFyZSBuYXRpdmUgSlNPTiBudW1iZXJzLCBhZnRlciBwcmVjaXNpb24gYW5kIHJhbmdlIHZhbGlkYXRpb24uIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImEzIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMyMGY3YjQiLz48L21hcmtlcj48L2RlZnM+Cjx0ZXh0IHg9IjI2IiB5PSIzMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICNjOWNmZDgiPkRZTkFNT0RCIElURU08L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSI0MiIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxODAiIHJ4PSIxMiIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI0NCIgeT0iNzQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij4mIzEyMzs8L3RleHQ+Cjx0ZXh0IHg9IjYwIiB5PSI5OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiJwayI6ICAgICYjMTIzOyAiUyI6ICJ1c2VyIzQyIiAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjYwIiB5PSIxMjIiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij4ic2siOiAgICAmIzEyMzsgIlMiOiAib3JkZXIjNyIgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iMTQ2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2RlYjI5MCI+InRvdGFsIjogJiMxMjM7ICJOIjogIjEyMy40NSIgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iMTcwIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+InRhZ3MiOiAgJiMxMjM7ICJTUyI6IFsidmlwIl0gJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0NCIgeT0iMTk0IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+JiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0NCIgeT0iMjE0IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2RlYjI5MCI+QWNjZXB0ZWQgaGVyZTogYXQgbW9zdCAxNSBzaWduaWZpY2FudCBkaWdpdHM8L3RleHQ+CjxsaW5lIHgxPSIzMzQiIHkxPSIxMzIiIHgyPSIzODYiIHkyPSIxMzIiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2EzKSIvPgo8dGV4dCB4PSIzNjAiIHk9IjEyMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj53cmFwPC90ZXh0Pgo8dGV4dCB4PSIzOTYiIHk9IjMwIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogIzkwZGVjOCI+Q09TTU9TIERPQ1VNRU5UIChyb3V0aW5nIGZpZWxkcyBvbWl0dGVkKTwvdGV4dD4KPHJlY3QgeD0iMzk2IiB5PSI0MiIgd2lkdGg9IjQxNCIgaGVpZ2h0PSIxOTgiIHJ4PSIxMiIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8dGV4dCB4PSI0MTQiIHk9IjY4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+JiMxMjM7PC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9Ijg4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+ImlkIjogICAgICAgICJwaz1TOnVzZXIjNDJ8c2s9UzpvcmRlciM3Iiw8L3RleHQ+Cjx0ZXh0IHg9IjQzMCIgeT0iMTA3IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+Il9wayI6ICAgICAgICJvcmRlcnN8Uzp1c2VyIzQyIiw8L3RleHQ+Cjx0ZXh0IHg9IjQzMCIgeT0iMTI2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+Il90YmwiOiAgICAgICJvcmRlcnMiLDwvdGV4dD4KPHRleHQgeD0iNDMwIiB5PSIxNDUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij4iX2tleUF0dHJzIjogWyJwayIsInNrIl0sPC90ZXh0Pgo8dGV4dCB4PSI0MzAiIHk9IjE2NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiJpdGVtIjogJiMxMjM7PC90ZXh0Pgo8dGV4dCB4PSI0NDYiIHk9IjE4MyIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNkZWIyOTAiPiJ0b3RhbCI6ICYjMTIzOyAiTiI6IDEyMy40NSAmIzEyNTssICDigKY8L3RleHQ+Cjx0ZXh0IHg9IjQzMCIgeT0iMjAyIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+JiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9IjIyMSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiYjMTI1OzwvdGV4dD4KPC9zdmc+" alt="DynamoDB type tags remain in a Cosmos document envelope. Accepted numeric payloads are native JSON numbers, after precision and range validation." />
</div>

<p className="t9-caption">Type tags distinguish numbers, strings, binary values and sets; native payloads make predicates queryable in Cosmos.</p>

#### Where tables live

Each declared table has its own container, indexing policy and storage within the stack's shared account and database. Containers share account administration and lifecycle. Monitor account limits as the number of tables grows.

Choose provisioned or serverless throughput when selecting the target. Provisioned containers have an autoscale range of request units (RUs) derived from declared capacity; a `PAY_PER_REQUEST` source table gets a configurable default range. Serverless containers bill consumed requests and do not reserve the source table's requested capacity. Throughput depends on request-unit use and partition distribution. Changing the selected target recreates the account and containers, so plan a data migration.

Within a container, a table-prefixed partition key such as `orders|S:user#42` separates logical tables. Point reads and base queries use that `_pk` route; scans and registry reads filter on `_tbl`. Runtime `CreateTable` writes a registry document in the stack's first deployed container. Its data identity has no permission to provision Cosmos containers. `DescribeTable` and `ListTables` read that registry.

* **Key schema is required.** A composite-key table's key schema comes from a declared CreateTable, the registry doc, or is learned from the first key-bearing request. A Put that can't resolve its key schema is rejected outright, never written under a guessed key.
* **Declared tables are physically isolated; runtime-created tables are logically isolated.** A declared table's container (its throughput, its index, its storage) is its own. A table created at runtime shares a deployed container: its logical partitions are disjoint by table-prefixing, but physical partitions are shared. A hot logical partition remains bounded by the service capacity available to its physical partition.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBbGwgb2YgYSBzdGFjaydzIHRhYmxlcyBzaGFyZSBvbmUgQ29zbW9zIGFjY291bnQgd2l0aCBvbmUgZGF0YWJhc2UgbmFtZWQgZGRiOyBlYWNoIGRlY2xhcmVkIHRhYmxlIGtlZXBzIGl0cyBvd24gY29udGFpbmVyLCBpdHMgb3duIGluZGV4LCBhbmQgaXRzIG93biBzdG9yYWdlLiBUaGUgc2VsZWN0ZWQgdGFyZ2V0IHNldHMgdGhlIGFjY291bnQncyB0aHJvdWdocHV0IG1vZGUgZm9yIHRoZSBkZXBsb3ltZW50OiBwcm92aXNpb25lZCBnaXZlcyBlYWNoIGNvbnRhaW5lciBhIGRlZGljYXRlZCBhdXRvc2NhbGUgUlUgYmFuZCwgc2VydmVybGVzcyBtYWtlcyBpdCBhIGNvbnN1bXB0aW9uIGFjY291bnQgd2l0aCBubyBwcm92aXNpb25lZCBwZXItY29udGFpbmVyIHRocm91Z2hwdXQuIFJ1bnRpbWUtY3JlYXRlZCB0YWJsZXMgc2hhcmUgYSBkZXBsb3llZCBjb250YWluZXIgYW5kIGl0cyBjYXBhY2l0eS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPHRleHQgeD0iMjYiIHk9IjI4IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojMDQ3ODU3Ij5USEUgU1RBQ0snUyBDT1NNT1MgQUNDT1VOVCDCtyBkYXRhYmFzZSAiZGRiIjwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQwIiB3aWR0aD0iNTIwIiBoZWlnaHQ9IjE2NiIgcng9IjE0IiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+CjxyZWN0IHg9IjQ0IiB5PSI1OCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSIxMTgiIHJ4PSIxMCIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjYTdmM2QwIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIxMTkiIHk9IjgwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMDQ3ODU3Ij5jb250YWluZXI6IG9yZGVyczwvdGV4dD4KPHRleHQgeD0iMTE5IiB5PSIxMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5vd24gL19wayBwYXJ0aXRpb25zPC90ZXh0Pgo8dGV4dCB4PSIxMTkiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnRocm91Z2hwdXQgcGVyIG1vZGU8L3RleHQ+Cjx0ZXh0IHg9IjExOSIgeT0iMTM4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b3duIG5hdGl2ZSBpbmRleDwvdGV4dD4KPHRleHQgeD0iMTE5IiB5PSIxNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5fdGFibGVtZXRhIHJlZ2lzdHJ5PC90ZXh0Pgo8cmVjdCB4PSIyMDYiIHk9IjU4IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjExOCIgcng9IjEwIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjI4MSIgeT0iODAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTciPmNvbnRhaW5lcjogdXNlcnM8L3RleHQ+Cjx0ZXh0IHg9IjI4MSIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b3duIC9fcGsgcGFydGl0aW9uczwvdGV4dD4KPHRleHQgeD0iMjgxIiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj50aHJvdWdocHV0IHBlciBtb2RlPC90ZXh0Pgo8dGV4dCB4PSIyODEiIHk9IjEzOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm93biBuYXRpdmUgaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjI4MSIgeT0iMTYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+X3RhYmxlbWV0YSByZWdpc3RyeTwvdGV4dD4KPHJlY3QgeD0iMzY4IiB5PSI1OCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIxMTgiIHJ4PSIxMCIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjYTdmM2QwIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI0NDgiIHk9IjgwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMDQ3ODU3Ij5jb250YWluZXI6IGV2ZW50czwvdGV4dD4KPHRleHQgeD0iNDQ4IiB5PSIxMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5vd24gL19wayBwYXJ0aXRpb25zPC90ZXh0Pgo8dGV4dCB4PSI0NDgiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnRocm91Z2hwdXQgcGVyIG1vZGU8L3RleHQ+Cjx0ZXh0IHg9IjQ0OCIgeT0iMTM4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b3duIG5hdGl2ZSBpbmRleDwvdGV4dD4KPHRleHQgeD0iNDQ4IiB5PSIxNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5fdGFibGVtZXRhIHJlZ2lzdHJ5PC90ZXh0Pgo8dGV4dCB4PSIyODYiIHk9IjE5NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9uZSBzb3VyY2UgY29udGFpbmVyIHBlciBkZWNsYXJlZCB0YWJsZTwvdGV4dD4KPHRleHQgeD0iNTc2IiB5PSIyOCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzY0NzQ4YiI+QUNDT1VOVCBUSFJPVUdIUFVUIE1PREU8L3RleHQ+CjxyZWN0IHg9IjU3NiIgeT0iNDAiIHdpZHRoPSIyMzYiIGhlaWdodD0iMTY2IiByeD0iMTQiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjQgNCIvPgo8dGV4dCB4PSI2OTQiIHk9IjYyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZm9udC13ZWlnaHQ6NzAwO2ZpbGw6IzQ3NTU2OSI+b25lIG1vZGUgZm9yIHRoZSBkZXBsb3ltZW50PC90ZXh0Pgo8cmVjdCB4PSI1OTIiIHk9Ijc0IiB3aWR0aD0iMjA0IiBoZWlnaHQ9IjU2IiByeD0iOSIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjYTdmM2QwIiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8dGV4dCB4PSI2OTQiIHk9IjkzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMDQ3ODU3Ij46OnByb3Zpc2lvbmVkPC90ZXh0Pgo8dGV4dCB4PSI2OTQiIHk9IjEwOSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmVhY2ggY29udGFpbmVyIGEgZGVkaWNhdGVkPC90ZXh0Pgo8dGV4dCB4PSI2OTQiIHk9IjEyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmF1dG9zY2FsZSBSVSBiYW5kPC90ZXh0Pgo8cmVjdCB4PSI1OTIiIHk9IjEzOCIgd2lkdGg9IjIwNCIgaGVpZ2h0PSI2MCIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPHRleHQgeD0iNjk0IiB5PSIxNTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPjo6c2VydmVybGVzczwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSIxNzMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5jb25zdW1wdGlvbiBhY2NvdW50LCBubyBwZXItPC90ZXh0Pgo8dGV4dCB4PSI2OTQiIHk9IjE4NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmNvbnRhaW5lciB0aHJvdWdocHV0IHRvIHByb3Zpc2lvbjwvdGV4dD4KPC9zdmc+" alt="All of a stack's tables share one Cosmos account with one database named ddb; each declared table keeps its own container, its own index, and its own storage. The selected target sets the account's throughput mode for the deployment: provisioned gives each container a dedicated autoscale RU band, serverless makes it a consumption account with no provisioned per-container throughput. Runtime-created tables share a deployed container and its capacity." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBbGwgb2YgYSBzdGFjaydzIHRhYmxlcyBzaGFyZSBvbmUgQ29zbW9zIGFjY291bnQgd2l0aCBvbmUgZGF0YWJhc2UgbmFtZWQgZGRiOyBlYWNoIGRlY2xhcmVkIHRhYmxlIGtlZXBzIGl0cyBvd24gY29udGFpbmVyLCBpdHMgb3duIGluZGV4LCBhbmQgaXRzIG93biBzdG9yYWdlLiBUaGUgc2VsZWN0ZWQgdGFyZ2V0IHNldHMgdGhlIGFjY291bnQncyB0aHJvdWdocHV0IG1vZGUgZm9yIHRoZSBkZXBsb3ltZW50OiBwcm92aXNpb25lZCBnaXZlcyBlYWNoIGNvbnRhaW5lciBhIGRlZGljYXRlZCBhdXRvc2NhbGUgUlUgYmFuZCwgc2VydmVybGVzcyBtYWtlcyBpdCBhIGNvbnN1bXB0aW9uIGFjY291bnQgd2l0aCBubyBwcm92aXNpb25lZCBwZXItY29udGFpbmVyIHRocm91Z2hwdXQuIFJ1bnRpbWUtY3JlYXRlZCB0YWJsZXMgc2hhcmUgYSBkZXBsb3llZCBjb250YWluZXIgYW5kIGl0cyBjYXBhY2l0eS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPHRleHQgeD0iMjYiIHk9IjI4IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogIzkwZGVjOCI+VEhFIFNUQUNLJ1MgQ09TTU9TIEFDQ09VTlQgwrcgZGF0YWJhc2UgImRkYiI8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSI0MCIgd2lkdGg9IjUyMCIgaGVpZ2h0PSIxNjYiIHJ4PSIxNCIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8cmVjdCB4PSI0NCIgeT0iNTgiIHdpZHRoPSIxNTAiIGhlaWdodD0iMTE4IiByeD0iMTAiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNjY1MyIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMTE5IiB5PSI4MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICM5MGRlYzgiPmNvbnRhaW5lcjogb3JkZXJzPC90ZXh0Pgo8dGV4dCB4PSIxMTkiIHk9IjEwMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm93biAvX3BrIHBhcnRpdGlvbnM8L3RleHQ+Cjx0ZXh0IHg9IjExOSIgeT0iMTIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+dGhyb3VnaHB1dCBwZXIgbW9kZTwvdGV4dD4KPHRleHQgeD0iMTE5IiB5PSIxMzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5vd24gbmF0aXZlIGluZGV4PC90ZXh0Pgo8dGV4dCB4PSIxMTkiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPl90YWJsZW1ldGEgcmVnaXN0cnk8L3RleHQ+CjxyZWN0IHg9IjIwNiIgeT0iNTgiIHdpZHRoPSIxNTAiIGhlaWdodD0iMTE4IiByeD0iMTAiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNjY1MyIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMjgxIiB5PSI4MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICM5MGRlYzgiPmNvbnRhaW5lcjogdXNlcnM8L3RleHQ+Cjx0ZXh0IHg9IjI4MSIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+b3duIC9fcGsgcGFydGl0aW9uczwvdGV4dD4KPHRleHQgeD0iMjgxIiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij50aHJvdWdocHV0IHBlciBtb2RlPC90ZXh0Pgo8dGV4dCB4PSIyODEiIHk9IjEzOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm93biBuYXRpdmUgaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjI4MSIgeT0iMTYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+X3RhYmxlbWV0YSByZWdpc3RyeTwvdGV4dD4KPHJlY3QgeD0iMzY4IiB5PSI1OCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIxMTgiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q2NjUzIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI0NDgiIHk9IjgwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+Y29udGFpbmVyOiBldmVudHM8L3RleHQ+Cjx0ZXh0IHg9IjQ0OCIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+b3duIC9fcGsgcGFydGl0aW9uczwvdGV4dD4KPHRleHQgeD0iNDQ4IiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij50aHJvdWdocHV0IHBlciBtb2RlPC90ZXh0Pgo8dGV4dCB4PSI0NDgiIHk9IjEzOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm93biBuYXRpdmUgaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjQ0OCIgeT0iMTYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+X3RhYmxlbWV0YSByZWdpc3RyeTwvdGV4dD4KPHRleHQgeD0iMjg2IiB5PSIxOTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5vbmUgc291cmNlIGNvbnRhaW5lciBwZXIgZGVjbGFyZWQgdGFibGU8L3RleHQ+Cjx0ZXh0IHg9IjU3NiIgeT0iMjgiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjYzljZmQ4Ij5BQ0NPVU5UIFRIUk9VR0hQVVQgTU9ERTwvdGV4dD4KPHJlY3QgeD0iNTc2IiB5PSI0MCIgd2lkdGg9IjIzNiIgaGVpZ2h0PSIxNjYiIHJ4PSIxNCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNCA0Ii8+Cjx0ZXh0IHg9IjY5NCIgeT0iNjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4OyBmb250LXdlaWdodDo3MDA7ZmlsbDogI2M5Y2ZkOCI+b25lIG1vZGUgZm9yIHRoZSBkZXBsb3ltZW50PC90ZXh0Pgo8cmVjdCB4PSI1OTIiIHk9Ijc0IiB3aWR0aD0iMjA0IiBoZWlnaHQ9IjU2IiByeD0iOSIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjM2Q2NjUzIiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8dGV4dCB4PSI2OTQiIHk9IjkzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+Ojpwcm92aXNpb25lZDwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSIxMDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5lYWNoIGNvbnRhaW5lciBhIGRlZGljYXRlZDwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSIxMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5hdXRvc2NhbGUgUlUgYmFuZDwvdGV4dD4KPHJlY3QgeD0iNTkyIiB5PSIxMzgiIHdpZHRoPSIyMDQiIGhlaWdodD0iNjAiIHJ4PSI5IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS4yIi8+Cjx0ZXh0IHg9IjY5NCIgeT0iMTU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+OjpzZXJ2ZXJsZXNzPC90ZXh0Pgo8dGV4dCB4PSI2OTQiIHk9IjE3MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmNvbnN1bXB0aW9uIGFjY291bnQsIG5vIHBlci08L3RleHQ+Cjx0ZXh0IHg9IjY5NCIgeT0iMTg2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+Y29udGFpbmVyIHRocm91Z2hwdXQgdG8gcHJvdmlzaW9uPC90ZXh0Pgo8L3N2Zz4=" alt="All of a stack's tables share one Cosmos account with one database named ddb; each declared table keeps its own container, its own index, and its own storage. The selected target sets the account's throughput mode for the deployment: provisioned gives each container a dedicated autoscale RU band, serverless makes it a consumption account with no provisioned per-container throughput. Runtime-created tables share a deployed container and its capacity." />
</div>

<p className="t9-caption">A stack's tables share one account and one "ddb" database, using the selected throughput mode. Each declared table has its own container; runtime-created tables share a deployed container and its capacity. At runtime, CreateTable / DeleteTable / UpdateTable change registry documents, not Cosmos resources.</p>

#### Conditional writes

**The operation and its options determine how the adapter writes an item.** Ordinary SET updates use a versioned, partition-scoped stored procedure. Cosmos reads the current item, evaluates the condition, applies the update and checks the resulting 400 KiB item limit inside one atomic operation. This is read-modify-write inside the database, with no separate adapter read round trip.

Native PATCH is narrower: the condition must prove existence, every action must be an eligible top-level removal, and TTL, streams and old-image requirements must be absent. A size-increasing SET cannot use this path because native PATCH cannot check the resulting DynamoDB item size.

LSI updates, unsupported expressions and requests needing the old image on condition failure fall back to an adapter read and an etag-guarded write. Streamed writes use the guarded batch path to commit the item and outbox record together. A concurrent write conflict is retryable; it is not reported as a false condition failure.

The Yahoo! Cloud Serving Benchmark (YCSB) workload F measures application-side read-modify-write: a separate GetItem before UpdateItem. Its full latency includes both API calls and is distinct from the update phase. That sequence is not a multi-item transaction. In the recorded 2026-09-09 provisioned capture with 16 workers, full read-modify-write p50 was 21.071 ms and update-phase p50 was 15.935 ms, reported as medians of three completed repetitions. These are different portions of the same workload, not two competing implementations.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjIwIiB2aWV3Qm94PSIwIDAgODM2IDIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaHJlZSB3cml0ZSBwYXRoczogY29uZGl0aW9uYWwgcmVtb3ZhbHMgdXNlIG5hdGl2ZSBQQVRDSDsgb3JkaW5hcnkgd3JpdGVzIHVzZSBhbiBhdG9taWMgc3RvcmVkIHByb2NlZHVyZTsgcmVtYWluaW5nIHNoYXBlcyB1c2UgZ3VhcmRlZCByZWFkLW1vZGlmeS13cml0ZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPHJlY3QgeD0iMTAiIHk9IjIwIiB3aWR0aD0iMjU4IiBoZWlnaHQ9IjE3NSIgcng9IjEyIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiLz4KPHRleHQgeD0iMjgiIHk9IjUxIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYSI+RWxpZ2libGUgcmVtb3ZhbHM8L3RleHQ+PHRleHQgeD0iMjgiIHk9IjgzIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OSI+Y29uZGl0aW9uYWwgbmF0aXZlIFBBVENIPC90ZXh0Pjx0ZXh0IHg9IjI4IiB5PSIxMTciIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5jb25kaXRpb24gcHJvdmVzIGl0ZW0vcGF0aCBleGlzdHM8L3RleHQ+PHRleHQgeD0iMjgiIHk9IjE0MSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm5vIHNpemUgZ3Jvd3RoLCBUVEwgb3Igc3RyZWFtPC90ZXh0Pjx0ZXh0IHg9IjI4IiB5PSIxNjUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5ubyBvbGQtaW1hZ2UgcmVxdWlyZW1lbnQ8L3RleHQ+CjxyZWN0IHg9IjI4OSIgeT0iMjAiIHdpZHRoPSIyNTgiIGhlaWdodD0iMTc1IiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIvPgo8dGV4dCB4PSIzMDciIHk9IjUxIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYSI+T3JkaW5hcnkgbm9uLXN0cmVhbSB3cml0ZXM8L3RleHQ+PHRleHQgeD0iMzA3IiB5PSI4MyIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPmF0b21pYyBzdG9yZWQgcHJvY2VkdXJlPC90ZXh0Pjx0ZXh0IHg9IjMwNyIgeT0iMTE3IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+cmVhZCDihpIgY29uZGl0aW9uIOKGkiBtdXRhdGlvbjwvdGV4dD48dGV4dCB4PSIzMDciIHk9IjE0MSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmNoZWNrIHJlc3VsdGluZyBpdGVtIOKJpCA0MDAgS2lCPC90ZXh0Pjx0ZXh0IHg9IjMwNyIgeT0iMTY1IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+Y29tbWl0IGluc2lkZSB0aGUgcGFydGl0aW9uPC90ZXh0Pgo8cmVjdCB4PSI1NjgiIHk9IjIwIiB3aWR0aD0iMjU4IiBoZWlnaHQ9IjE3NSIgcng9IjEyIiBmaWxsPSIjZmZmYmViIiBzdHJva2U9IiNmNTllMGIiLz4KPHRleHQgeD0iNTg2IiB5PSI1MSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmEiPk90aGVyIHJlcXVlc3QgdHlwZXM8L3RleHQ+PHRleHQgeD0iNTg2IiB5PSI4MyIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPmd1YXJkZWQgcmVhZC1tb2RpZnktd3JpdGU8L3RleHQ+PHRleHQgeD0iNTg2IiB5PSIxMTciIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5MU0kgdXBkYXRlcyAvIGNvbXBsZXggZXhwcmVzc2lvbnM8L3RleHQ+PHRleHQgeD0iNTg2IiB5PSIxNDEiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5vbGQgaW1hZ2Ugb24gY29uZGl0aW9uIGZhaWx1cmU8L3RleHQ+PHRleHQgeD0iNTg2IiB5PSIxNjUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5zdHJlYW1zOiBhdG9taWMgb3V0Ym94IGJhdGNoPC90ZXh0Pgo8L3N2Zz4=" alt="Three write paths: conditional removals use native PATCH; ordinary writes use an atomic stored procedure; remaining shapes use guarded read-modify-write." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjIwIiB2aWV3Qm94PSIwIDAgODM2IDIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaHJlZSB3cml0ZSBwYXRoczogY29uZGl0aW9uYWwgcmVtb3ZhbHMgdXNlIG5hdGl2ZSBQQVRDSDsgb3JkaW5hcnkgd3JpdGVzIHVzZSBhbiBhdG9taWMgc3RvcmVkIHByb2NlZHVyZTsgcmVtYWluaW5nIHNoYXBlcyB1c2UgZ3VhcmRlZCByZWFkLW1vZGlmeS13cml0ZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPHJlY3QgeD0iMTAiIHk9IjIwIiB3aWR0aD0iMjU4IiBoZWlnaHQ9IjE3NSIgcng9IjEyIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiLz4KPHRleHQgeD0iMjgiIHk9IjUxIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkOCI+RWxpZ2libGUgcmVtb3ZhbHM8L3RleHQ+PHRleHQgeD0iMjgiIHk9IjgzIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+Y29uZGl0aW9uYWwgbmF0aXZlIFBBVENIPC90ZXh0Pjx0ZXh0IHg9IjI4IiB5PSIxMTciIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5jb25kaXRpb24gcHJvdmVzIGl0ZW0vcGF0aCBleGlzdHM8L3RleHQ+PHRleHQgeD0iMjgiIHk9IjE0MSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm5vIHNpemUgZ3Jvd3RoLCBUVEwgb3Igc3RyZWFtPC90ZXh0Pjx0ZXh0IHg9IjI4IiB5PSIxNjUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5ubyBvbGQtaW1hZ2UgcmVxdWlyZW1lbnQ8L3RleHQ+CjxyZWN0IHg9IjI4OSIgeT0iMjAiIHdpZHRoPSIyNTgiIGhlaWdodD0iMTc1IiByeD0iMTIiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIvPgo8dGV4dCB4PSIzMDciIHk9IjUxIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkOCI+T3JkaW5hcnkgbm9uLXN0cmVhbSB3cml0ZXM8L3RleHQ+PHRleHQgeD0iMzA3IiB5PSI4MyIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPmF0b21pYyBzdG9yZWQgcHJvY2VkdXJlPC90ZXh0Pjx0ZXh0IHg9IjMwNyIgeT0iMTE3IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cmVhZCDihpIgY29uZGl0aW9uIOKGkiBtdXRhdGlvbjwvdGV4dD48dGV4dCB4PSIzMDciIHk9IjE0MSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmNoZWNrIHJlc3VsdGluZyBpdGVtIOKJpCA0MDAgS2lCPC90ZXh0Pjx0ZXh0IHg9IjMwNyIgeT0iMTY1IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+Y29tbWl0IGluc2lkZSB0aGUgcGFydGl0aW9uPC90ZXh0Pgo8cmVjdCB4PSI1NjgiIHk9IjIwIiB3aWR0aD0iMjU4IiBoZWlnaHQ9IjE3NSIgcng9IjEyIiBmaWxsPSIjMzEyZDFhIiBzdHJva2U9IiNmNTllMGIiLz4KPHRleHQgeD0iNTg2IiB5PSI1MSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDgiPk90aGVyIHJlcXVlc3QgdHlwZXM8L3RleHQ+PHRleHQgeD0iNTg2IiB5PSI4MyIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPmd1YXJkZWQgcmVhZC1tb2RpZnktd3JpdGU8L3RleHQ+PHRleHQgeD0iNTg2IiB5PSIxMTciIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5MU0kgdXBkYXRlcyAvIGNvbXBsZXggZXhwcmVzc2lvbnM8L3RleHQ+PHRleHQgeD0iNTg2IiB5PSIxNDEiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5vbGQgaW1hZ2Ugb24gY29uZGl0aW9uIGZhaWx1cmU8L3RleHQ+PHRleHQgeD0iNTg2IiB5PSIxNjUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5zdHJlYW1zOiBhdG9taWMgb3V0Ym94IGJhdGNoPC90ZXh0Pgo8L3N2Zz4=" alt="Three write paths: conditional removals use native PATCH; ordinary writes use an atomic stored procedure; remaining shapes use guarded read-modify-write." />
</div>

#### Secondary indexes

A local secondary index shares the source container and partition route, so its reads reflect committed writes immediately. Its projected entry size also contributes to DynamoDB's item-size check.

On the provisioned target, Azure asynchronously maintains a dedicated container for each declared global secondary index. Queries target that index container and push down its key predicate, ordering and cursor. GSI visibility is eventual; `ConsistentRead=true` is rejected, matching DynamoDB's GSI contract.

Serverless tables cannot declare these managed GSIs. Index definitions must match the provisioned configuration; the adapter does not silently build a substitute index at runtime.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTcwIiB2aWV3Qm94PSIwIDAgODM2IDE3MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBbiBMU0kgc2hhcmVzIHRoZSBzb3VyY2UgY29udGFpbmVyIGFuZCBpcyBpbW1lZGlhdGVseSB2aXNpYmxlLiBBenVyZSBtYWludGFpbnMgYSBzZXBhcmF0ZSBHU0kgY29udGFpbmVyIGFzeW5jaHJvbm91c2x5IG9uIHByb3Zpc2lvbmVkIGFjY291bnRzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8cmVjdCB4PSIyMCIgeT0iMzAiIHdpZHRoPSIzMTAiIGhlaWdodD0iMTEyIiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIvPjx0ZXh0IHg9IjQyIiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmEiPlNvdXJjZSBjb250YWluZXI8L3RleHQ+PHRleHQgeD0iNDIiIHk9IjkyIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+YmFzZSBpdGVtcyArIGxvY2FsIHNlY29uZGFyeSBpbmRleGVzPC90ZXh0Pjx0ZXh0IHg9IjQyIiB5PSIxMTkiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA1OTY2OSI+c3Ryb25nIHJlYWRzLCBpbW1lZGlhdGUgTFNJIHZpc2liaWxpdHk8L3RleHQ+CjxwYXRoIGQ9Ik0zNDAgODQgSDQ5NCBsLTEwIC03IE00OTQgODQgbC0xMCA3IiBmaWxsPSJub25lIiBzdHJva2U9IiM2NDc0OGIiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjQxNyIgeT0iNjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5BenVyZSBwcm9wYWdhdGVzPC90ZXh0Pjx0ZXh0IHg9IjQxNyIgeT0iMTEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+YXN5bmNocm9ub3VzbHk8L3RleHQ+CjxyZWN0IHg9IjUwNiIgeT0iMzAiIHdpZHRoPSIzMTAiIGhlaWdodD0iMTEyIiByeD0iMTIiIGZpbGw9IiNlZWYyZmYiIHN0cm9rZT0iIzYzNjZmMSIvPjx0ZXh0IHg9IjUyOCIgeT0iNjQiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhIj5NYW5hZ2VkIEdTSSBjb250YWluZXI8L3RleHQ+PHRleHQgeD0iNTI4IiB5PSI5MiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9uZSBkZWRpY2F0ZWQgdGFyZ2V0IHBlciBkZWNsYXJlZCBHU0k8L3RleHQ+PHRleHQgeD0iNTI4IiB5PSIxMTkiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5wcm92aXNpb25lZCBtb2RlOyBldmVudHVhbCB2aXNpYmlsaXR5PC90ZXh0Pjwvc3ZnPg==" alt="An LSI shares the source container and is immediately visible. Azure maintains a separate GSI container asynchronously on provisioned accounts." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTcwIiB2aWV3Qm94PSIwIDAgODM2IDE3MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBbiBMU0kgc2hhcmVzIHRoZSBzb3VyY2UgY29udGFpbmVyIGFuZCBpcyBpbW1lZGlhdGVseSB2aXNpYmxlLiBBenVyZSBtYWludGFpbnMgYSBzZXBhcmF0ZSBHU0kgY29udGFpbmVyIGFzeW5jaHJvbm91c2x5IG9uIHByb3Zpc2lvbmVkIGFjY291bnRzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8cmVjdCB4PSIyMCIgeT0iMzAiIHdpZHRoPSIzMTAiIGhlaWdodD0iMTEyIiByeD0iMTIiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIvPjx0ZXh0IHg9IjQyIiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDgiPlNvdXJjZSBjb250YWluZXI8L3RleHQ+PHRleHQgeD0iNDIiIHk9IjkyIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+YmFzZSBpdGVtcyArIGxvY2FsIHNlY29uZGFyeSBpbmRleGVzPC90ZXh0Pjx0ZXh0IHg9IjQyIiB5PSIxMTkiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjNiI+c3Ryb25nIHJlYWRzLCBpbW1lZGlhdGUgTFNJIHZpc2liaWxpdHk8L3RleHQ+CjxwYXRoIGQ9Ik0zNDAgODQgSDQ5NCBsLTEwIC03IE00OTQgODQgbC0xMCA3IiBmaWxsPSJub25lIiBzdHJva2U9IiM2NDc0OGIiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjQxNyIgeT0iNjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5BenVyZSBwcm9wYWdhdGVzPC90ZXh0Pjx0ZXh0IHg9IjQxNyIgeT0iMTEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+YXN5bmNocm9ub3VzbHk8L3RleHQ+CjxyZWN0IHg9IjUwNiIgeT0iMzAiIHdpZHRoPSIzMTAiIGhlaWdodD0iMTEyIiByeD0iMTIiIGZpbGw9IiMxYTIwMzEiIHN0cm9rZT0iIzNkM2U2NiIvPjx0ZXh0IHg9IjUyOCIgeT0iNjQiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4Ij5NYW5hZ2VkIEdTSSBjb250YWluZXI8L3RleHQ+PHRleHQgeD0iNTI4IiB5PSI5MiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9uZSBkZWRpY2F0ZWQgdGFyZ2V0IHBlciBkZWNsYXJlZCBHU0k8L3RleHQ+PHRleHQgeD0iNTI4IiB5PSIxMTkiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5wcm92aXNpb25lZCBtb2RlOyBldmVudHVhbCB2aXNpYmlsaXR5PC90ZXh0Pjwvc3ZnPg==" alt="An LSI shares the source container and is immediately visible. Azure maintains a separate GSI container asynchronously on provisioned accounts." />
</div>

#### Transactions

**The current Cosmos adapter rejects DynamoDB multi-item transactions.** This includes `TransactWriteItems`, `TransactGetItems` and transactional PartiQL, even when all items share a partition key.

Cosmos partition-local stored procedures and batches still make individual writes and stream outbox commits atomic. That internal mechanism does not expose the DynamoDB transaction APIs.

Applications that require DynamoDB multi-item transactions need another listed target that supports those APIs.

#### Limitations

Compatibility limits

* **Numeric domain:** at most 15 significant digits and representable native range, compared with DynamoDB's 38-digit domain. Unsupported values fail validation.
* **Item size:** 400 KiB remains enforced. Ordinary SET updates use the stored procedure; LSI updates need the guarded fallback so projected entry size is checked too.
* **Transactions:** the current adapter rejects all DynamoDB multi-item transaction APIs, including single-partition requests.
* **Read consistency:** the compiled account uses Strong consistency regardless of the request's ConsistentRead flag. Plan capacity for strongly consistent reads.
* **Pagination:** Query and Scan use native result windows. Limit and ScannedCount do not exactly reproduce DynamoDB's pre-filter examined-item counter; residual predicates may be evaluated in the adapter.
* **Indexes:** managed GSIs are eventually consistent and require the provisioned target; LSIs share the source container. Declared index definitions must match the deployment.
* **Streams:** records co-commit with the item, but a streamed table permits one writing instance at a time to preserve ordering. Writes from another instance can be rejected until its writer lease is available.
* **Hot partitions:** capacity depends on key distribution and the account's throughput mode. A hot item can contend even when aggregate capacity remains available.
* **Table lifecycle:** DeleteTable changes the logical generation. Other adapter instances can observe that change after the bounded metadata cache delay, approximately five seconds; physical cleanup is bounded.

#### Other considerations

* **Migration:** the Cosmos containers start empty. Export/import, backfill or a dual-write cutover must move existing DynamoDB data before switching traffic.
* **Deployment:** the compiler provisions one account with the chosen throughput mode, a shared database and containers for declared tables. Managed identities provide data access; account keys are unnecessary.
* **Capacity:** provisioned containers use dedicated autoscale RU bands. Serverless containers have no provisioned throughput and bill consumed requests. The 2026-09-09 adapter captures used separate Standard\_D8s\_v5 driver and adapter VMs in westus2, Strong consistency and gateway-mode connectivity. The provisioned container had a 40,000-RU/s autoscale maximum. YCSB used 100,000 verified records with ten 100-byte fields and 200,000 logical operations per repetition. Each mode has its own results; medians summarize three completed repetitions. There is no matching native DynamoDB baseline for this configuration, so these captures do not establish a performance advantage over DynamoDB.
* **Runtime-created tables:** these occupy separate logical namespaces inside an already-deployed container and share its capacity. Declared tables have separate containers.
* **Operations:** Microsoft operates Cosmos storage; Tensor9 operates the adapter. Monitor request units, throttling, write conflicts and latency alongside adapter and application host utilization.

### Via Azure Cosmos DB (serverless)

| Operation                                                                   | Area                | Support      | Depth        | Notes                                                                                                                                                                                                                                                                                   |
| --------------------------------------------------------------------------- | ------------------- | ------------ | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| DescribeContinuousBackups                                                   | Backups             | Partial      | Full surface | PITR status mapped from the Cosmos continuous-backup mode                                                                                                                                                                                                                               |
| On-demand backups (CreateBackup / RestoreTableFromBackup / …)               | Backups             | Out of scope | Full surface | the snapshot-backup model differs from Cosmos; Use the target backup and restore workflow.                                                                                                                                                                                              |
| UpdateContinuousBackups                                                     | Backups             | Partial      | Full surface | toggles PITR onto Cosmos continuous backup (the retention window differs)                                                                                                                                                                                                               |
| ConditionExpression                                                         | Conditional writes  | Supported    | Common       | condition and mutation execute atomically in a stored procedure, eligible PATCH or etag-guarded fallback; write conflicts are retryable                                                                                                                                                 |
| Global tables (CreateGlobalTable / UpdateGlobalTable / …)                   | Global              | Out of scope | Full surface | DynamoDB global-table control APIs are outside this mapping; configure the target deployment and its region separately.                                                                                                                                                                 |
| DescribeStream                                                              | Indexes + streams   | Supported    | Full surface | returns the shard list and stream ARN                                                                                                                                                                                                                                                   |
| GetRecords                                                                  | Indexes + streams   | Supported    | Full surface | records co-commit atomically with the write; all four view types; 24-hour retention with TrimmedDataAccessException below the horizon; one writing instance per streamed table                                                                                                          |
| GetShardIterator                                                            | Indexes + streams   | Supported    | Full surface | -                                                                                                                                                                                                                                                                                       |
| ListStreams                                                                 | Indexes + streams   | Supported    | Full surface | the streamed-table registry                                                                                                                                                                                                                                                             |
| Query (GSI)                                                                 | Indexes + streams   | Out of scope | Most usage   | a global secondary index needs autoscale throughput to maintain its index container, which a consumption account does not offer; a table declaring one stops the build and names the provisioned target rather than deploying without the index. Local secondary indexes are unaffected |
| Query (LSI)                                                                 | Indexes + streams   | Supported    | Most usage   | a local secondary index shares the table's own container and partition route, so an LSI query reflects a write immediately; large index partitions are subject to a per-query candidate limit                                                                                           |
| S3 import/export + Kinesis streaming + ContributorInsights + ResourcePolicy | Out of scope        | Out of scope | Full surface | These AWS integrations are outside the listed mapping.                                                                                                                                                                                                                                  |
| BatchExecuteStatement                                                       | PartiQL             | Partial      | Most usage   | batched PartiQL statements, each statement gets its own real outcome                                                                                                                                                                                                                    |
| ExecuteStatement                                                            | PartiQL             | Partial      | Most usage   | PartiQL select/insert/update/delete compiled to the native Cosmos query / item path; some PartiQL functions differ                                                                                                                                                                      |
| ExecuteTransaction                                                          | PartiQL             | Out of scope | Most usage   | transactional PartiQL is unavailable on the current Cosmos adapter                                                                                                                                                                                                                      |
| BatchGetItem                                                                | Reads               | Supported    | Most usage   | the adapter executes each item operation and reports its result                                                                                                                                                                                                                         |
| BatchWriteItem                                                              | Reads               | Supported    | Most usage   | the adapter executes each item operation and reports its result                                                                                                                                                                                                                         |
| Query                                                                       | Reads               | Partial      | Common       | native key/range/order/filter pushdown plus residual evaluation; pagination follows Cosmos result windows                                                                                                                                                                               |
| Scan                                                                        | Reads               | Partial      | Most usage   | bounded native result windows; Limit and ScannedCount differ from DynamoDB pre-filter examined-item accounting                                                                                                                                                                          |
| DeleteItem                                                                  | Single item         | Supported    | Common       | -                                                                                                                                                                                                                                                                                       |
| GetItem                                                                     | Single item         | Supported    | Common       | strongly consistent from any instance, whatever the ConsistentRead flag (never weaker than asked)                                                                                                                                                                                       |
| PutItem                                                                     | Single item         | Supported    | Common       | DynamoDB type tags preserved; native Cosmos numbers require at most 15 significant digits and representable range                                                                                                                                                                       |
| UpdateItem                                                                  | Single item         | Supported    | Common       | eligible removals use native conditional PATCH; ordinary updates run in a partition-scoped stored procedure; other shapes use guarded read-modify-write                                                                                                                                 |
| DescribeTimeToLive                                                          | TTL                 | Supported    | Most usage   | reads the container's TTL policy                                                                                                                                                                                                                                                        |
| UpdateTimeToLive                                                            | TTL                 | Supported    | Most usage   | the DynamoDB per-item TTL attribute is mapped to the Cosmos TTL policy                                                                                                                                                                                                                  |
| CreateTable                                                                 | Table control plane | Supported    | Most usage   | registers a logical table in a deployed container; declared tables receive containers at compile time                                                                                                                                                                                   |
| DeleteTable                                                                 | Table control plane | Supported    | Most usage   | logical generation change with bounded cleanup and metadata propagation                                                                                                                                                                                                                 |
| DescribeEndpoints                                                           | Table control plane | Supported    | Full surface | returns the adapter endpoint                                                                                                                                                                                                                                                            |
| DescribeLimits                                                              | Table control plane | Supported    | Full surface | account / table limits reported from the compiled config                                                                                                                                                                                                                                |
| DescribeTable                                                               | Table control plane | Supported    | Most usage   | returns the key schema and stream identifiers                                                                                                                                                                                                                                           |
| ListTables                                                                  | Table control plane | Supported    | Most usage   | -                                                                                                                                                                                                                                                                                       |
| UpdateTable                                                                 | Table control plane | Supported    | Most usage   | index and stream definitions must match deployed configuration; throughput mode is selected at compile time                                                                                                                                                                             |
| ListTagsOfResource                                                          | Tags                | Supported    | Full surface | -                                                                                                                                                                                                                                                                                       |
| TagResource                                                                 | Tags                | Supported    | Full surface | -                                                                                                                                                                                                                                                                                       |
| UntagResource                                                               | Tags                | Supported    | Full surface | -                                                                                                                                                                                                                                                                                       |
| TransactGetItems                                                            | Transactions        | Out of scope | Most usage   | the current Cosmos adapter rejects DynamoDB transactional reads                                                                                                                                                                                                                         |
| TransactWriteItems                                                          | Transactions        | Out of scope | Most usage   | the current Cosmos adapter rejects DynamoDB multi-item transactions                                                                                                                                                                                                                     |

#### Requests and database state

Your DynamoDB client sends requests to the Rust adapter in the customer environment. The adapter parses DynamoDB expressions, performs Cosmos operations and returns DynamoDB responses. Cosmos stores items, table definitions and stream records. The adapter uses workload identity to access that data; restarting an adapter instance does not require restoring local item state.

#### Choosing serverless capacity

Tensor9 provisions a serverless Cosmos account and one ddb database for the deployment. Charges follow consumed request units and stored data, without a dedicated autoscale range. The selected account mode applies to its containers; a source table's provisioned capacity does not reserve Cosmos request units. Test the workload's bursts, retries and partition distribution against the serverless limits.

#### Declared and runtime-created tables

Each declared table gets a container. A table created through the runtime CreateTable API instead uses the first deployed container: the adapter records its schema and separates its items with a table-prefixed partition key. The data identity cannot provision a new Cosmos container. DescribeTable and ListTables read the durable registry; DeleteTable invalidates the table generation and performs bounded cleanup. Runtime-created tables therefore share container capacity.

#### Items, reads and conditional writes

DynamoDB attribute type tags are retained, but numbers must fit the native Cosmos representation: at most 15 significant digits and a representable range. Unsupported numbers are rejected. The adapter enforces a 400 KiB item limit and uses strong reads regardless of ConsistentRead. Ordinary writes use a Cosmos stored procedure; eligible conditional removals use PATCH, and other request shapes use guarded read-modify-write. Query and Scan use Cosmos result windows, so Limit and ScannedCount differ from DynamoDB's examined-item accounting.

#### Indexes, transactions and streams

Local secondary indexes share the table's container and reflect a write immediately. A global secondary index requires the provisioned target because the separate Azure-maintained index container needs autoscale throughput; declaring one on serverless stops the build. DynamoDB multi-item transaction APIs are rejected. Streams commit each change record with the item and require one writing instance per streamed table. All four view types and 24-hour retention are available; an older position returns TrimmedDataAccessException.

#### Expiry, migration and operation

The adapter converts the configured absolute TTL epoch into Cosmos's relative expiry value. Cosmos removes expired documents asynchronously. Deploy the destination, load existing items and validate the application's queries and stream consumers before switching traffic. Changing between provisioned and serverless accounts requires a new destination and data migration. Microsoft operates Cosmos, while Tensor9 operates the adapter; configure account access, backups and monitoring for the customer environment.

## On OCI

| Capability                                  | Area           | Support      | Required tier | Operations | Notes                                                                                                                              |
| ------------------------------------------- | -------------- | ------------ | ------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| aws\_dynamodb\_table provisioning           | Infrastructure | Partial      | -             | -          | creates oci\_nosql\_table with the mapped key schema and capacity settings; review storage, index, TTL and integration differences |
| DynamoDB item and table-management requests | Runtime API    | Out of scope | -             | -          | this OCI NoSQL mapping has no DynamoDB API translator; use OCI NoSQL APIs and SDKs                                                 |

#### Infrastructure mapping

Tensor9 converts the declared aws\_dynamodb\_table to an oci\_nosql\_table in the customer's OCI compartment. This is the infrastructure-only adaptation: it provisions storage but does not provide an AWS DynamoDB endpoint. Application reads, writes, queries and runtime table administration use OCI NoSQL APIs. The table and control pages describe this same target choice.

#### Keys and item data

The DynamoDB partition key becomes the OCI SHARD key. An optional sort key becomes the second primary-key column. String, number and binary key types become corresponding OCI column types; other item attributes occupy a value JSON column. Adapt queries and serialization to that layout rather than sending DynamoDB attribute documents directly.

#### Capacity and storage

PAY\_PER\_REQUEST selects OCI ON\_DEMAND; provisioned DynamoDB capacity selects OCI PROVISIONED settings. OCI read and write units differ from DynamoDB units, so validate them against the workload. OCI also requires an explicit storage cap. Increase that cap before data reaches it; the source DynamoDB table had no equivalent fixed cap.

#### Indexes, expiry and integrations

The current infrastructure mapping does not create declared GSIs or LSIs. Configure native OCI indexes and update the application's access patterns. A source TTL declaration produces a no-expiry default; its per-item epoch attribute is not translated into automatic expiry. DynamoDB Streams, AWS PITR configuration, source KMS key references and replica settings are not reproduced by this table resource. Configure the corresponding target data-protection and event requirements separately.

#### Migration and operation

The new table starts empty. Convert application access, load the data, and test key lookups, queries, expiry and recovery before switching traffic. Oracle operates the NoSQL service; the customer manages compartment access, capacity, storage limits and the chosen recovery procedures. Use a different listed adaptation when the application must keep runtime DynamoDB API calls.

## On Private Kubernetes

| Operation           | Area               | Support   | Depth        | Notes                                                                                                                                                                 |
| ------------------- | ------------------ | --------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ConditionExpression | Conditional writes | Supported | Common       | evaluated against the live item under a row-level lock; commits atomically                                                                                            |
| DescribeStream      | Indexes + streams  | Supported | Full surface | shard list + stream ARN                                                                                                                                               |
| GetRecords          | Indexes + streams  | Supported | Full surface | DynamoDB Streams served from an in-transaction outbox co-committed with each write                                                                                    |
| GetShardIterator    | Indexes + streams  | Supported | Full surface | -                                                                                                                                                                     |
| ListStreams         | Indexes + streams  | Supported | Full surface | the streamed-table registry                                                                                                                                           |
| Query (GSI / LSI)   | Indexes + streams  | Supported | Most usage   | indexes declared before deployment and maintained in the item transaction; queries use the index                                                                      |
| Query               | Reads              | Supported | Common       | ordering, filters and pagination honored                                                                                                                              |
| Scan                | Reads              | Supported | Common       | streamed page by page                                                                                                                                                 |
| DeleteItem          | Single item        | Supported | Common       | -                                                                                                                                                                     |
| GetItem             | Single item        | Supported | Common       | -                                                                                                                                                                     |
| PutItem             | Single item        | Supported | Common       | items kept in native shape; numbers at exact decimal precision                                                                                                        |
| UpdateItem          | Single item        | Supported | Common       | update expressions evaluated by the adapter                                                                                                                           |
| TransactWriteItems  | Transactions       | Supported | Most usage   | one serializable PostgreSQL transaction across tables; at most 100 actions and one operation per item; ClientRequestToken idempotency; stream-enabled tables excluded |

#### PostgreSQL in the appliance

Tensor9 deploys and operates the PostgreSQL store with the customer appliance, including disconnected deployments. Application requests use the same Rust DynamoDB-to-PostgreSQL implementation as the managed PostgreSQL target. Database access uses the configured connection credentials; Cloud SQL IAM authentication is specific to the Google-managed target. The customer supplies the infrastructure, and the deployment's storage, backup and recovery configuration determines availability.

#### How it works

Tensor9 runs a DynamoDB adapter beside your application in the customer's environment. It configures `AWS_ENDPOINT_URL_DYNAMODB` to send the AWS SDK's requests to the adapter over the local loopback network. Your SDK and application code stay unchanged. The adapter accepts DynamoDB requests and data types, returns DynamoDB responses and errors, and stores data in PostgreSQL.

DynamoDB supports numbers with up to 38 significant digits, typed sets, conditional writes, secondary indexes, and atomic transactions. The adapter implements these using PostgreSQL storage and transactions. PostgreSQL supports multi-table transactions and synchronously updated indexes, but has different concurrency, capacity, and identifier limits. Unsupported requests return errors; the limitations below describe the differences.

For base-table `Query` and `Scan` requests, the adapter compiles supported filters into parameterized SQL `WHERE` predicates over the JSONB item. Number comparisons cast stored decimal text to PostgreSQL `numeric`. An order-preserving key column supplies sort bounds, cursor position, and direction. The query uses a server-side cursor to fetch bounded batches until the requested `Limit` or 1 MiB of item data. Expressions that cannot be represented in SQL are evaluated in the adapter over the rows selected by the SQL predicate. Secondary-index queries use the separate path described below.

For conditional writes, the adapter opens a transaction, locks the row with `SELECT ... FOR UPDATE`, evaluates the `ConditionExpression`, and writes within that transaction. This requires an extra round trip, but prevents a concurrent writer from changing the item between the check and write. A failed condition returns `ConditionalCheckFailed` and can return the item that failed it. Some unconditional writes skip the read: a top-level SET/REMOVE patch or integral counter add uses one statement when it has no condition, requests no returned item image, and affects no secondary index or stream.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogaW4gdGhlIHRhcmdldCBjbG91ZCB0aGUgc2FtZSBhcHBsaWNhdGlvbiBhbmQgU0RLIGNhbGwgYSBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgRHluYW1vREIgQVBJIGZyb20gYSBQb3N0Z3JlU1FMIGRhdGFiYXNlLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYWgxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDYiIHdpZHRoPSIzNTgiIGhlaWdodD0iMTE4IiByeD0iMTQiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMCIgeT0iNjQiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiM5NGEzYjgiPk9OIEFXUyBUT0RBWTwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjgwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iOTAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMi41cHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI5MCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+RHluYW1vREIgU0RLPC90ZXh0Pgo8bGluZSB4MT0iMTUwIiB5MT0iMTEzIiB4Mj0iMjEwIiB5Mj0iMTEzIiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhaDEpIi8+Cjx0ZXh0IHg9IjE4MSIgeT0iMTA0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+CjxyZWN0IHg9IjIxNCIgeT0iODAiIHdpZHRoPSIxNDgiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyODgiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPkFtYXpvbiBEeW5hbW9EQjwvdGV4dD4KPHRleHQgeD0iMjg4IiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5BV1MtbWFuYWdlZDwvdGV4dD4KPGxpbmUgeDE9IjQxOCIgeTE9IjQwIiB4Mj0iNDE4IiB5Mj0iMTYwIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS40Ii8+CjxyZWN0IHg9IjQ2MiIgeT0iNDYiIHdpZHRoPSIzNjIiIGhlaWdodD0iMTE4IiByeD0iMTQiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSI0NzYiIHk9IjY0IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojMDQ3ODU3Ij5PTiBUSEUgVEFSR0VUIENMT1VEPC90ZXh0Pgo8cmVjdCB4PSI0NzQiIHk9IjgwIiB3aWR0aD0iOTIiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5Zb3VyIGFwcDwvdGV4dD4KPHRleHQgeD0iNTIwIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA1OTY2OSI+c2FtZSBTREs8L3RleHQ+CjxsaW5lIHgxPSI1NjYiIHkxPSIxMTMiIHgyPSI1OTAiIHkyPSIxMTMiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2FoMSkiLz4KPHJlY3QgeD0iNTk0IiB5PSI3NiIgd2lkdGg9IjExMCIgaGVpZ2h0PSI3NCIgcng9IjExIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjY0OSIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEycHgiPlRlbnNvcjk8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5zZXJ2aWNlPC90ZXh0Pgo8dGV4dCB4PSI2NDkiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+YWRhcHRlcjwvdGV4dD4KPGxpbmUgeDE9IjcwNCIgeTE9IjExMyIgeDI9IjcyOCIgeTI9IjExMyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYWgxKSIvPgo8cmVjdCB4PSI3MzIiIHk9IjgwIiB3aWR0aD0iODQiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI3NzQiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMXB4Ij5Qb3N0Z3JlU1FMPC90ZXh0Pgo8dGV4dCB4PSI3NzQiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnJlbGF0aW9uYWw8L3RleHQ+Cjwvc3ZnPg==" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: in the target cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from a PostgreSQL database." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB0aGUgYXBwbGljYXRpb24ncyBEeW5hbW9EQiBTREsgY2FsbHMgQW1hem9uIER5bmFtb0RCLiBBZnRlcjogaW4gdGhlIHRhcmdldCBjbG91ZCB0aGUgc2FtZSBhcHBsaWNhdGlvbiBhbmQgU0RLIGNhbGwgYSBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgRHluYW1vREIgQVBJIGZyb20gYSBQb3N0Z3JlU1FMIGRhdGFiYXNlLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYWgxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSIxNiIgeT0iNDYiIHdpZHRoPSIzNTgiIGhlaWdodD0iMTE4IiByeD0iMTQiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIzMCIgeT0iNjQiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTRhM2I4Ij5PTiBBV1MgVE9EQVk8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI4MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjkwIiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTIuNXB4Ij5Zb3VyIGFwcDwvdGV4dD4KPHRleHQgeD0iOTAiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkR5bmFtb0RCIFNESzwvdGV4dD4KPGxpbmUgeDE9IjE1MCIgeTE9IjExMyIgeDI9IjIxMCIgeTI9IjExMyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYWgxKSIvPgo8dGV4dCB4PSIxODEiIHk9IjEwNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo4LjVweCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8cmVjdCB4PSIyMTQiIHk9IjgwIiB3aWR0aD0iMTQ4IiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjg4IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5BbWF6b24gRHluYW1vREI8L3RleHQ+Cjx0ZXh0IHg9IjI4OCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+QVdTLW1hbmFnZWQ8L3RleHQ+CjxsaW5lIHgxPSI0MTgiIHkxPSI0MCIgeDI9IjQxOCIgeTI9IjE2MCIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8cmVjdCB4PSI0NjIiIHk9IjQ2IiB3aWR0aD0iMzYyIiBoZWlnaHQ9IjExOCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDc2IiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPk9OIFRIRSBUQVJHRVQgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjQ3NCIgeT0iODAiIHdpZHRoPSI5MiIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyMCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEycHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI1MjAiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM2Ij5zYW1lIFNESzwvdGV4dD4KPGxpbmUgeDE9IjU2NiIgeTE9IjExMyIgeDI9IjU5MCIgeTI9IjExMyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYWgxKSIvPgo8cmVjdCB4PSI1OTQiIHk9Ijc2IiB3aWR0aD0iMTEwIiBoZWlnaHQ9Ijc0IiByeD0iMTEiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iNjQ5IiB5PSIxMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTJweCI+VGVuc29yOTwvdGV4dD4KPHRleHQgeD0iNjQ5IiB5PSIxMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnNlcnZpY2U8L3RleHQ+Cjx0ZXh0IHg9IjY0OSIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5hZGFwdGVyPC90ZXh0Pgo8bGluZSB4MT0iNzA0IiB5MT0iMTEzIiB4Mj0iNzI4IiB5Mj0iMTEzIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhaDEpIi8+CjxyZWN0IHg9IjczMiIgeT0iODAiIHdpZHRoPSI4NCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijc3NCIgeT0iMTA4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExcHgiPlBvc3RncmVTUUw8L3RleHQ+Cjx0ZXh0IHg9Ijc3NCIgeT0iMTI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cmVsYXRpb25hbDwvdGV4dD4KPC9zdmc+" alt="Before: on AWS the application's DynamoDB SDK calls Amazon DynamoDB. After: in the target cloud the same application and SDK call a Tensor9 adapter, which serves the DynamoDB API from a PostgreSQL database." />
</div>

<p className="t9-caption">Your application uses the DynamoDB API through an adapter in the customer environment.</p>

#### Architecture

The adapter is a stateless Rust service. It parses DynamoDB expressions, translates requests into PostgreSQL operations, and returns DynamoDB responses. It connects to PostgreSQL through a connection pool using the customer's credentials. Durable state stays in PostgreSQL, so adapter instances can restart or scale out without coordinating local state. Stream-enabled tables have the separate single-writer restriction below.

Each DynamoDB table has a PostgreSQL table named `ddb_<name>` in one database. The `ddb_tables` registry records its generated physical name, key schema, billing mode, time-to-live (TTL) settings, global secondary indexes (GSIs), and stream settings. A write or query for a table absent from the registry returns `ResourceNotFoundException`; writes do not create tables implicitly. At runtime, `CreateTable` creates a PostgreSQL expression index for each declared GSI. Each stream-enabled table also has a `_strm` table that stores change records.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBcmNoaXRlY3R1cmU6IHRoZSBhcHAncyBEeW5hbW9EQiBTREsgY2FsbHMgYSBzdGF0ZWxlc3MgUnVzdCBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgQVBJIGZyb20gUG9zdGdyZVNRTC4gUG9zdGdyZXMgaG9sZHMgYWxsIHN0YXRlOiBlYWNoIER5bmFtb0RCIHRhYmxlIGlzIGl0cyBvd24gcGh5c2ljYWwgcmVsYXRpb24gZGRiX25hbWUgaW4gb25lIGRhdGFiYXNlLCBhbiBhdXRob3JpdGF0aXZlIGRkYl90YWJsZXMgcmVnaXN0cnkgcmVsYXRpb24sIGEgbmF0aXZlIHBlci10YWJsZSBleHByZXNzaW9uIGluZGV4IHBlciBkZWNsYXJlZCBHU0ksIGFuZCBhIGNvLWxvY2F0ZWQgX3N0cm0gb3V0Ym94IHJlbGF0aW9uIHBlciBzdHJlYW1lZCB0YWJsZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImFyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSI4IiB5PSIzNCIgd2lkdGg9IjgyMCIgaGVpZ2h0PSIyMDgiIHJ4PSIxNiIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjI2IiB5PSI1NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkNVU1RPTUVSJ1MgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxMTAiIHdpZHRoPSIxMTQiIGhlaWdodD0iOTIiIHJ4PSIxMiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI4MyIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEzcHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTY4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+RHluYW1vREIgU0RLPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNTk2NjkiPnVuY2hhbmdlZDwvdGV4dD4KPGxpbmUgeDE9IjE0MCIgeTE9IjE1NiIgeDI9IjE5MiIgeTI9IjE1NiIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYXIpIi8+Cjx0ZXh0IHg9IjE2NiIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+CjxyZWN0IHg9IjE5NiIgeT0iMTIyIiB3aWR0aD0iMTY4IiBoZWlnaHQ9IjY4IiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iMjgwIiB5PSIxNTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTNweCI+YWRhcHRlcjwvdGV4dD4KPHRleHQgeD0iMjgwIiB5PSIxNjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPnN0YXRlbGVzcyDCtyBSdXN0PC90ZXh0Pgo8bGluZSB4MT0iMzY0IiB5MT0iMTU2IiB4Mj0iNDM2IiB5Mj0iMTU2IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhcikiLz4KPHRleHQgeD0iNDAwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiIj5TUUw8L3RleHQ+Cjx0ZXh0IHg9IjQwMCIgeT0iMTcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+cG9vbGVkPC90ZXh0Pgo8cmVjdCB4PSI0NDAiIHk9Ijg2IiB3aWR0aD0iMzcyIiBoZWlnaHQ9IjE0OCIgcng9IjEzIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjYyNiIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+UG9zdGdyZVNRTCDCtyBvbmUgZGF0YWJhc2U8L3RleHQ+CjxyZWN0IHg9IjQ1NCIgeT0iMTE2IiB3aWR0aD0iMjMwIiBoZWlnaHQ9IjEwOCIgcng9IjEwIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTMyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDA7ZmlsbDojNDc1NTY5Ij5wZXItdGFibGUgcmVsYXRpb25zPC90ZXh0Pgo8dGV4dCB4PSI1NjkiIHk9IjE0NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6IzY0NzQ4YiI+b25lIGRkYl8mbHQ7bmFtZSZndDsgcGVyIHRhYmxlPC90ZXh0Pgo8cmVjdCB4PSI0NjYiIHk9IjE1MiIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSI1NjkiIHk9IjE2NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6IzQ3NTU2OSI+ZGRiX29yZGVycyAgIChwaywgc2ssIGl0ZW0pPC90ZXh0Pgo8cmVjdCB4PSI0NjYiIHk9IjE3NiIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSI1NjkiIHk9IjE5MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6IzQ3NTU2OSI+ZGRiX3Nlc3Npb25zIChwaywgc2ssIGl0ZW0pPC90ZXh0Pgo8cmVjdCB4PSI0NjYiIHk9IjIwMCIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSI1NjkiIHk9IjIxNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6IzQ3NTU2OSI+ZGRiX3RhYmxlcyAgIOKGkiByZWdpc3RyeTwvdGV4dD4KPHJlY3QgeD0iNjk2IiB5PSIxMTYiIHdpZHRoPSIxMDIiIGhlaWdodD0iMTA4IiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNzQ3IiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMDtmaWxsOiM0NzU1NjkiPmV4cHJlc3Npb248L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDA7ZmlsbDojNDc1NTY5Ij5pbmRleCAvIEdTSTwvdGV4dD4KPHRleHQgeD0iNzQ3IiB5PSIxNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj4rIF9zdHJtIG91dGJveDwvdGV4dD4KPHRleHQgeD0iNzQ3IiB5PSIxOTEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5wZXIgc3RyZWFtZWQgdGFibGU8L3RleHQ+Cjwvc3ZnPg==" alt="Architecture: the app's DynamoDB SDK calls a stateless Rust Tensor9 adapter, which serves the API from PostgreSQL. Postgres holds all state: each DynamoDB table is its own physical relation ddb_name in one database, an authoritative ddb_tables registry relation, a native per-table expression index per declared GSI, and a co-located _strm outbox relation per streamed table." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBcmNoaXRlY3R1cmU6IHRoZSBhcHAncyBEeW5hbW9EQiBTREsgY2FsbHMgYSBzdGF0ZWxlc3MgUnVzdCBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNlcnZlcyB0aGUgQVBJIGZyb20gUG9zdGdyZVNRTC4gUG9zdGdyZXMgaG9sZHMgYWxsIHN0YXRlOiBlYWNoIER5bmFtb0RCIHRhYmxlIGlzIGl0cyBvd24gcGh5c2ljYWwgcmVsYXRpb24gZGRiX25hbWUgaW4gb25lIGRhdGFiYXNlLCBhbiBhdXRob3JpdGF0aXZlIGRkYl90YWJsZXMgcmVnaXN0cnkgcmVsYXRpb24sIGEgbmF0aXZlIHBlci10YWJsZSBleHByZXNzaW9uIGluZGV4IHBlciBkZWNsYXJlZCBHU0ksIGFuZCBhIGNvLWxvY2F0ZWQgX3N0cm0gb3V0Ym94IHJlbGF0aW9uIHBlciBzdHJlYW1lZCB0YWJsZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+CjxtYXJrZXIgaWQ9ImFyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj4KPC9kZWZzPgo8cmVjdCB4PSI4IiB5PSIzNCIgd2lkdGg9IjgyMCIgaGVpZ2h0PSIyMDgiIHJ4PSIxNiIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjI2IiB5PSI1NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkNVU1RPTUVSJ1MgQ0xPVUQ8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxMTAiIHdpZHRoPSIxMTQiIGhlaWdodD0iOTIiIHJ4PSIxMiIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI4MyIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEzcHgiPllvdXIgYXBwPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTY4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+RHluYW1vREIgU0RLPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iMTg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzYiPnVuY2hhbmdlZDwvdGV4dD4KPGxpbmUgeDE9IjE0MCIgeTE9IjE1NiIgeDI9IjE5MiIgeTI9IjE1NiIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYXIpIi8+Cjx0ZXh0IHg9IjE2NiIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjguNXB4Ij5EeW5hbW9EQiBBUEk8L3RleHQ+CjxyZWN0IHg9IjE5NiIgeT0iMTIyIiB3aWR0aD0iMTY4IiBoZWlnaHQ9IjY4IiByeD0iMTIiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iMjgwIiB5PSIxNTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTNweCI+YWRhcHRlcjwvdGV4dD4KPHRleHQgeD0iMjgwIiB5PSIxNjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnN0YXRlbGVzcyDCtyBSdXN0PC90ZXh0Pgo8bGluZSB4MT0iMzY0IiB5MT0iMTU2IiB4Mj0iNDM2IiB5Mj0iMTU2IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhcikiLz4KPHRleHQgeD0iNDAwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5TUUw8L3RleHQ+Cjx0ZXh0IHg9IjQwMCIgeT0iMTcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+cG9vbGVkPC90ZXh0Pgo8cmVjdCB4PSI0NDAiIHk9Ijg2IiB3aWR0aD0iMzcyIiBoZWlnaHQ9IjE0OCIgcng9IjEzIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjYyNiIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+UG9zdGdyZVNRTCDCtyBvbmUgZGF0YWJhc2U8L3RleHQ+CjxyZWN0IHg9IjQ1NCIgeT0iMTE2IiB3aWR0aD0iMjMwIiBoZWlnaHQ9IjEwOCIgcng9IjEwIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTMyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXdlaWdodDo3MDA7ZmlsbDogI2M5Y2ZkOCI+cGVyLXRhYmxlIHJlbGF0aW9uczwvdGV4dD4KPHRleHQgeD0iNTY5IiB5PSIxNDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjEwcHggJ1NGIE1vbm8nLE1lbmxvLG1vbm9zcGFjZTtmaWxsOiAjYzljZmQ4Ij5vbmUgZGRiXyZsdDtuYW1lJmd0OyBwZXIgdGFibGU8L3RleHQ+CjxyZWN0IHg9IjQ2NiIgeT0iMTUyIiB3aWR0aD0iMjA2IiBoZWlnaHQ9IjIwIiByeD0iNSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjU2OSIgeT0iMTY2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDogI2M5Y2ZkOCI+ZGRiX29yZGVycyAgIChwaywgc2ssIGl0ZW0pPC90ZXh0Pgo8cmVjdCB4PSI0NjYiIHk9IjE3NiIgd2lkdGg9IjIwNiIgaGVpZ2h0PSIyMCIgcng9IjUiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIvPgo8dGV4dCB4PSI1NjkiIHk9IjE5MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6ICNjOWNmZDgiPmRkYl9zZXNzaW9ucyAocGssIHNrLCBpdGVtKTwvdGV4dD4KPHJlY3QgeD0iNDY2IiB5PSIyMDAiIHdpZHRoPSIyMDYiIGhlaWdodD0iMjAiIHJ4PSI1IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iNTY5IiB5PSIyMTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjEwcHggJ1NGIE1vbm8nLE1lbmxvLG1vbm9zcGFjZTtmaWxsOiAjYzljZmQ4Ij5kZGJfdGFibGVzICAg4oaSIHJlZ2lzdHJ5PC90ZXh0Pgo8cmVjdCB4PSI2OTYiIHk9IjExNiIgd2lkdGg9IjEwMiIgaGVpZ2h0PSIxMDgiIHJ4PSIxMCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI3NDciIHk9IjE0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwO2ZpbGw6ICNjOWNmZDgiPmV4cHJlc3Npb248L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXdlaWdodDo3MDA7ZmlsbDogI2M5Y2ZkOCI+aW5kZXggLyBHU0k8L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+KyBfc3RybSBvdXRib3g8L3RleHQ+Cjx0ZXh0IHg9Ijc0NyIgeT0iMTkxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cGVyIHN0cmVhbWVkIHRhYmxlPC90ZXh0Pgo8L3N2Zz4=" alt="Architecture: the app's DynamoDB SDK calls a stateless Rust Tensor9 adapter, which serves the API from PostgreSQL. Postgres holds all state: each DynamoDB table is its own physical relation ddb_name in one database, an authoritative ddb_tables registry relation, a native per-table expression index per declared GSI, and a co-located _strm outbox relation per streamed table." />
</div>

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgUG9zdGdyZXMgcGh5c2ljYWwgcGxhbiwgd2hvc2UgcmVhZHMgZXhlY3V0ZSBhcyBvbmUgU1FMIHN0YXRlbWVudCBhbmQgd2hvc2Ugd3JpdGVzIHJ1biBhcyBvbmUgdHJhbnNhY3Rpb24uIFBvc3RncmVzIGhvbGRzIGEgcmVsYXRpb24gcGVyIER5bmFtb0RCIHRhYmxlIHBsdXMgYSBuYXRpdmUgZXhwcmVzc2lvbiBpbmRleCBwZXIgZGVjbGFyZWQgc2Vjb25kYXJ5IGluZGV4LiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYXBnMSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPgo8bWFya2VyIGlkPSJhcGcyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDU5NjY5Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQwIiB3aWR0aD0iMzkyIiBoZWlnaHQ9IjE0MCIgcng9IjE0IiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMzNGQzOTkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzIiIHk9IjMwIiBmaWxsPSIjMTU4MDNkIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+VEhFIEFEQVBURVI8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iODMiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YiI+RHluYW1vREIgQVBJPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj50aGUgcmVxdWVzdDwvdGV4dD4KPGxpbmUgeDE9IjEzNiIgeTE9Ijg3IiB4Mj0iMTU4IiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYXBnMikiLz4KPHJlY3QgeD0iMTY0IiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMjE3IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPkxvZ2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMjE3IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmJhY2tlbmQtbmV1dHJhbDwvdGV4dD4KPGxpbmUgeDE9IjI3MCIgeTE9Ijg3IiB4Mj0iMjkyIiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYXBnMikiLz4KPHJlY3QgeD0iMjk4IiB5PSI2NCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMzQ4IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPlBoeXNpY2FsIHBsYW48L3RleHQ+Cjx0ZXh0IHg9IjM0OCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5Qb3N0Z3Jlcy1zcGVjaWZpYzwvdGV4dD4KPHRleHQgeD0iMjEyIiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5yZWFkczogb25lIFNRTCBzdGF0ZW1lbnQgwrcgd3JpdGVzOiBvbmUgdHJhbnNhY3Rpb248L3RleHQ+CjxsaW5lIHgxPSI0MTIiIHkxPSI4NyIgeDI9IjQ1MiIgeTI9Ijg3IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2FwZzEpIi8+CjxyZWN0IHg9IjQ1OCIgeT0iNDAiIHdpZHRoPSIzNjIiIGhlaWdodD0iMTQwIiByeD0iMTQiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSI0NzQiIHk9IjMwIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+UE9TVEdSRVNRTDwvdGV4dD4KPHJlY3QgeD0iNDc2IiB5PSI2NCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI0NCIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNTUxIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPkEgcmVsYXRpb24gcGVyIHRhYmxlPC90ZXh0Pgo8dGV4dCB4PSI1NTEiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+ZGRiXyZsdDtuYW1lJmd0OzwvdGV4dD4KPHJlY3QgeD0iNjQyIiB5PSI2NCIgd2lkdGg9IjE2MiIgaGVpZ2h0PSI0NCIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNzIzIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM2NDc0OGIiPk5hdGl2ZSBHU0kgaW5kZXhlczwvdGV4dD4KPHRleHQgeD0iNzIzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9uZSBleHByZXNzaW9uIGluZGV4IGVhY2g8L3RleHQ+Cjx0ZXh0IHg9IjYzOSIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b25lIGRhdGFiYXNlIGZvciB0aGUgc3RhY2s8L3RleHQ+Cjwvc3ZnPg==" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Postgres physical plan, whose reads execute as one SQL statement and whose writes run as one transaction. Postgres holds a relation per DynamoDB table plus a native expression index per declared secondary index." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIHJlcXVlc3QgaXMgY29tcGlsZWQgaW4gdHdvIHN0YWdlczogdGhlIER5bmFtb0RCIEFQSSByZXF1ZXN0IGJlY29tZXMgYSBiYWNrZW5kLW5ldXRyYWwgbG9naWNhbCBwbGFuLCB0aGVuIGEgUG9zdGdyZXMgcGh5c2ljYWwgcGxhbiwgd2hvc2UgcmVhZHMgZXhlY3V0ZSBhcyBvbmUgU1FMIHN0YXRlbWVudCBhbmQgd2hvc2Ugd3JpdGVzIHJ1biBhcyBvbmUgdHJhbnNhY3Rpb24uIFBvc3RncmVzIGhvbGRzIGEgcmVsYXRpb24gcGVyIER5bmFtb0RCIHRhYmxlIHBsdXMgYSBuYXRpdmUgZXhwcmVzc2lvbiBpbmRleCBwZXIgZGVjbGFyZWQgc2Vjb25kYXJ5IGluZGV4LiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz4KPG1hcmtlciBpZD0iYXBnMSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPgo8bWFya2VyIGlkPSJhcGcyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2LjUiIG1hcmtlckhlaWdodD0iNi41IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMjBmN2I0Ii8+PC9tYXJrZXI+CjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQwIiB3aWR0aD0iMzkyIiBoZWlnaHQ9IjE0MCIgcng9IjE0IiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMzNGQzOTkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzIiIHk9IjMwIiBmaWxsPSIjMzlkZTc3IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+VEhFIEFEQVBURVI8L3RleHQ+CjxyZWN0IHg9IjMwIiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iODMiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+RHluYW1vREIgQVBJPC90ZXh0Pgo8dGV4dCB4PSI4MyIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij50aGUgcmVxdWVzdDwvdGV4dD4KPGxpbmUgeDE9IjEzNiIgeTE9Ijg3IiB4Mj0iMTU4IiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYXBnMikiLz4KPHJlY3QgeD0iMTY0IiB5PSI2NCIgd2lkdGg9IjEwNiIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMjE3IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPkxvZ2ljYWwgcGxhbjwvdGV4dD4KPHRleHQgeD0iMjE3IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmJhY2tlbmQtbmV1dHJhbDwvdGV4dD4KPGxpbmUgeDE9IjI3MCIgeTE9Ijg3IiB4Mj0iMjkyIiB5Mj0iODciIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYXBnMikiLz4KPHJlY3QgeD0iMjk4IiB5PSI2NCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0NiIgcng9IjkiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMzQ4IiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPlBoeXNpY2FsIHBsYW48L3RleHQ+Cjx0ZXh0IHg9IjM0OCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5Qb3N0Z3Jlcy1zcGVjaWZpYzwvdGV4dD4KPHRleHQgeD0iMjEyIiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5yZWFkczogb25lIFNRTCBzdGF0ZW1lbnQgwrcgd3JpdGVzOiBvbmUgdHJhbnNhY3Rpb248L3RleHQ+CjxsaW5lIHgxPSI0MTIiIHkxPSI4NyIgeDI9IjQ1MiIgeTI9Ijg3IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2FwZzEpIi8+CjxyZWN0IHg9IjQ1OCIgeT0iNDAiIHdpZHRoPSIzNjIiIGhlaWdodD0iMTQwIiByeD0iMTQiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSI0NzQiIHk9IjMwIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+UE9TVEdSRVNRTDwvdGV4dD4KPHJlY3QgeD0iNDc2IiB5PSI2NCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI0NCIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNTUxIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPkEgcmVsYXRpb24gcGVyIHRhYmxlPC90ZXh0Pgo8dGV4dCB4PSI1NTEiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+ZGRiXyZsdDtuYW1lJmd0OzwvdGV4dD4KPHJlY3QgeD0iNjQyIiB5PSI2NCIgd2lkdGg9IjE2MiIgaGVpZ2h0PSI0NCIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNzIzIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPk5hdGl2ZSBHU0kgaW5kZXhlczwvdGV4dD4KPHRleHQgeD0iNzIzIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9uZSBleHByZXNzaW9uIGluZGV4IGVhY2g8L3RleHQ+Cjx0ZXh0IHg9IjYzOSIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+b25lIGRhdGFiYXNlIGZvciB0aGUgc3RhY2s8L3RleHQ+Cjwvc3ZnPg==" alt="A request is compiled in two stages: the DynamoDB API request becomes a backend-neutral logical plan, then a Postgres physical plan, whose reads execute as one SQL statement and whose writes run as one transaction. Postgres holds a relation per DynamoDB table plus a native expression index per declared secondary index." />
</div>

<p className="t9-caption">A stateless Rust adapter serves the DynamoDB API in front of Postgres; all durable state lives in one Postgres database, where each DynamoDB table is its own physical relation.</p>

<p className="t9-caption">The adapter first builds a storage-independent request plan, then converts it to a Postgres-specific plan for execution.</p>

#### Schemas

A DynamoDB item occupies one PostgreSQL row with columns `pk TEXT`, `sk TEXT`, `okey TEXT` and `item JSONB`. The `PRIMARY KEY (pk, sk)` index serves `GetItem`. A separate index over `pk` and bytewise-collated `okey` serves ordered base-table `Query` requests.

The `item JSONB` column preserves DynamoDB's typed attribute representation, including `{"N":"123.45"}`, `{"B":"<b64>"}`, and typed sets. Numbers remain decimal strings, so a 38-digit amount or a Snowflake ID is not rounded through a floating-point conversion. Type tags preserve the distinction between numbers and numeric strings. Conditional writes use row locks, not a separate version column. Enabling TTL builds an expression index over the configured epoch attribute inside the JSONB item. A bounded, leader-elected reaper deletes eligible rows through that index. Expired items remain readable until physical deletion; reads do not filter on TTL.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIER5bmFtb0RCIGl0ZW0gYmVjb21lcyBvbmUgcm93OiBwayBURVhULCBzayBURVhULCBva2V5IFRFWFQgYW5kIGl0ZW0gSlNPTkIsIHdpdGggUFJJTUFSWSBLRVkgKHBrLCBzaykuIFRoZSBva2V5IGNvbHVtbiBwcmVzZXJ2ZXMgc29ydCBvcmRlci4gVGhlIHdob2xlIGl0ZW0gbGl2ZXMgaW4gSlNPTkIgaW4gaXRzIER5bmFtb0RCIHdpcmUgZm9ybSwgc28gYSBudW1iZXIga2VlcHMgaXRzIGV4YWN0IGRlY2ltYWwgdGV4dCBpbnN0ZWFkIG9mIGJlY29taW5nIGEgZmxvYXQuIFRUTCB1c2VzIGFuIGV4cHJlc3Npb24gaW5kZXggb3ZlciB0aGUgaXRlbSwgbm90IGEgc2VwYXJhdGUgY29sdW1uLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJhMyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDU5NjY5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8dGV4dCB4PSIyNiIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiM2NDc0OGIiPkRZTkFNT0RCIElURU08L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSI0MiIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxODAiIHJ4PSIxMiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI0NCIgeT0iNzQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPiYjMTIzOzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9Ijk4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4icGsiOiAgICAmIzEyMzsgIlMiOiAidXNlciM0MiIgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iMTIyIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4ic2siOiAgICAmIzEyMzsgIlMiOiAib3JkZXIjNyIgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iMTQ2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojYjQ1MzA5Ij4idG90YWwiOiAmIzEyMzsgIk4iOiAiMTIzLjQ1IiAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjYwIiB5PSIxNzAiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPiJ0YWdzIjogICYjMTIzOyAiU1MiOiBbInZpcCJdICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNDQiIHk9IjE5NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+JiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0NCIgeT0iMjE0IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZmlsbDojYjQ1MzA5Ij5OIGlzIGV4YWN0IGRlY2ltYWwsIG5vdCBhIGZsb2F0PC90ZXh0Pgo8bGluZSB4MT0iMzM0IiB5MT0iMTMyIiB4Mj0iMzg2IiB5Mj0iMTMyIiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhMykiLz4KPHRleHQgeD0iMzYwIiB5PSIxMjMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+c3RvcmU8L3RleHQ+Cjx0ZXh0IHg9IjM5NiIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiMwNDc4NTciPmRkYl9vcmRlcnMgUk9XIMK3IFBSSU1BUlkgS0VZIChwaywgc2spPC90ZXh0Pgo8cmVjdCB4PSIzOTYiIHk9IjQyIiB3aWR0aD0iNDE0IiBoZWlnaHQ9IjE5OCIgcng9IjEyIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjQxNCIgeT0iNjYiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPnBrICAgICAgICA8dHNwYW4gc3R5bGU9ImZpbGw6IzMzNDE1NSI+VEVYVDwvdHNwYW4+ICAgICJ1c2VyIzQyIjwvdGV4dD4KPHRleHQgeD0iNDE0IiB5PSI4OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+c2sgICAgICAgIDx0c3BhbiBzdHlsZT0iZmlsbDojMzM0MTU1Ij5URVhUPC90c3Bhbj4gICAgIm9yZGVyIzciPC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9IjExMCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+aXRlbSAgICAgIDx0c3BhbiBzdHlsZT0iZmlsbDojMzM0MTU1Ij5KU09OQjwvdHNwYW4+PC90ZXh0Pgo8cmVjdCB4PSI0MzAiIHk9IjEyMCIgd2lkdGg9IjM2NiIgaGVpZ2h0PSI1MiIgcng9IjciIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIvPgo8dGV4dCB4PSI0NDQiIHk9IjEzOSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+JiMxMjM7ICJ0b3RhbCI6ICYjMTIzOyAiTiI6ICIxMjMuNDUiICYjMTI1Oyw8L3RleHQ+Cjx0ZXh0IHg9IjQ0NCIgeT0iMTU4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij4gICJ0YWdzIjogJiMxMjM7ICJTUyI6IFsidmlwIl0gJiMxMjU7LCDigKYgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9IjE5NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+b2tleSAgICAgIDx0c3BhbiBzdHlsZT0iZmlsbDojMzM0MTU1Ij5URVhUPC90c3Bhbj4gICAgcHJlc2VydmVzIHNvcnQgb3JkZXI8L3RleHQ+Cjx0ZXh0IHg9IjQxNCIgeT0iMjE2IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZmlsbDojNDc1NTY5Ij5UVEw6IGV4cHJlc3Npb24gaW5kZXggb3ZlciBpdGVtIEpTT05CPC90ZXh0Pgo8L3N2Zz4=" alt="A DynamoDB item becomes one row: pk TEXT, sk TEXT, okey TEXT and item JSONB, with PRIMARY KEY (pk, sk). The okey column preserves sort order. The whole item lives in JSONB in its DynamoDB wire form, so a number keeps its exact decimal text instead of becoming a float. TTL uses an expression index over the item, not a separate column." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIER5bmFtb0RCIGl0ZW0gYmVjb21lcyBvbmUgcm93OiBwayBURVhULCBzayBURVhULCBva2V5IFRFWFQgYW5kIGl0ZW0gSlNPTkIsIHdpdGggUFJJTUFSWSBLRVkgKHBrLCBzaykuIFRoZSBva2V5IGNvbHVtbiBwcmVzZXJ2ZXMgc29ydCBvcmRlci4gVGhlIHdob2xlIGl0ZW0gbGl2ZXMgaW4gSlNPTkIgaW4gaXRzIER5bmFtb0RCIHdpcmUgZm9ybSwgc28gYSBudW1iZXIga2VlcHMgaXRzIGV4YWN0IGRlY2ltYWwgdGV4dCBpbnN0ZWFkIG9mIGJlY29taW5nIGEgZmxvYXQuIFRUTCB1c2VzIGFuIGV4cHJlc3Npb24gaW5kZXggb3ZlciB0aGUgaXRlbSwgbm90IGEgc2VwYXJhdGUgY29sdW1uLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJhMyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMjBmN2I0Ii8+PC9tYXJrZXI+PC9kZWZzPgo8dGV4dCB4PSIyNiIgeT0iMzAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjYzljZmQ4Ij5EWU5BTU9EQiBJVEVNPC90ZXh0Pgo8cmVjdCB4PSIyNiIgeT0iNDIiIHdpZHRoPSIzMDAiIGhlaWdodD0iMTgwIiByeD0iMTIiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNDQiIHk9Ijc0IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+JiMxMjM7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iOTgiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij4icGsiOiAgICAmIzEyMzsgIlMiOiAidXNlciM0MiIgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI2MCIgeT0iMTIyIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+InNrIjogICAgJiMxMjM7ICJTIjogIm9yZGVyIzciICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9IjE0NiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNkZWIyOTAiPiJ0b3RhbCI6ICYjMTIzOyAiTiI6ICIxMjMuNDUiICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNjAiIHk9IjE3MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiJ0YWdzIjogICYjMTIzOyAiU1MiOiBbInZpcCJdICYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNDQiIHk9IjE5NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiYjMTI1OzwvdGV4dD4KPHRleHQgeD0iNDQiIHk9IjIxNCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNkZWIyOTAiPk4gaXMgZXhhY3QgZGVjaW1hbCwgbm90IGEgZmxvYXQ8L3RleHQ+CjxsaW5lIHgxPSIzMzQiIHkxPSIxMzIiIHgyPSIzODYiIHkyPSIxMzIiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2EzKSIvPgo8dGV4dCB4PSIzNjAiIHk9IjEyMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj5zdG9yZTwvdGV4dD4KPHRleHQgeD0iMzk2IiB5PSIzMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPmRkYl9vcmRlcnMgUk9XIMK3IFBSSU1BUlkgS0VZIChwaywgc2spPC90ZXh0Pgo8cmVjdCB4PSIzOTYiIHk9IjQyIiB3aWR0aD0iNDE0IiBoZWlnaHQ9IjE5OCIgcng9IjEyIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjQxNCIgeT0iNjYiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5wayAgICAgICAgPHRzcGFuIHN0eWxlPSJmaWxsOiAjYzljZmQ4Ij5URVhUPC90c3Bhbj4gICAgInVzZXIjNDIiPC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9Ijg4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+c2sgICAgICAgIDx0c3BhbiBzdHlsZT0iZmlsbDogI2M5Y2ZkOCI+VEVYVDwvdHNwYW4+ICAgICJvcmRlciM3IjwvdGV4dD4KPHRleHQgeD0iNDE0IiB5PSIxMTAiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij5pdGVtICAgICAgPHRzcGFuIHN0eWxlPSJmaWxsOiAjYzljZmQ4Ij5KU09OQjwvdHNwYW4+PC90ZXh0Pgo8cmVjdCB4PSI0MzAiIHk9IjEyMCIgd2lkdGg9IjM2NiIgaGVpZ2h0PSI1MiIgcng9IjciIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNjY1MyIvPgo8dGV4dCB4PSI0NDQiIHk9IjEzOSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiYjMTIzOyAidG90YWwiOiAmIzEyMzsgIk4iOiAiMTIzLjQ1IiAmIzEyNTssPC90ZXh0Pgo8dGV4dCB4PSI0NDQiIHk9IjE1OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPiAgInRhZ3MiOiAmIzEyMzsgIlNTIjogWyJ2aXAiXSAmIzEyNTssIOKApiAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjQxNCIgeT0iMTk0IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+b2tleSAgICAgIDx0c3BhbiBzdHlsZT0iZmlsbDogI2M5Y2ZkOCI+VEVYVDwvdHNwYW4+ICAgIHByZXNlcnZlcyBzb3J0IG9yZGVyPC90ZXh0Pgo8dGV4dCB4PSI0MTQiIHk9IjIxNiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPlRUTDogZXhwcmVzc2lvbiBpbmRleCBvdmVyIGl0ZW0gSlNPTkI8L3RleHQ+Cjwvc3ZnPg==" alt="A DynamoDB item becomes one row: pk TEXT, sk TEXT, okey TEXT and item JSONB, with PRIMARY KEY (pk, sk). The okey column preserves sort order. The whole item lives in JSONB in its DynamoDB wire form, so a number keeps its exact decimal text instead of becoming a float. TTL uses an expression index over the item, not a separate column." />
</div>

<p className="t9-caption">Each attribute keeps its DynamoDB type tag inside item JSONB , so \{"N":"123.45"} keeps its exact decimal string.</p>

#### Where tables live

Each DynamoDB table has its own PostgreSQL table, indexes and optional `_strm` change-record table. `CreateTable` creates those database objects and their registry entry; `DeleteTable` drops them. Storage, indexes and vacuum settings can be tuned per table.

The adapter checks a 500-table guardrail per namespace when creating a physical DynamoDB table. Concurrent creates of different tables can exceed that guardrail; it is not a hard PostgreSQL quota. Plan database capacity and table placement for larger deployments. Provisioned instances continue to incur compute costs while idle.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFYWNoIGRlY2xhcmVkIER5bmFtb0RCIHRhYmxlIGlzIGl0cyBvd24gcGh5c2ljYWwgcmVsYXRpb24gaW5zaWRlIG9uZSBQb3N0Z3JlcyBkYXRhYmFzZSwgYWxvbmdzaWRlIHRoZSBhdXRob3JpdGF0aXZlIGRkYl90YWJsZXMgcmVnaXN0cnkgYW5kIGVhY2ggdGFibGUncyBuYXRpdmUgZXhwcmVzc2lvbiBpbmRleGVzLiBUaGUgYWRhcHRlciBhcHBsaWVzIGEgNTAwLXRhYmxlIGd1YXJkcmFpbCBwZXIgbmFtZXNwYWNlLiBMYXJnZXIgZGVwbG95bWVudHMgbmVlZCBjYXBhY2l0eSBhbmQgdGFibGUtcGxhY2VtZW50IHBsYW5uaW5nLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8dGV4dCB4PSIyNiIgeT0iMjgiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiMwNDc4NTciPk9ORSBQT1NUR1JFUyBEQVRBQkFTRSDCtyBwZXItdGFibGUgcGh5c2ljYWwgcmVsYXRpb25zPC90ZXh0Pgo8cmVjdCB4PSIyNiIgeT0iNDAiIHdpZHRoPSI1MjAiIGhlaWdodD0iMTY2IiByeD0iMTQiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHJlY3QgeD0iNDQiIHk9IjY2IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjEyNCIgcng9IjEwIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjExOSIgeT0iODgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTciPmRkYl9vcmRlcnM8L3RleHQ+CjxyZWN0IHg9IjU4IiB5PSIxMDAiIHdpZHRoPSIxMjIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iMTE5IiB5PSIxMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPnJvd3MgKHBrLCBzayk8L3RleHQ+CjxyZWN0IHg9IjU4IiB5PSIxMzIiIHdpZHRoPSIxMjIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iMTE5IiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPkdTSSBleHByIGluZGV4PC90ZXh0Pgo8dGV4dCB4PSIxMTkiIHk9IjE3OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPml0cyBvd24gcmVsYXRpb248L3RleHQ+CjxyZWN0IHg9IjIwNiIgeT0iNjYiIHdpZHRoPSIxNTAiIGhlaWdodD0iMTI0IiByeD0iMTAiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMjgxIiB5PSI4OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+ZGRiX3Nlc3Npb25zPC90ZXh0Pgo8cmVjdCB4PSIyMjAiIHk9IjEwMCIgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSIyODEiIHk9IjExNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+cm93cyAocGssIHNrKTwvdGV4dD4KPHJlY3QgeD0iMjIwIiB5PSIxMzIiIHdpZHRoPSIxMjIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iMjgxIiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPl9zdHJtIG91dGJveDwvdGV4dD4KPHRleHQgeD0iMjgxIiB5PSIxNzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5jcmVhdGVkIGF0IHJ1bnRpbWU8L3RleHQ+CjxyZWN0IHg9IjM2OCIgeT0iNjYiIHdpZHRoPSIxNjAiIGhlaWdodD0iMTI0IiByeD0iMTAiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNDQ4IiB5PSI4OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1NyI+ZGRiX3RhYmxlczwvdGV4dD4KPHJlY3QgeD0iMzgyIiB5PSIxMDAiIHdpZHRoPSIxMzIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iNDQ4IiB5PSIxMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPm9yZGVycyDihpIgcGh5czwvdGV4dD4KPHJlY3QgeD0iMzgyIiB5PSIxMzIiIHdpZHRoPSIxMzIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iNDQ4IiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPnNlc3Npb25zIOKGkiBwaHlzPC90ZXh0Pgo8dGV4dCB4PSI0NDgiIHk9IjE3OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmF1dGhvcml0YXRpdmUgcmVnaXN0cnk8L3RleHQ+Cjx0ZXh0IHg9IjU3NiIgeT0iMjgiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiM2NDc0OGIiPkxhcmdlciB0YWJsZSBzZXRzPC90ZXh0Pgo8cmVjdCB4PSI1NzYiIHk9IjQwIiB3aWR0aD0iMjM2IiBoZWlnaHQ9IjE2NiIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI0IDQiLz4KPHRleHQgeD0iNjk0IiB5PSI2NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZvbnQtd2VpZ2h0OjcwMDtmaWxsOiM0NzU1NjkiPlBsYW4gY2FwYWNpdHkgYW5kIHRhYmxlIHBsYWNlbWVudDwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSI4NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkd1YXJkcmFpbDogNTAwIHRhYmxlcyBwZXIgbmFtZXNwYWNlPC90ZXh0Pgo8cmVjdCB4PSI1OTYiIHk9IjEwMCIgd2lkdGg9IjkyIiBoZWlnaHQ9IjMwIiByeD0iNyIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIi8+Cjx0ZXh0IHg9IjY0MiIgeT0iMTIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojNDc1NTY5Ij5jYXBhY2l0eTwvdGV4dD4KPHJlY3QgeD0iNzAwIiB5PSIxMDAiIHdpZHRoPSI5MiIgaGVpZ2h0PSIzMCIgcng9IjciIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIvPgo8dGV4dCB4PSI3NDYiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+dGFibGUgY291bnQ8L3RleHQ+Cjx0ZXh0IHg9IjY5NCIgeT0iMTUyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+Tm8gYXV0b21hdGljIHBsYWNlbWVudDwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSIxNjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5hY3Jvc3MgZGF0YWJhc2UgaW5zdGFuY2VzPC90ZXh0Pgo8dGV4dCB4PSI2OTQiIHk9IjE5MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnByb3Zpc2lvbmVkIC8gYWx3YXlzLW9uPC90ZXh0Pgo8L3N2Zz4=" alt="Each declared DynamoDB table is its own physical relation inside one Postgres database, alongside the authoritative ddb_tables registry and each table's native expression indexes. The adapter applies a 500-table guardrail per namespace. Larger deployments need capacity and table-placement planning." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFYWNoIGRlY2xhcmVkIER5bmFtb0RCIHRhYmxlIGlzIGl0cyBvd24gcGh5c2ljYWwgcmVsYXRpb24gaW5zaWRlIG9uZSBQb3N0Z3JlcyBkYXRhYmFzZSwgYWxvbmdzaWRlIHRoZSBhdXRob3JpdGF0aXZlIGRkYl90YWJsZXMgcmVnaXN0cnkgYW5kIGVhY2ggdGFibGUncyBuYXRpdmUgZXhwcmVzc2lvbiBpbmRleGVzLiBUaGUgYWRhcHRlciBhcHBsaWVzIGEgNTAwLXRhYmxlIGd1YXJkcmFpbCBwZXIgbmFtZXNwYWNlLiBMYXJnZXIgZGVwbG95bWVudHMgbmVlZCBjYXBhY2l0eSBhbmQgdGFibGUtcGxhY2VtZW50IHBsYW5uaW5nLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8dGV4dCB4PSIyNiIgeT0iMjgiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTBkZWM4Ij5PTkUgUE9TVEdSRVMgREFUQUJBU0UgwrcgcGVyLXRhYmxlIHBoeXNpY2FsIHJlbGF0aW9uczwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQwIiB3aWR0aD0iNTIwIiBoZWlnaHQ9IjE2NiIgcng9IjE0IiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+CjxyZWN0IHg9IjQ0IiB5PSI2NiIgd2lkdGg9IjE1MCIgaGVpZ2h0PSIxMjQiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q2NjUzIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIxMTkiIHk9Ijg4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjOCI+ZGRiX29yZGVyczwvdGV4dD4KPHJlY3QgeD0iNTgiIHk9IjEwMCIgd2lkdGg9IjEyMiIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGU2NiIvPgo8dGV4dCB4PSIxMTkiIHk9IjExNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPnJvd3MgKHBrLCBzayk8L3RleHQ+CjxyZWN0IHg9IjU4IiB5PSIxMzIiIHdpZHRoPSIxMjIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iMTE5IiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5HU0kgZXhwciBpbmRleDwvdGV4dD4KPHRleHQgeD0iMTE5IiB5PSIxNzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5pdHMgb3duIHJlbGF0aW9uPC90ZXh0Pgo8cmVjdCB4PSIyMDYiIHk9IjY2IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjEyNCIgcng9IjEwIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjI4MSIgeT0iODgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij5kZGJfc2Vzc2lvbnM8L3RleHQ+CjxyZWN0IHg9IjIyMCIgeT0iMTAwIiB3aWR0aD0iMTIyIiBoZWlnaHQ9IjI2IiByeD0iNiIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjI4MSIgeT0iMTE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+cm93cyAocGssIHNrKTwvdGV4dD4KPHJlY3QgeD0iMjIwIiB5PSIxMzIiIHdpZHRoPSIxMjIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iMjgxIiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5fc3RybSBvdXRib3g8L3RleHQ+Cjx0ZXh0IHg9IjI4MSIgeT0iMTc4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+Y3JlYXRlZCBhdCBydW50aW1lPC90ZXh0Pgo8cmVjdCB4PSIzNjgiIHk9IjY2IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjEyNCIgcng9IjEwIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjQ0OCIgeT0iODgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4Ij5kZGJfdGFibGVzPC90ZXh0Pgo8cmVjdCB4PSIzODIiIHk9IjEwMCIgd2lkdGg9IjEzMiIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGU2NiIvPgo8dGV4dCB4PSI0NDgiIHk9IjExNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPm9yZGVycyDihpIgcGh5czwvdGV4dD4KPHJlY3QgeD0iMzgyIiB5PSIxMzIiIHdpZHRoPSIxMzIiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iNDQ4IiB5PSIxNDkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5zZXNzaW9ucyDihpIgcGh5czwvdGV4dD4KPHRleHQgeD0iNDQ4IiB5PSIxNzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5hdXRob3JpdGF0aXZlIHJlZ2lzdHJ5PC90ZXh0Pgo8dGV4dCB4PSI1NzYiIHk9IjI4IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogI2M5Y2ZkOCI+TGFyZ2VyIHRhYmxlIHNldHM8L3RleHQ+CjxyZWN0IHg9IjU3NiIgeT0iNDAiIHdpZHRoPSIyMzYiIGhlaWdodD0iMTY2IiByeD0iMTQiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjQgNCIvPgo8dGV4dCB4PSI2OTQiIHk9IjY2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZm9udC13ZWlnaHQ6NzAwO2ZpbGw6ICNjOWNmZDgiPlBsYW4gY2FwYWNpdHkgYW5kIHRhYmxlIHBsYWNlbWVudDwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSI4NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkd1YXJkcmFpbDogNTAwIHRhYmxlcyBwZXIgbmFtZXNwYWNlPC90ZXh0Pgo8cmVjdCB4PSI1OTYiIHk9IjEwMCIgd2lkdGg9IjkyIiBoZWlnaHQ9IjMwIiByeD0iNyIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjY0MiIgeT0iMTIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+Y2FwYWNpdHk8L3RleHQ+CjxyZWN0IHg9IjcwMCIgeT0iMTAwIiB3aWR0aD0iOTIiIGhlaWdodD0iMzAiIHJ4PSI3IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iNzQ2IiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij50YWJsZSBjb3VudDwvdGV4dD4KPHRleHQgeD0iNjk0IiB5PSIxNTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5ObyBhdXRvbWF0aWMgcGxhY2VtZW50PC90ZXh0Pgo8dGV4dCB4PSI2OTQiIHk9IjE2OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmFjcm9zcyBkYXRhYmFzZSBpbnN0YW5jZXM8L3RleHQ+Cjx0ZXh0IHg9IjY5NCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cHJvdmlzaW9uZWQgLyBhbHdheXMtb248L3RleHQ+Cjwvc3ZnPg==" alt="Each declared DynamoDB table is its own physical relation inside one Postgres database, alongside the authoritative ddb_tables registry and each table's native expression indexes. The adapter applies a 500-table guardrail per namespace. Larger deployments need capacity and table-placement planning." />
</div>

<p className="t9-caption">Each declared table is its own physical relation. CreateTable and DeleteTable create and drop PostgreSQL relations. The adapter applies a 500-table guardrail per namespace.</p>

#### Conditional writes

To evaluate a conditional write, the adapter locks the item's `(pk, sk)` row with `SELECT … FOR UPDATE`, checks the `ConditionExpression` against that row, then writes and commits. The lock prevents another writer from changing the item between the check and write.

A false condition returns the non-retryable `ConditionalCheckFailed` error. A PostgreSQL serialization failure or lock timeout (`40001`/lock-not-available) instead returns a retryable throughput error, allowing the SDK to back off and retry. Concurrency failures are not reported as failed conditions.

For `attribute_not_exists(pk)`, the PostgreSQL primary-key constraint prevents two concurrent requests from creating the same item. Only one insert can succeed for a given `(pk, sk)`.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIGNvbmRpdGlvbmFsIHdyaXRlIHRha2VzIGEgcm93IGxvY2sgd2l0aCBTRUxFQ1QgZm9yIHVwZGF0ZSwgZXZhbHVhdGVzIHRoZSBEeW5hbW9EQiBjb25kaXRpb24gaW5zaWRlIHRoZSBsYXllciBhZ2FpbnN0IHRoZSBsb2NrZWQgcm93LCB0aGVuIHdyaXRlcyBhbmQgY29tbWl0cy4gQSBmYWxzZSBjb25kaXRpb24gcmV0dXJucyBhIGZhaXRoZnVsIENvbmRpdGlvbmFsQ2hlY2tGYWlsZWQ7IGEgbG9zaW5nIGNvbmN1cnJlbmN5IHJhY2UgcmV0dXJucyBhIHJldHJ5YWJsZSBjb25mbGljdCwgbmV2ZXIgYSBzcHVyaW91cyBjb25kaXRpb24gZmFpbHVyZS4gVW5pcXVlIGNyZWF0aW9uIGlzIGVuZm9yY2VkIGJ5IHRoZSBwcmltYXJ5IGtleS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0iYTUiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPGNpcmNsZSBjeD0iNDAiIGN5PSI2MCIgcj0iMTMiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48dGV4dCB4PSI0MCIgeT0iNjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+MTwvdGV4dD4KPHJlY3QgeD0iNjIiIHk9IjQyIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjQ4IiByeD0iMTAiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iNzYiIHk9IjYyIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+TG9jayBjdXJyZW50IHJvdzwvdGV4dD4KPHRleHQgeD0iNzYiIHk9Ijc5IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+PHRzcGFuIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPlNFTEVDVCDigKYgRk9SIFVQREFURTwvdHNwYW4+PC90ZXh0Pgo8bGluZSB4MT0iMTcyIiB5MT0iOTAiIHgyPSIxNzIiIHkyPSIxMTIiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYTUpIi8+CjxjaXJjbGUgY3g9IjQwIiBjeT0iMTM0IiByPSIxMyIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPjx0ZXh0IHg9IjQwIiB5PSIxMzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+MjwvdGV4dD4KPHJlY3QgeD0iNjIiIHk9IjExNiIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjEwIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijc2IiB5PSIxMzYiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTIuNXB4Ij5FdmFsdWF0ZSBjb25kaXRpb248L3RleHQ+Cjx0ZXh0IHg9Ijc2IiB5PSIxNTMiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPmFnYWluc3QgdGhlIGxvY2tlZCByb3c8L3RleHQ+CjxsaW5lIHgxPSIxNzIiIHkxPSIxNjQiIHgyPSIxNzIiIHkyPSIxODYiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYTUpIi8+CjxjaXJjbGUgY3g9IjQwIiBjeT0iMjA4IiByPSIxMyIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPjx0ZXh0IHg9IjQwIiB5PSIyMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+MzwvdGV4dD4KPHJlY3QgeD0iNjIiIHk9IjE5MCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI0OCIgcng9IjEwIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9Ijc2IiB5PSIyMTAiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTIuNXB4Ij5Xcml0ZSAmYW1wOyBDT01NSVQ8L3RleHQ+Cjx0ZXh0IHg9Ijc2IiB5PSIyMjciIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj50aGUgbG9jayByZWxlYXNlcyBhdG9taWNhbGx5PC90ZXh0Pgo8bGluZSB4MT0iMjgyIiB5MT0iMTQwIiB4Mj0iMzU0IiB5Mj0iMTQwIiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2E1KSIvPgo8cmVjdCB4PSIzNTYiIHk9IjExOCIgd2lkdGg9IjM0MCIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyNiIgeT0iMTM2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEycHgiPmNvbmRpdGlvbiBmYWxzZSDihpI8L3RleHQ+Cjx0ZXh0IHg9IjUyNiIgeT0iMTUyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5Db25kaXRpb25hbENoZWNrRmFpbGVkPC90ZXh0Pgo8bGluZSB4MT0iMjgyIiB5MT0iMjE0IiB4Mj0iMzU0IiB5Mj0iMjE0IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2E1KSIvPgo8cmVjdCB4PSIzNTYiIHk9IjE5MiIgd2lkdGg9IjM0MCIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjZmZmYmViIiBzdHJva2U9IiNmZGU2OGEiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyNiIgeT0iMjEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDo2MDAgMTJweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6I2I0NTMwOSI+bG9jayB0aW1lb3V0IC8gNDAwMDEg4oaSPC90ZXh0Pgo8dGV4dCB4PSI1MjYiIHk9IjIyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6I2I0NTMwOSI+cmV0cnlhYmxlIGNvbmZsaWN0LCBub3QgYSBjb25kaXRpb24gZmFpbHVyZTwvdGV4dD4KPC9zdmc+" alt="A conditional write takes a row lock with SELECT for update, evaluates the DynamoDB condition inside the layer against the locked row, then writes and commits. A false condition returns a faithful ConditionalCheckFailed; a losing concurrency race returns a retryable conflict, never a spurious condition failure. Unique creation is enforced by the primary key." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIGNvbmRpdGlvbmFsIHdyaXRlIHRha2VzIGEgcm93IGxvY2sgd2l0aCBTRUxFQ1QgZm9yIHVwZGF0ZSwgZXZhbHVhdGVzIHRoZSBEeW5hbW9EQiBjb25kaXRpb24gaW5zaWRlIHRoZSBsYXllciBhZ2FpbnN0IHRoZSBsb2NrZWQgcm93LCB0aGVuIHdyaXRlcyBhbmQgY29tbWl0cy4gQSBmYWxzZSBjb25kaXRpb24gcmV0dXJucyBhIGZhaXRoZnVsIENvbmRpdGlvbmFsQ2hlY2tGYWlsZWQ7IGEgbG9zaW5nIGNvbmN1cnJlbmN5IHJhY2UgcmV0dXJucyBhIHJldHJ5YWJsZSBjb25mbGljdCwgbmV2ZXIgYSBzcHVyaW91cyBjb25kaXRpb24gZmFpbHVyZS4gVW5pcXVlIGNyZWF0aW9uIGlzIGVuZm9yY2VkIGJ5IHRoZSBwcmltYXJ5IGtleS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0iYTUiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPGNpcmNsZSBjeD0iNDAiIGN5PSI2MCIgcj0iMTMiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48dGV4dCB4PSI0MCIgeT0iNjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMCI+MTwvdGV4dD4KPHJlY3QgeD0iNjIiIHk9IjQyIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjQ4IiByeD0iMTAiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iNzYiIHk9IjYyIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+TG9jayBjdXJyZW50IHJvdzwvdGV4dD4KPHRleHQgeD0iNzYiIHk9Ijc5IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+PHRzcGFuIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5TRUxFQ1Qg4oCmIEZPUiBVUERBVEU8L3RzcGFuPjwvdGV4dD4KPGxpbmUgeDE9IjE3MiIgeTE9IjkwIiB4Mj0iMTcyIiB5Mj0iMTEyIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2E1KSIvPgo8Y2lyY2xlIGN4PSI0MCIgY3k9IjEzNCIgcj0iMTMiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48dGV4dCB4PSI0MCIgeT0iMTM4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXdlaWdodDo3MDAiPjI8L3RleHQ+CjxyZWN0IHg9IjYyIiB5PSIxMTYiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDgiIHJ4PSIxMCIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI3NiIgeT0iMTM2IiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEyLjVweCI+RXZhbHVhdGUgY29uZGl0aW9uPC90ZXh0Pgo8dGV4dCB4PSI3NiIgeT0iMTUzIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5hZ2FpbnN0IHRoZSBsb2NrZWQgcm93PC90ZXh0Pgo8bGluZSB4MT0iMTcyIiB5MT0iMTY0IiB4Mj0iMTcyIiB5Mj0iMTg2IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2E1KSIvPgo8Y2lyY2xlIGN4PSI0MCIgY3k9IjIwOCIgcj0iMTMiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48dGV4dCB4PSI0MCIgeT0iMjEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXdlaWdodDo3MDAiPjM8L3RleHQ+CjxyZWN0IHg9IjYyIiB5PSIxOTAiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDgiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSI3NiIgeT0iMjEwIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+V3JpdGUgJmFtcDsgQ09NTUlUPC90ZXh0Pgo8dGV4dCB4PSI3NiIgeT0iMjI3IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+dGhlIGxvY2sgcmVsZWFzZXMgYXRvbWljYWxseTwvdGV4dD4KPGxpbmUgeDE9IjI4MiIgeTE9IjE0MCIgeDI9IjM1NCIgeTI9IjE0MCIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhNSkiLz4KPHJlY3QgeD0iMzU2IiB5PSIxMTgiIHdpZHRoPSIzNDAiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjYiIHk9IjEzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtc2l6ZToxMnB4Ij5jb25kaXRpb24gZmFsc2Ug4oaSPC90ZXh0Pgo8dGV4dCB4PSI1MjYiIHk9IjE1MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+Q29uZGl0aW9uYWxDaGVja0ZhaWxlZDwvdGV4dD4KPGxpbmUgeDE9IjI4MiIgeTE9IjIxNCIgeDI9IjM1NCIgeTI9IjIxNCIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhNSkiLz4KPHJlY3QgeD0iMzU2IiB5PSIxOTIiIHdpZHRoPSIzNDAiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iIzMxMmQxYSIgc3Ryb2tlPSIjNjY1ZDNkIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjYiIHk9IjIxMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjAwIDEycHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiAjZGViMjkwIj5sb2NrIHRpbWVvdXQgLyA0MDAwMSDihpI8L3RleHQ+Cjx0ZXh0IHg9IjUyNiIgeT0iMjI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2RlYjI5MCI+cmV0cnlhYmxlIGNvbmZsaWN0LCBub3QgYSBjb25kaXRpb24gZmFpbHVyZTwvdGV4dD4KPC9zdmc+" alt="A conditional write takes a row lock with SELECT for update, evaluates the DynamoDB condition inside the layer against the locked row, then writes and commits. A false condition returns a faithful ConditionalCheckFailed; a losing concurrency race returns a retryable conflict, never a spurious condition failure. Unique creation is enforced by the primary key." />
</div>

<p className="t9-caption">Failed conditions and PostgreSQL concurrency conflicts return different error types.</p>

#### Secondary indexes

On each write, the adapter adds two index fields to the item's JSONB. The partition-key field, `_idx_<name>_h`, normalizes equivalent values such as `1` and `1.0`. The sort-key field, `_idx_<name>_o`, preserves sort order and uses the base key to break ties. A PostgreSQL expression index over these fields locates matching partition keys. The adapter then evaluates sort-key conditions, ordering, pagination, and any `FilterExpression` over the retrieved items.

The index fields and item commit in the same transaction, so GSI queries are strongly consistent. DynamoDB's own GSIs update asynchronously and are eventually consistent. Each index lookup is limited to 10,000 candidate items for one index partition-key value. Exceeding this limit returns an error; choose index keys with this limit in mind.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjEwIiB2aWV3Qm94PSIwIDAgODM2IDIxMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJPbiBlYWNoIHdyaXRlIHRoZSBsYXllciBzdGFtcHMgYSBub3JtYWxpemVkLWhhc2ggZmllbGQgYW5kIGEgY29sbGF0ZWQtcmFuZ2UgZmllbGQgaW50byB0aGUgaXRlbSdzIEpTT05CLCBhbmQgUG9zdGdyZXMgbWFpbnRhaW5zIGEgbmF0aXZlIGV4cHJlc3Npb24gaW5kZXggb3ZlciB0aGVtLiBBIEdTSSBxdWVyeSBpcyBhbiBpbmRleCBzZWVrIGJ5IHRoZSBzdGFtcGVkIGhhc2ggcGx1cyBmaWx0ZXJpbmcgaW4gdGhlIGFkYXB0ZXIuIFRoZSBzdGFtcHMgY28tY29tbWl0IHdpdGggdGhlIGl0ZW0sIHNvIHRoZSBpbmRleCBpcyBzdHJvbmdseSBjb25zaXN0ZW50LiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJhNiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDU5NjY5Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImE2cSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjNjM2NmYxIi8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB4PSIyNiIgeT0iNDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNTgiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMDEiIHk9IjY1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+UHV0SXRlbTwvdGV4dD4KPHRleHQgeD0iMTAxIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnN0YXR1cyA9IFNISVBQRUQ8L3RleHQ+CjxsaW5lIHgxPSIxNzYiIHkxPSI2OSIgeDI9IjIzMiIgeTI9IjY5IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhNikiLz4KPHRleHQgeD0iMjA0IiB5PSI2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC13ZWlnaHQ6NzAwIj5pbmRleCBrZXlzPC90ZXh0Pgo8cmVjdCB4PSIyMzYiIHk9IjM0IiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjcwIiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iMzI2IiB5PSI1OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtc2l6ZToxMnB4Ij5pdGVtIEpTT05CPC90ZXh0Pgo8dGV4dCB4PSIzMjYiIHk9Ijc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij4rIF9pZHhfeF9oICAobm9ybS4gaGFzaCk8L3RleHQ+Cjx0ZXh0IHg9IjMyNiIgeT0iOTEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPisgX2lkeF94X28gIChjb2xsYXRlZCByYW5nZSk8L3RleHQ+CjxsaW5lIHgxPSIzMjYiIHkxPSIxMDQiIHgyPSIzMjYiIHkyPSIxMzIiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2E2KSIvPgo8dGV4dCB4PSIzMzgiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC13ZWlnaHQ6NzAwIj5zYW1lIHRyYW5zYWN0aW9uPC90ZXh0Pgo8cmVjdCB4PSIyMzYiIHk9IjEzNCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI2MCIgcng9IjEyIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjMyNiIgeT0iMTU4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjExLjVweCI+bmF0aXZlIGV4cHJlc3Npb24gaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjMyNiIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojNDc1NTY5Ij5vbiAoX2lkeF94X2gsIF9pZHhfeF9vKTwvdGV4dD4KPHJlY3QgeD0iNTAwIiB5PSI0MCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI1OCIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjU3NSIgeT0iNjUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTIuNXB4Ij5RdWVyeSBHU0k8L3RleHQ+Cjx0ZXh0IHg9IjU3NSIgeT0iODMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5zdGF0dXMgPSBTSElQUEVEPC90ZXh0Pgo8bGluZSB4MT0iNTc1IiB5MT0iOTgiIHgyPSI1NzUiIHkyPSIxNjQiIHN0cm9rZT0iIzYzNjZmMSIgc3Ryb2tlLXdpZHRoPSIxLjgiLz4KPGxpbmUgeDE9IjU3NSIgeTE9IjE2NCIgeDI9IjQxOCIgeTI9IjE2NCIgc3Ryb2tlPSIjNjM2NmYxIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhNnEpIi8+Cjx0ZXh0IHg9IjQ5NiIgeT0iMTU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMHB4ICdTRiBNb25vJyxNZW5sbyxtb25vc3BhY2U7ZmlsbDojNjM2NmYxIj5pbmRleCBsb29rdXAgKyBmaWx0ZXI8L3RleHQ+Cjx0ZXh0IHg9IjY5MCIgeT0iNzAiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmaWxsOiM0NzU1Njk7Zm9udC13ZWlnaHQ6NjAwIj5TdHJvbmdseSBjb25zaXN0ZW50OjwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSI5MCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnRoZSBpdGVtIGFuZCBpbmRleDwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSIxMDYiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5jb21taXQgdG9nZXRoZXIuPC90ZXh0Pgo8dGV4dCB4PSI2OTAiIHk9IjEzMCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkR5bmFtb0RCIEdTSXMgYXJlPC90ZXh0Pgo8dGV4dCB4PSI2OTAiIHk9IjE0NiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmV2ZW50dWFsbHkgY29uc2lzdGVudC48L3RleHQ+Cjwvc3ZnPg==" alt="On each write the layer stamps a normalized-hash field and a collated-range field into the item's JSONB, and Postgres maintains a native expression index over them. A GSI query is an index seek by the stamped hash plus filtering in the adapter. The stamps co-commit with the item, so the index is strongly consistent." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjEwIiB2aWV3Qm94PSIwIDAgODM2IDIxMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJPbiBlYWNoIHdyaXRlIHRoZSBsYXllciBzdGFtcHMgYSBub3JtYWxpemVkLWhhc2ggZmllbGQgYW5kIGEgY29sbGF0ZWQtcmFuZ2UgZmllbGQgaW50byB0aGUgaXRlbSdzIEpTT05CLCBhbmQgUG9zdGdyZXMgbWFpbnRhaW5zIGEgbmF0aXZlIGV4cHJlc3Npb24gaW5kZXggb3ZlciB0aGVtLiBBIEdTSSBxdWVyeSBpcyBhbiBpbmRleCBzZWVrIGJ5IHRoZSBzdGFtcGVkIGhhc2ggcGx1cyBmaWx0ZXJpbmcgaW4gdGhlIGFkYXB0ZXIuIFRoZSBzdGFtcHMgY28tY29tbWl0IHdpdGggdGhlIGl0ZW0sIHNvIHRoZSBpbmRleCBpcyBzdHJvbmdseSBjb25zaXN0ZW50LiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJhNiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMjBmN2I0Ii8+PC9tYXJrZXI+CjxtYXJrZXIgaWQ9ImE2cSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjNjM2NmYxIi8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB4PSIyNiIgeT0iNDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNTgiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMDEiIHk9IjY1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+UHV0SXRlbTwvdGV4dD4KPHRleHQgeD0iMTAxIiB5PSI4MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnN0YXR1cyA9IFNISVBQRUQ8L3RleHQ+CjxsaW5lIHgxPSIxNzYiIHkxPSI2OSIgeDI9IjIzMiIgeTI9IjY5IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNhNikiLz4KPHRleHQgeD0iMjA0IiB5PSI2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj5pbmRleCBrZXlzPC90ZXh0Pgo8cmVjdCB4PSIyMzYiIHk9IjM0IiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjcwIiByeD0iMTIiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iMzI2IiB5PSI1OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtc2l6ZToxMnB4Ij5pdGVtIEpTT05CPC90ZXh0Pgo8dGV4dCB4PSIzMjYiIHk9Ijc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij4rIF9pZHhfeF9oICAobm9ybS4gaGFzaCk8L3RleHQ+Cjx0ZXh0IHg9IjMyNiIgeT0iOTEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPisgX2lkeF94X28gIChjb2xsYXRlZCByYW5nZSk8L3RleHQ+CjxsaW5lIHgxPSIzMjYiIHkxPSIxMDQiIHgyPSIzMjYiIHkyPSIxMzIiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2E2KSIvPgo8dGV4dCB4PSIzMzgiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj5zYW1lIHRyYW5zYWN0aW9uPC90ZXh0Pgo8cmVjdCB4PSIyMzYiIHk9IjEzNCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI2MCIgcng9IjEyIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjMyNiIgeT0iMTU4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExLjVweCI+bmF0aXZlIGV4cHJlc3Npb24gaW5kZXg8L3RleHQ+Cjx0ZXh0IHg9IjMyNiIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+b24gKF9pZHhfeF9oLCBfaWR4X3hfbyk8L3RleHQ+CjxyZWN0IHg9IjUwMCIgeT0iNDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNTgiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1NzUiIHk9IjY1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEyLjVweCI+UXVlcnkgR1NJPC90ZXh0Pgo8dGV4dCB4PSI1NzUiIHk9IjgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+c3RhdHVzID0gU0hJUFBFRDwvdGV4dD4KPGxpbmUgeDE9IjU3NSIgeTE9Ijk4IiB4Mj0iNTc1IiB5Mj0iMTY0IiBzdHJva2U9IiMzZDNlNjYiIHN0cm9rZS13aWR0aD0iMS44Ii8+CjxsaW5lIHgxPSI1NzUiIHkxPSIxNjQiIHgyPSI0MTgiIHkyPSIxNjQiIHN0cm9rZT0iIzNkM2U2NiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYTZxKSIvPgo8dGV4dCB4PSI0OTYiIHk9IjE1NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTBweCAnU0YgTW9ubycsTWVubG8sbW9ub3NwYWNlO2ZpbGw6ICM2MzY2ZjEiPmluZGV4IGxvb2t1cCArIGZpbHRlcjwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSI3MCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDg7Zm9udC13ZWlnaHQ6NjAwIj5TdHJvbmdseSBjb25zaXN0ZW50OjwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSI5MCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnRoZSBpdGVtIGFuZCBpbmRleDwvdGV4dD4KPHRleHQgeD0iNjkwIiB5PSIxMDYiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5jb21taXQgdG9nZXRoZXIuPC90ZXh0Pgo8dGV4dCB4PSI2OTAiIHk9IjEzMCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkR5bmFtb0RCIEdTSXMgYXJlPC90ZXh0Pgo8dGV4dCB4PSI2OTAiIHk9IjE0NiIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmV2ZW50dWFsbHkgY29uc2lzdGVudC48L3RleHQ+Cjwvc3ZnPg==" alt="On each write the layer stamps a normalized-hash field and a collated-range field into the item's JSONB, and Postgres maintains a native expression index over them. A GSI query is an index seek by the stamped hash plus filtering in the adapter. The stamps co-commit with the item, so the index is strongly consistent." />
</div>

<p className="t9-caption">A GSI uses a PostgreSQL expression index to find candidates, then the adapter filters and orders them. Index updates commit with the item, making GSI queries strongly consistent.</p>

#### Transactions

`TransactWriteItems` executes in one PostgreSQL `BEGIN…COMMIT` transaction at `SERIALIZABLE` isolation. A debit in one table and a credit in another either both commit or both fail, as in DynamoDB.

Transactions enforce DynamoDB's 100-action limit and one-operation-per-item rule. The adapter records `ClientRequestToken` in the same transaction as the writes. Within DynamoDB's idempotency window, a retry with the same token returns the prior success without committing the writes again. The adapter acquires row locks in a consistent order to prevent opposite-direction transfers from deadlocking. Serialization or deadlock failures return retryable conflicts.

`TransactWriteItems` is not supported on stream-enabled tables. A request that touches any such table returns `ValidationException` before execution, because the transaction path does not create the required stream records.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA2IiB2aWV3Qm94PSIwIDAgODM2IDIwNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIFRyYW5zYWN0V3JpdGVJdGVtcyBzcGFubmluZyB0d28gdGFibGVzLCBhIGRlYml0IGluIG9uZSByZWxhdGlvbiBhbmQgYSBjcmVkaXQgaW4gYW5vdGhlciwgY29tbWl0cyBhdG9taWNhbGx5IGluIG9uZSBCRUdJTuKApkNPTU1JVCBhdCBTRVJJQUxJWkFCTEUgaXNvbGF0aW9uLCBleGFjdGx5IGxpa2UgcmVhbCBEeW5hbW9EQi4gIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImE3IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwNTk2NjkiLz48L21hcmtlcj48L2RlZnM+Cjx0ZXh0IHg9IjI2IiB5PSIyOCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzA0Nzg1NyI+Q1JPU1MtVEFCTEUg4oaSIE9ORSBBVE9NSUMgQ09NTUlUPC90ZXh0Pgo8cmVjdCB4PSIyNiIgeT0iNDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iMTI2IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMTAxIiB5PSI2NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5UcmFuc2FjdFdyaXRlPC90ZXh0Pgo8cmVjdCB4PSI0MCIgeT0iNzgiIHdpZHRoPSIxMjIiIGhlaWdodD0iMzQiIHJ4PSI3IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iMTAxIiB5PSI5MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OSI+ZGViaXQ8L3RleHQ+Cjx0ZXh0IHg9IjEwMSIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMDU5NjY5Ij5kZGJfYWNjb3VudHM8L3RleHQ+CjxyZWN0IHg9IjQwIiB5PSIxMTgiIHdpZHRoPSIxMjIiIGhlaWdodD0iMzQiIHJ4PSI3IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNlMmU4ZjAiLz4KPHRleHQgeD0iMTAxIiB5PSIxMzMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1NjkiPmNyZWRpdDwvdGV4dD4KPHRleHQgeD0iMTAxIiB5PSIxNDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNTk2NjkiPmRkYl9sZWRnZXI8L3RleHQ+CjxsaW5lIHgxPSIxNzYiIHkxPSIxMDMiIHgyPSIyMzYiIHkyPSIxMDMiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2E3KSIvPgo8dGV4dCB4PSIyMDYiIHk9Ijk0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDAiPm9uZSB0eG48L3RleHQ+CjxyZWN0IHg9IjI0MCIgeT0iNTIiIHdpZHRoPSIyMjgiIGhlaWdodD0iMTAyIiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iMzU0IiB5PSI3OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtc2l6ZToxMnB4Ij5CRUdJTiDigKYgQ09NTUlUPC90ZXh0Pgo8dGV4dCB4PSIzNTQiIHk9Ijk2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5TRVJJQUxJWkFCTEUgaXNvbGF0aW9uPC90ZXh0Pgo8dGV4dCB4PSIzNTQiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+Ym90aCByZWxhdGlvbnMsIGF0b21pY2FsbHk8L3RleHQ+Cjx0ZXh0IHg9IjM1NCIgeT0iMTMyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmaWxsOiM0NzU1NjkiPmxvY2stb3JkZXIgc29ydCBhdm9pZHMgZGVhZGxvY2s8L3RleHQ+Cjx0ZXh0IHg9IjM1NCIgeT0iMTQ2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmaWxsOiM0NzU1NjkiPkNsaWVudFJlcXVlc3RUb2tlbiDihpIgY29tbWl0cyBvbmNlPC90ZXh0Pgo8bGluZSB4MT0iNDg0IiB5MT0iMzQiIHgyPSI0ODQiIHkyPSIxNzIiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iNTA4IiB5PSI2NiIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4O2ZpbGw6IzA0Nzg1NyI+Q3Jvc3MtdGFibGUgQUNJRDwvdGV4dD4KPHRleHQgeD0iNTA4IiB5PSI5MCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+RHluYW1vREIgYW5kIHRoaXMgdGFyZ2V0PC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjEwNyIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+Y29tbWl0IGFjcm9zcyB0YWJsZXMuPC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjEyNyIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+U3RyZWFtLWVuYWJsZWQgdGFibGVzPC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjE0NCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+ZG8gbm90IHNlcnZlIHRyYW5zYWN0aW9uPC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjE2MSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6IzQ3NTU2OSI+cmVxdWVzdHMgaW4gdGhpcyBtYXBwaW5nLjwvdGV4dD4KPC9zdmc+" alt="A TransactWriteItems spanning two tables, a debit in one relation and a credit in another, commits atomically in one BEGIN…COMMIT at SERIALIZABLE isolation, exactly like real DynamoDB." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA2IiB2aWV3Qm94PSIwIDAgODM2IDIwNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIFRyYW5zYWN0V3JpdGVJdGVtcyBzcGFubmluZyB0d28gdGFibGVzLCBhIGRlYml0IGluIG9uZSByZWxhdGlvbiBhbmQgYSBjcmVkaXQgaW4gYW5vdGhlciwgY29tbWl0cyBhdG9taWNhbGx5IGluIG9uZSBCRUdJTuKApkNPTU1JVCBhdCBTRVJJQUxJWkFCTEUgaXNvbGF0aW9uLCBleGFjdGx5IGxpa2UgcmVhbCBEeW5hbW9EQi4gIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImE3IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMyMGY3YjQiLz48L21hcmtlcj48L2RlZnM+Cjx0ZXh0IHg9IjI2IiB5PSIyOCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPkNST1NTLVRBQkxFIOKGkiBPTkUgQVRPTUlDIENPTU1JVDwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQwIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjEyNiIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjEwMSIgeT0iNjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+VHJhbnNhY3RXcml0ZTwvdGV4dD4KPHJlY3QgeD0iNDAiIHk9Ijc4IiB3aWR0aD0iMTIyIiBoZWlnaHQ9IjM0IiByeD0iNyIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZTY2Ii8+Cjx0ZXh0IHg9IjEwMSIgeT0iOTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5kZWJpdDwvdGV4dD4KPHRleHQgeD0iMTAxIiB5PSIxMDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM2Ij5kZGJfYWNjb3VudHM8L3RleHQ+CjxyZWN0IHg9IjQwIiB5PSIxMTgiIHdpZHRoPSIxMjIiIGhlaWdodD0iMzQiIHJ4PSI3IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRlNjYiLz4KPHRleHQgeD0iMTAxIiB5PSIxMzMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5jcmVkaXQ8L3RleHQ+Cjx0ZXh0IHg9IjEwMSIgeT0iMTQ2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjNiI+ZGRiX2xlZGdlcjwvdGV4dD4KPGxpbmUgeDE9IjE3NiIgeTE9IjEwMyIgeDI9IjIzNiIgeTI9IjEwMyIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjYTcpIi8+Cjx0ZXh0IHg9IjIwNiIgeT0iOTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMCI+b25lIHR4bjwvdGV4dD4KPHJlY3QgeD0iMjQwIiB5PSI1MiIgd2lkdGg9IjIyOCIgaGVpZ2h0PSIxMDIiIHJ4PSIxMiIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNyIvPgo8dGV4dCB4PSIzNTQiIHk9Ijc4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEycHgiPkJFR0lOIOKApiBDT01NSVQ8L3RleHQ+Cjx0ZXh0IHg9IjM1NCIgeT0iOTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPlNFUklBTElaQUJMRSBpc29sYXRpb248L3RleHQ+Cjx0ZXh0IHg9IjM1NCIgeT0iMTEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij5ib3RoIHJlbGF0aW9ucywgYXRvbWljYWxseTwvdGV4dD4KPHRleHQgeD0iMzU0IiB5PSIxMzIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZpbGw6ICNjOWNmZDgiPmxvY2stb3JkZXIgc29ydCBhdm9pZHMgZGVhZGxvY2s8L3RleHQ+Cjx0ZXh0IHg9IjM1NCIgeT0iMTQ2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmaWxsOiAjYzljZmQ4Ij5DbGllbnRSZXF1ZXN0VG9rZW4g4oaSIGNvbW1pdHMgb25jZTwvdGV4dD4KPGxpbmUgeDE9IjQ4NCIgeTE9IjM0IiB4Mj0iNDg0IiB5Mj0iMTcyIiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjUwOCIgeT0iNjYiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweDtmaWxsOiAjOTBkZWM4Ij5Dcm9zcy10YWJsZSBBQ0lEPC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjkwIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+RHluYW1vREIgYW5kIHRoaXMgdGFyZ2V0PC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjEwNyIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPmNvbW1pdCBhY3Jvc3MgdGFibGVzLjwvdGV4dD4KPHRleHQgeD0iNTA4IiB5PSIxMjciIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5TdHJlYW0tZW5hYmxlZCB0YWJsZXM8L3RleHQ+Cjx0ZXh0IHg9IjUwOCIgeT0iMTQ0IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+ZG8gbm90IHNlcnZlIHRyYW5zYWN0aW9uPC90ZXh0Pgo8dGV4dCB4PSI1MDgiIHk9IjE2MSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPnJlcXVlc3RzIGluIHRoaXMgbWFwcGluZy48L3RleHQ+Cjwvc3ZnPg==" alt="A TransactWriteItems spanning two tables, a debit in one relation and a credit in another, commits atomically in one BEGIN…COMMIT at SERIALIZABLE isolation, exactly like real DynamoDB." />
</div>

<p className="t9-caption">TransactWriteItems runs in one native Postgres BEGIN…COMMIT at SERIALIZABLE, atomic and isolated across tables.</p>

#### Limitations

PostgreSQL limitations

* **One PostgreSQL instance serves each table.** Heavy contention on one key can cause serialization failures and row-lock conflicts. The adapter returns retryable errors, but sustained contention can exhaust the SDK retry budget and appear as throttling.
* **Stream-enabled tables allow one writer at a time.** An owner lease of about 90 seconds preserves stream record order. A second adapter instance attempting to write while that lease is active receives a retryable `ThrottlingException`. Throughput depends on the writer, database and request workload. Tables without streams support concurrent writers.
* **`DescribeStream` lists at most 100 shards.** A stream with more shards is not fully enumerated in one call.
* **Transactions on stream-enabled tables are unsupported.** A `TransactWriteItems` request touching one returns `ValidationException` because the transaction path does not create stream records.
* **DynamoDB backup and global-table APIs are unsupported.** Use PostgreSQL backups, snapshots, point-in-time recovery (PITR), and replica/failover procedures. DynamoDB on-demand backup/restore, PITR, and global-table replication APIs are not implemented.
* **Instances incur costs when idle.** Size and pay for PostgreSQL capacity ahead of demand. Larger table counts require more instances and table-placement planning.
* **Index lookups have a 10,000-item limit.** A lookup that exceeds 10,000 candidate items for one index partition-key value returns an error.
* **Plan for the table-count guardrail.** The adapter checks 500 physical DynamoDB tables per namespace. Larger deployments need database capacity and table-placement planning.
* **Expired items remain readable until deletion.** A bounded, leader-elected reaper uses the TTL expression index to delete eligible rows asynchronously. Until physical deletion, GetItem, Query and Scan can return the expired item, and it continues to consume storage.

#### Other considerations

* **Stream records commit with the write.** The adapter stores each record in the table's `_strm` table within the same transaction as the item write. A record exists if and only if its write committed. The single-writer lease keeps stream sequence order aligned with commit order so a cursor can resume without skipping records.
* **Use PostgreSQL recovery procedures.** Backups, PITR, snapshots, and replica/failover procedures operate on the PostgreSQL database. The adapter does not implement DynamoDB backup, PITR, or global-table APIs.
* **Connection pooling.** The adapter uses pooled PostgreSQL connections. Deployments spread across many instances may need a separate pooler to keep total connections within each database's limit.
* **Migrate and test one table at a time.** Separate PostgreSQL tables allow per-table export/import, dual-write, or backfill-and-switch procedures. Application code continues to use the DynamoDB API.
* **Use PostgreSQL operational tools.** Monitor SQL activity, maintain indexes, vacuum tables, and run backups with your existing PostgreSQL tools and procedures.

[Service Catalog](/service-adapters/catalog).
