Single-table design methodology in DynamoDB - Time & Space Complexity
When using single-table design in DynamoDB, it's important to understand how the number of operations changes as your data grows.
We want to know how the time to get or write data changes when the table gets bigger.
Analyze the time complexity of the following DynamoDB query using single-table design.
const params = {
TableName: "MySingleTable",
KeyConditionExpression: "PK = :pkValue",
ExpressionAttributeValues: {
":pkValue": "USER#123"
}
};
const result = await dynamodb.query(params).promise();
This code queries all items with a partition key of "USER#123" from a single table that stores many entity types together.
Look for repeated actions that affect time.
- Primary operation: Querying items by partition key.
- How many times: The query reads all items matching the partition key, which depends on how many related items the user has.
As the number of items for a user grows, the query reads more data.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Reads 10 items |
| 100 | Reads 100 items |
| 1000 | Reads 1000 items |
Pattern observation: The time grows roughly in direct proportion to the number of items matching the partition key.
Time Complexity: O(n)
This means the time to get all items grows linearly with how many items share the same partition key.
[X] Wrong: "Querying a partition key always takes the same time no matter how many items it has."
[OK] Correct: The query reads all matching items, so more items mean more work and longer time.
Understanding how single-table design affects query time helps you explain your choices clearly and shows you know how data size impacts performance.
"What if we added a sort key condition to limit results? How would that change the time complexity?"
Practice
Solution
Step 1: Understand single-table design purpose
Single-table design stores multiple related data types in one table to reduce the number of queries needed.Step 2: Compare options with this purpose
It allows storing different types of related data in one table for faster queries. matches this purpose. Options B, C, and D describe incorrect or unrelated features.Final Answer:
It allows storing different types of related data in one table for faster queries. -> Option BQuick Check:
Single-table design = faster queries with one table [OK]
- Thinking single-table means multiple tables
- Assuming automatic index creation
- Confusing data format with design method
Solution
Step 1: Recall key structure in single-table design
Single-table design uses a partition key and a sort key to organize data efficiently.Step 2: Identify correct key assignment
PartitionKey: userId, SortKey: orderId correctly assigns userId as partition key and orderId as sort key, which is common for grouping orders by user.Final Answer:
PartitionKey: userId, SortKey: orderId -> Option CQuick Check:
Partition and sort keys = userId and orderId [OK]
- Using combined keys as partition key only
- Swapping partition and sort keys incorrectly
- Using concatenated keys without sort key
PK and sort key SK, which query will fetch all orders for user with ID 'user123' if orders are stored with PK = 'USER#user123' and SK = 'ORDER#orderId'?Solution
Step 1: Understand key structure for orders
Orders have PK as 'USER#user123' and SK starting with 'ORDER#', so all orders share the same PK but different SKs.Step 2: Identify query to fetch all orders for user
Query with KeyConditionExpression: PK = 'USER#user123' AND SK begins_with 'ORDER#' queries PK equal to 'USER#user123' and SK that begins with 'ORDER#', which fetches all orders for that user.Final Answer:
Query with KeyConditionExpression: PK = 'USER#user123' AND SK begins_with 'ORDER#' -> Option DQuick Check:
PK fixed, SK prefix filter = all user orders [OK]
- Swapping PK and SK in query
- Using scan instead of query
- Filtering SK with exact match instead of prefix
KeyConditionExpression: PK = 'POST#123' AND SK = 'COMMENT#'
Why does this query return no results?
Solution
Step 1: Analyze the KeyConditionExpression
The query uses SK = 'COMMENT#', which looks for an exact match on SK.Step 2: Understand why no results appear
Comments likely have SK starting with 'COMMENT#' plus an ID, so exact match fails. Using 'begins_with' on SK is needed to get all comments.Final Answer:
Because SK uses '=' instead of 'begins_with' to match multiple comments. -> Option AQuick Check:
Use begins_with for multiple SK matches [OK]
- Using '=' instead of begins_with on SK
- Swapping PK and SK in query
- Assuming FilterExpression fixes key condition
Solution
Step 1: Understand data grouping needs
We want to fetch all orders and items for a user efficiently, so grouping orders by user and items by order is key.Step 2: Evaluate key designs
PartitionKey: USER#userId, SortKey: ORDER#orderId for orders; PartitionKey: ORDER#orderId, SortKey: ITEM#itemId for items uses USER#userId as partition key for orders and ORDER#orderId as partition key for items, allowing efficient queries by user and order. Other options mix keys or combine too much, making queries inefficient.Final Answer:
PartitionKey: USER#userId, SortKey: ORDER#orderId for orders; PartitionKey: ORDER#orderId, SortKey: ITEM#itemId for items -> Option AQuick Check:
Group orders by user, items by order = PartitionKey: USER#userId, SortKey: ORDER#orderId for orders; PartitionKey: ORDER#orderId, SortKey: ITEM#itemId for items [OK]
- Using one partition key for all data types
- Combining all keys into one long sort key
- Using item ID as partition key for all data
Ready to prove it?
Pass the test and this pattern moves unknown
