This document discusses parallel and distributed storage systems. It begins by introducing the need for parallel storage due to growing data sizes and user bases. It then discusses the history of parallel/distributed systems from 1980s distributed databases to 2010s distributed databases with thousands of nodes. The document focuses on techniques for parallelizing I/O, including partitioning relations across multiple disks or nodes using round-robin, hashing, or range partitioning. It analyzes these techniques' support for different data access types and discusses handling skew. It also covers virtual node partitioning and dynamic repartitioning to address skew over time.