Use a shared schema with a tenant discriminator, accessed only through a tenant-scoped client.
Why
Schema-per-tenant makes migrations and cross-tenant reporting painful at even modest tenant counts. A shared schema is operationally simple, and the isolation risk is contained by making the scoped client the sole access path.
Trade-off
Isolation depends on that boundary holding, so the client is small, reviewed carefully, and the raw connection is not exported. A tenant needing physical separation would need a different model, and that is a deliberate limit.