Pada akhirnya, itu pada dasarnya bermuara pada "dapatkah Anda benar-benar mengatakan bahwa Anda tidak memiliki data bersama?" Tidak seperti mysql, database adalah batas absolut di postgresql. Anda tidak bisa SELECT zip_code FROM common.city_zip WHERE city=...
jika Anda pergi dengan database terpisah (setidaknya bukan tanpa dblink
).
Jika Anda memiliki data yang dibagikan sama sekali, "skema" postgresql mirip dengan apa yang disebut mysql sebagai "database" . Kamu bisa CREATE SCHEMA clienta; CREATE TABLE clienta.customer (...);
. Anda akan membuat skema untuk setiap klien, pengguna klien akan memiliki skema pertama mereka di jalan pencarian mereka, dan izin akan diberikan sehingga Klien A pengguna akan memiliki akses ke clienta
dan public
skema (dan meja mereka).
Masalah Anda adalah bahwa pada ujung # klien, setiap tabel disimpan sebagai file, jadi apakah Anda menggunakan satu basis data per klien, satu skema per klien, atau menggunakan sesuatu seperti ${client}_customer
untuk nama tabel Anda, Anda akan kemungkinan bertemu dengan batas pengajuan arsip dengan 10 ribu klien meskipun Anda hanya memiliki satu tabel per klien (ditambah satu pengajuan pengajuan arsip per koneksi). Tentu saja, Anda dapat menyesuaikan jumlah maksimum file deskriptor kernel saat itu menggunakan sysctl, tetapi batas per-proses (ulimit) akan membutuhkan memulai kembali postgresql jika Anda mengaturnya terlalu rendah pada kali pertama.
Alternatifnya adalah memiliki "satu tabel besar" dengan kolom klien yang mengidentifikasi klien mana yang dimiliki baris (idealnya, dengan nama pengguna jika Anda memiliki satu pengguna per klien, ini membuat barang-barang di bawah BANYAK lebih mudah). Dengan tidak memberikan akses apa pun ke tabel ini oleh klien, Anda dapat membuat tampilan khusus klien (atau gunakan session_user
untuk mengidentifikasi klien saat ini). Pembaruan tidak dapat dilakukan secara langsung melalui tampilan. Anda harus memiliki fungsi yang telah ditentukan untuk menyisipkan / memperbarui / menghapus di atas meja (satu set fungsi per klien atau yang lain menggunakan session_user
) dengan fungsi menggunakan SECURITY DEFINER
untuk mengeksekusi sebagai pengguna khusus dengan izin untuk memasukkan / memperbarui / menghapus tabel (catatan : session_user
digunakan karena user
dancurrent_user
didasarkan pada konteks saat ini, dan dalam fungsi SECURITY DEFINER ini akan selalu menjadi pengguna yang mendefinisikan fungsi).
Kinerja-bijaksana, di luar masalah fd, jujur saya tidak tahu apa yang akan terjadi dengan 10.000 database di postgresql, dibandingkan memiliki satu tabel besar dengan data senilai 10.000 klien di dalamnya. Desain indeks yang tepat harus menjaga tabel besar agar tidak lambat untuk kueri.
Saya akan mengatakan bahwa saya pergi dengan database terpisah untuk setiap klien di sini (kami menambahkan server agar sistem dapat digunakan, menggeser database klien ke server baru sesuai kebutuhan, jadi kami tidak akan pernah mendapatkan 10 ribu basis data pada satu server). Saya harus memulihkan data masing-masing klien dari cadangan untuk debugging atau karena kesalahan pengguna secara teratur, sesuatu yang akan menjadi mimpi buruk mutlak pada desain "satu tabel besar". Juga, jika Anda berniat untuk menjual kustomisasi produk Anda kepada klien Anda, desain "satu meja besar" mungkin akan membuat Anda terpincang-pincang sejauh kemampuan untuk menyesuaikan model data.
pg_dump -n
(pastikan untuk membuang skema umum Anda juga!)psql -E
\dn
Tanpa rincian lebih lanjut tentang aplikasi Anda, sulit untuk mengatakan bahwa Anda akan mendapatkan keamanan tambahan dari pengaturan ini. Jika setiap klien terhubung ke aplikasi web dan ada pengguna bersama dari aplikasi web ke database, maka Anda belum mengisolasi data Anda dengan cara yang berbeda dari menggunakan database monolitik tunggal. Mengakses data Anda melalui prosedur tersimpan yang diparameterisasi dengan benar akan memberi Anda tingkat isolasi yang Anda cari tanpa kesulitan administrasi mengelola 10.000+ basis data di sejumlah server.
Saya pribadi menjalankan set up serupa pada satu server basis data dengan menggunakan tidak lebih dari prosedur tersimpan berparameter yang mengenai satu basis data. Jika Anda dapat menjamin bahwa satu-satunya akses ke database adalah melalui prosedur yang tersimpan, tidak ada bahaya data ikut tercampur dalam hasil.
Jika Anda ingin maju dengan desain Anda, berikut ini adalah kekhawatiran utama saya:
ulimit -n
) pada OS host Andasumber
SELECT * WHERE clientId = 3
, Anda memiliki kebocoran keamanan.