質問: PostgreSQL 12です。 PostgreSQLサーバーは、AWS RDSを利用しております。 凡例) ユーザー:SQL実行者 グループ:アクセスできる範囲を意味しています。 グループ配下には、DB、スキーマ、テーブルが存在するとします。 グループA:ユーザー1、ユーザー2 グループB:ユーザー3、ユーザー4 グループA配下のテーブルは、ユーザー1、ユーザー2がSQLコマンドを実行でき、ユーザー3、ユーザー4SQLコマンドを実行できない。 グループB配下のテーブルは、ユーザー3、ユーザー4がSQLコマンドを実行でき、ユーザー1、ユーザー2SQLコマンドを実行できない。 この時、PostgreSQLの考え方として、グループを * 複数のDBで分ける * 1つのDBで複数のスキーマで分ける の2つの方法があるかと思います。 各ユーザーは、グループごとの DB or スキーマ の設定をGRANTで行うことで制御できるかと思いますが、DBで分ける場合とスキーマで分ける場合について、メリットデメリットをご教授いただきたいです。 一つのDATABASEに対して、複数のスキーマ(この場合グループA、グループBの計2つ)を作成し、アクセス制御を行う方法と、複数のDATABASE(この場合グループA、グループBの計2つ)を作成し、アクセス制御を行う方法は、どちらを選択するべきでしょうかといったご質問となります。 基本的には、「1つのDBで複数のスキーマで分ける」の方が運用が楽という意味で、メリットがあるかと思いますが、それくらいしか思いつかないため、何かそれ以外の根拠となる明確なご回答をいただきたいです。
回答: DBによる分割とスキーマによる分割について普通は「どちらでも要件は満たせる」ということはあまりないので、例えば * 「ユーザー5」は両方の「グループ」をJOINしたSQLを実行しないといけない * 両方の「グループ」を整合性のあるかたちで統合したバックアップをとらないといけない * 逆に、「グループ」ごとに独立してバックアップ・レストアできないといけない * 他のRDBMSとの互換性を考慮しないといけない など、考慮しないといけない要件が検討されていないだけでないでしょうか。 なお、権限はテーブルに対しても設定できるので、その点も含めて見直されるとよいと思います。 > > バックアップなどの観点は全てAWS RDSの機能により、考慮不要となります。 > > > グループAのデータをリストアしないといけないときに、グループBも使えなくなってよいのか、だめなのか、データが一緒に巻き戻ってよいのかいけないのか巻き戻らないといけないのか、RDSだからといってあなたの都合のよいように動くわけではありません。 この点だけ見ても考慮不足だと思います。 また、本当に質問に書いてある条件以外を考慮しなくてよいという前提なら、メリットデメリットを論じる意味もないのでどちらでもよい、という話にしかなりません。