https://www.postgresqltutorial.com/ - I found that this is pretty good at explaining lots of different parts of Postgres in depth.
In terms of schema design, take the approach of "don't repeat yourself". If you have a table with a column which can only contain one out of few different possible values, use a type. If you also need additional data, using that type in a different table, and adding the additional columns you need can help make your schema easier to reason about.