Setelah komentar ini ke salah satu pertanyaan saya, saya berpikir apakah lebih baik menggunakan satu database dengan skema X atau sebaliknya.
Situasi saya: Saya sedang mengembangkan aplikasi web di mana, ketika orang mendaftar, saya membuat (sebenarnya) database (tidak, itu bukan jejaring sosial: semua orang harus memiliki akses ke datanya sendiri dan tidak pernah melihat data pengguna lain) .
Itulah cara saya menggunakan versi aplikasi saya sebelumnya (yang masih berjalan di MySQL): melalui API Plesk, untuk setiap pendaftaran, saya lakukan:
- Buat pengguna basis data dengan hak istimewa terbatas;
- Buat database yang dapat diakses hanya oleh pengguna yang dibuat sebelumnya dan superuser (untuk pemeliharaan)
- Mengisi basis data
Sekarang, saya harus melakukan hal yang sama dengan PostgreSQL (proyek semakin matang dan MySQL ... tidak memenuhi semua kebutuhan).
Saya harus memiliki semua cadangan basis data / skema independen: pg_dump berfungsi dengan baik dalam dua cara, dan hal yang sama untuk pengguna yang dapat dikonfigurasi untuk mengakses hanya satu skema atau satu database.
Jadi, dengan anggapan Anda adalah pengguna PostgreSQL yang lebih berpengalaman daripada saya, menurut Anda apa solusi terbaik untuk situasi saya, dan mengapa?
Apakah akan ada perbedaan kinerja menggunakan basis data $ x bukannya skema $ x? Dan solusi apa yang akan lebih baik untuk dipertahankan di masa depan (keandalan)?
Semua database / skema saya akan selalu memiliki struktur yang sama!
Untuk masalah backup (menggunakan pg_dump), mungkin lebih baik menggunakan satu database dan banyak skema, membuang semua skema sekaligus: memulihkan akan cukup sederhana memuat dump utama dalam mesin pengembangan dan kemudian membuang dan mengembalikan hanya skema yang diperlukan: ada adalah satu langkah tambahan, tetapi membuang semua skema tampaknya lebih cepat daripada membuangnya satu per satu.
UPDATE 2012
Nah, struktur dan desain aplikasi berubah sangat banyak selama dua tahun terakhir. Saya masih menggunakan one db with many schemas
pendekatan, tetapi masih, saya punya satu database untuk setiap versi aplikasi saya:
Db myapp_01
\_ my_customer_foo_schema
\_ my_customer_bar_schema
Db myapp_02
\_ my_customer_foo_schema
\_ my_customer_bar_schema
Untuk cadangan, saya membuang setiap basis data secara teratur, dan kemudian memindahkan cadangan pada server pengembangan.
Saya juga menggunakan cadangan PITR / WAL tetapi, seperti yang saya katakan sebelumnya, tidak mungkin saya harus mengembalikan semua database sekaligus ... jadi mungkin akan diberhentikan tahun ini (dalam situasi saya bukan pendekatan terbaik ).
Pendekatan satu-db-banyak-skema bekerja sangat baik bagi saya sejak sekarang, bahkan jika struktur aplikasi benar-benar berubah:
Saya hampir lupa: semua database / skema saya akan selalu memiliki struktur yang sama!
... sekarang, setiap skema memiliki strukturnya sendiri yang berubah secara dinamis bereaksi terhadap aliran data pengguna.
Jawaban:
"Skema" PostgreSQL kira-kira sama dengan "database" MySQL. Memiliki banyak basis data pada instalasi PostgreSQL dapat menjadi masalah; memiliki banyak skema akan bekerja tanpa masalah. Jadi Anda pasti ingin menggunakan satu database dan beberapa skema dalam database itu.
sumber
Jelas, saya akan pergi untuk pendekatan satu-db-banyak-skema. Ini memungkinkan saya untuk membuang semua basis data, tetapi mengembalikan hanya satu dengan sangat mudah, dengan banyak cara:
Kalau tidak, googling di sekitar saya telah melihat bahwa tidak ada prosedur otomatis untuk menduplikasi skema (menggunakan satu sebagai templat), tetapi banyak yang menyarankan cara ini:
Saya telah menulis dua baris dengan Python untuk melakukan itu; Saya berharap mereka dapat membantu seseorang (dalam kode 2-detik-ditulis, jangan menggunakannya dalam produksi):
sumber
Saya akan mengatakan, pergi dengan banyak database DAN beberapa skema :)
Skema di PostgreSQL sangat mirip dengan paket di Oracle, jika Anda terbiasa dengan itu. Basis data dimaksudkan untuk membedakan antara seluruh set data, sedangkan skema lebih seperti entitas data.
Misalnya, Anda bisa memiliki satu database untuk seluruh aplikasi dengan skema "UserManagement", "LongTermStorage" dan sebagainya. "Manajemen Pengguna" kemudian akan berisi tabel "Pengguna", serta semua prosedur, pemicu, urutan, dll yang tersimpan yang diperlukan untuk manajemen pengguna.
Basis data adalah keseluruhan program, skema adalah komponen.
sumber
Dalam konteks PostgreSQL saya sarankan untuk menggunakan satu db dengan banyak skema, karena Anda dapat (misalnya) UNION ALL di seluruh skema, tetapi tidak di seluruh database. Untuk alasan itu, sebuah basis data benar-benar terisolasi dari basis data lain sementara skema tidak terisolasi dari skema lain dalam basis data yang sama.
Jika Anda - karena alasan tertentu - harus mengkonsolidasikan data di seluruh skema di masa mendatang, akan mudah untuk melakukan ini di beberapa skema. Dengan banyak basis data, Anda akan membutuhkan banyak koneksi db dan mengumpulkan dan menggabungkan data dari setiap basis data "secara manual" dengan logika aplikasi.
Yang terakhir memiliki kelebihan dalam beberapa kasus, tetapi untuk bagian utama saya pikir pendekatan satu-database-banyak-skema lebih berguna.
sumber
Sejumlah skema harus lebih ringan daripada sejumlah database, meskipun saya tidak dapat menemukan referensi yang menegaskan hal ini.
Tetapi jika Anda benar-benar ingin menjaga hal-hal yang sangat terpisah (alih-alih refactoring aplikasi web sehingga kolom "pelanggan" ditambahkan ke tabel Anda), Anda mungkin masih ingin menggunakan database terpisah: Saya menegaskan bahwa Anda dapat lebih mudah membuat pemulihan database pelanggan tertentu dengan cara ini - tanpa mengganggu pelanggan lain.
sumber