Is DynamoDB schemaless?
Yes. DynamoDB is schemaless. Other than the primary key, you do not define any attributes or data types when you create a table. Each item can carry its own distinct set of attributes, and they can vary freely from one item to the next — so you adapt your data model without running schema migrations.
What you define up front
Only the primary key: a partition key (required) and an optional sort key, plus their types. Everything else is arbitrary. You do not declare columns.
What varies per item
Any two items in the same table can have completely different attributes. One item might hold email and status; another might hold orderTotal and a nested address map. DynamoDB stores whatever you write.
Where schemaless stops
Schemaless has a precise boundary. The primary key is validated on every write; nothing else is. Two items with no attributes in common go into the same table without complaint:
await client.send(
new PutItemCommand({
TableName: 'people',
Item: {pk: {S: 'USER#1'}, email: {S: 'a@b.c'}, status: {S: 'active'}}
})
);
await client.send(
new PutItemCommand({
TableName: 'people',
Item: {
pk: {S: 'ORDER#1'},
orderTotal: {N: '42.5'},
address: {M: {city: {S: 'Madrid'}}},
tags: {SS: ['a', 'b']}
}
})
);Both succeed. Now write the same partition key as a number instead of a string:
ValidationException: One or more parameter values were invalid: Type mismatch for key
HTTP 400And omit pk entirely:
ValidationException: One of the required keys was not given a value
HTTP 400Those two rejections are the entire schema. The key attribute must be present and must match the type declared in AttributeDefinitions. Everything past that is accepted as written.
A typo passes too. Nothing tells you at write time that staus was meant to be status.
Why it helps
- No migrations — add or drop attributes anytime.
- Mixed entities — many entity types can share one table (single-table design).
- Evolvable — the model changes as requirements do.
Your application, not the database, enforces any shape you rely on.
What schemaless does not relax
Schemaless applies only to non-key attributes. Every other DynamoDB limit still binds:
- 400 KB per item — attribute names and values both count toward the ceiling.
- 32 nesting levels for maps and lists inside a value.
- 65,535 bytes maximum length for a single attribute name.
- 25 items maximum per
BatchWriteItemcall.
You can put a status string on one item and omit it on the next, but you cannot store a 500 KB blob in either one. Use the item size calculator to measure a payload before you write it, and read single-table design when you mix entity types in one table.
In DynoTable: open Settings on any table and index it. The inferred schema is built from sampled items and labeled honestly — it shows what you have written, not what you declared. See Table overview and indexing for how the local index samples and refreshes.
Go deeper
See single-table design and the type attribute pattern for mixed items. Download DynoTable to inspect real item shapes side by side.
References
- Core components of Amazon DynamoDB — Amazon DynamoDB Developer Guide
- What is Amazon DynamoDB? — Amazon DynamoDB Developer Guide
- Data modeling for DynamoDB tables — Amazon DynamoDB Developer Guide
Last verified 2026-07-13 against the official AWS documentation linked above.
Reproduced 2026-07-28 against DynamoDB Local 3.3.0 via @aws-sdk/client-dynamodb 3.1095.0 on Node v24.18.0. Both ValidationException messages are verbatim engine output.