A good schema is client-driven, nullable-by-default at the edges, and evolvable without versions. It models the domain in terms clients actually use, not your database tables.
Nullability
Make a field non-null (!) only when you can always return it. Over-using ! is a trap: if a non-null field errors, it nulls its whole parent object, turning a small failure into a large blank. Prefer nullable for anything that depends on a downstream service.
