O "melhor" caminho depende muito do seu caso de uso, no entanto, em meus dias de hospedagem, costumávamos simplesmente dar a cada cliente seu próprio DB, que era DBO em seu banco de dados específico, com permissão apropriada & restrições de login (no Postgres e pg_hba.conf
respectivamente) para que eles não pudessem mexer com os dados de outra pessoa.
O Backup / Restore pode ser tratado usando pg_dump
(despejar cada banco de dados individualmente para que possam ser facilmente restaurados sem ter que selecionar o arquivo de despejo), e o desempenho / ajuste é o mesmo que qualquer instância média-grande de Postgres.
A divisão por esquema (dentro do mesmo banco de dados) também é uma opção, mas não impõe o mesmo nível de separação que um banco de dados separado, e obviamente você não pode permitir que os clientes criem seus próprios esquemas (ou fazer qualquer outra coisa) que requer DBO) se você fizer isso.
A divisão por instância (servidor Postgres separado para cada cliente) é o nível máximo de separação, mas realmente requer um usuário individual OS para cada cliente (para que o Postgres seja executado em usuários totalmente separados). Esse também é um enorme coletor de memória / recursos: o Postgres (como a maioria dos sistemas de banco de dados) deve idealmente ser a única coisa que está sendo executada em um servidor e apenas uma instância.