Row storage
Classic DB layout: rows stored contiguously — all columns for row 1, then all columns for row 2. Optimal for OLTP where queries return few rows with many columns. Standard in PostgreSQL, MySQL, Oracle.
Win: read one row = one disk IO. Insert one row = append to page end. Loss on analytics: SELECT AVG(price) FROM trades reads entire rows (maybe 100 columns) just to get one column → 100x extra IO vs columnar. PostgreSQL heap is classic row storage. InnoDB is clustered-index based (rows physically sorted on PK). Modern hybrid: PostgreSQL has a row store default, adds column stores as extension (citus, hydra) or foreign tables (parquet_fdw).