A developer-friendly guide to storage types: why row storage (OLTP) and columnar storage (OLAP) exist, and when HTAP makes sense