Requirements
Functional Requirements:
- Create a short URL for a given long URL.
- Return the long URL associated with a given short URL.
Non-Functional Requirements:
- No need to store the same URL again if it already exists in the system;
Capacity Estimation
- Reads are expected to be 10x the volume of writes;
- Resources are completely independent and can be sharded/scaled horizontally without challenge.
API Design
- GET shorten/{url}
- Using a GET for ease of use with browsers.
High-Level Design
Describe the overall system architecture. Identify the main components needed to solve the problem end-to-end. Use the diagramming tool to create a block diagram.
Database Design
- Given the volume and the nature of queries, KV-type database is ideal for the use case, such as DynamoDB.
- Hashing the URL as the primary key of the table with hash alg 1, and then using hash-alg 2 of the URL as sort key and then store the URL itself as the value.
- DynamoDB is auto-scaling;
Detailed Component Design
Deep dive into 2-3 key components. Explain how they work, how they scale, discuss tradeoffs, capacity, and any relevant algorithms or data structures.