DynamoDB — Portfolio Projects
Build these projects to demonstrate real skills to employers. Each project is designed to be interview-worthy — something you can walk through in detail.
Project 1: Single-Table Design from Access Patterns
Level: Beginner-Intermediate | Time: 2 days
Design a DynamoDB table for a realistic domain (an e-commerce app, a social feed) starting from a written list of access patterns, not from an entity-relationship diagram — this is the discipline DynamoDB schema design actually requires.
Steps
PK/SK attributes and key overloading (e.g. PK=USER#123, SK=PROFILE and PK=USER#123, SK=ORDER#2024-01-15#456) to serve as many patterns as possible from one table
query() or get_item(), not a scan()
Skills Demonstrated
GitHub Repo Name
dynamodb-single-table-design
---
Project 2: Transactional Order Flow with Optimistic Locking
Level: Intermediate | Time: 2-3 days
Build a realistic order-placement flow that needs true atomicity across multiple items — the exact scenario TransactWriteItems and conditional expressions exist for.
Steps
TransactWriteItems so the order record, order items, and inventory decrement all succeed or all fail together
ConditionExpression on the inventory update (e.g. qty >= :requested) so an order can never oversell inventory, and handle the resulting TransactionCanceledException correctly
ConditionExpression, and demonstrate what happens when two concurrent updates race
Skills Demonstrated
TransactWriteItems for genuine cross-item atomicity
GitHub Repo Name
dynamodb-transactional-orders
---
Project 3: Event-Driven Pipeline with Streams and Lambda
Level: Advanced | Time: 3-4 days
Build a real event-driven pipeline reacting to DynamoDB changes in real time — a genuinely common production pattern, not just a Streams demo.
Steps
INSERT/MODIFY/REMOVE events
pending to shipped
OldImage/NewImage correctly to detect specific field transitions (not just "something changed")
Skills Demonstrated
GitHub Repo Name
dynamodb-streams-event-pipeline
---
Tips for Great DynamoDB Projects
Design from access patterns, not entities. A DynamoDB schema that looks like a normalized relational design — separate tables per entity, expecting joins — is the clearest sign a project wasn't actually designed the DynamoDB way.
Show that you avoided scan(). Every access pattern in a well-designed DynamoDB project should resolve via query() or get_item() — being able to say "every read in this project is a targeted query, not a scan" is a genuinely strong signal.
DynamoDB has no JOINs, no FOREIGN KEY constraints, and no window functions. If a project design implies any of these, that's a sign the schema needs to be reshaped around single-table design and key overloading instead, not that DynamoDB is missing a feature.
Portfolio Checklist
TransactWriteItems

