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.