Postgres is one of those technologies that comes with enough power to shoot yourself in the foot. Having a set of heuristics and usage patterns is almost necessary - unless you want to relearn these hard lessons. Thanks!
Re:
1) The default 32 bit serial integer is indeed a huge problem. 2 billion rows can come up fast in an active system and you do NOT want to experience the fun of migrating to a 64 bit serial while under a constant load. I'd advocate for using `bigint primary key generated always as identity` (see https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use...)
The UUID pk advocates have some good points. And for low-to-mid traffic tables, I agree. The size doesn't bother me but UUIDs are not sortable in insert-order, which means the b-tree index pages are uncorrelated with the position of the row in the table. There is a severe penalty once you start getting maxxing out your shared_buffers cache - every new insert into the btree is likely to require fetching a new page, cache starts thrashing and grinding performance to a halt. It's one of those performance issues that doesn't creep up on you, it smacks you in the face! One day, your inserts just get 100x slower and crashes your app. The only solution is to buy more and more RAM as your table grows... or go back in time and use an autoincrementing primary key to avoid the whole issue.
2) Timezones - Not intuitive but super important to get right before you start inserting data! Get it wrong and the previous timestamps are likely impossible/ambiguous to interpret.
5) ORMs are a great abstraction over 80% of the basic stuff - CRUD operations on a single table, select by id ... the core functionality to bootstrap a web API on a greenfield project.
But how many of us are working on basic greenfield projects? As soon as you start needing to do anything complex, ORMs tend to fall apart quickly and devolve into raw sql for almost all of the database interactions anyway. Might as well start with SQL or a query-builder. I really prefer the SQL-first hugsql technique (https://www.hugsql.org/) - I wish it was available in more languages.
6) Honestly, though I learned all the relational theory at some point, I rarely need to implement anything more complex than 3NF or Boyce-Codd NF. But I'd say one of the advantages of postgres is the JSONB type which allows you to ignore normalization theory almost entirely :-) It can be great for MVPs, implement the initial functionality in a document-style database and migrate to properly normalized tables once the schema of the document is more stable. So document db? Check. An append-only timeseries db? Check. Spatial database? Check (see PostGIS). Using postgres tables as a work queue? Check. Postgres can behave like many other styles of databases, not just a pure relational one.
7) For my money, there's no reason to "install" Postgres at all. Docker-compose and the official postgres docker images are ideal for local development. For production, use managed postgres unless you've got a strong reason not to.