Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Perlu memperbarui basis data aplikasi pengguna tunggal saya untuk memungkinkan banyak pengguna, bagaimana cara mengubah skema basis data?

Beberapa klien; satu aplikasi yang dihosting. Anda menggambarkan database multi-penyewa.

Saat Anda membangun database multi-penyewa, Anda perlu mempertimbangkan

  • meminta kueri
  • biaya
  • isolasi dan perlindungan data
  • pemeliharaan, dan
  • pemulihan bencana.

Solusi multi-penyewa berkisar dari satu database per penyewa (tidak berbagi apa-apa) hingga satu baris per penyewa (berbagi semuanya).

"Tidak ada yang dibagikan", "database terpisah", atau satu database per penyewa

  • Paling mahal per klien. (Jumlah klien yang besar menyiratkan sejumlah besar server.)
  • Tingkat isolasi data tertinggi.
  • Pemulihan bencana untuk satu penyewa sederhana dan mudah.
  • Pemeliharaan adalah secara teoritis lebih sulit, karena perubahan perlu dilakukan di setiap database. Tetapi dbms Anda mungkin dengan mudah mendukung menjalankan prosedur tersimpan di setiap database. (SQL Server memiliki prosedur tersimpan sistem yang tidak terdokumentasi, sp_msforeachdb, misalnya. Anda mungkin dapat menulis sendiri.) "Tidak berbagi apa pun" juga merupakan yang paling mudah disesuaikan, tetapi juga menimbulkan lebih banyak masalah pemeliharaan.
  • Jumlah baris terendah per tabel. Kecepatan kueri mendekati optimal.

"Berbagi segalanya", atau "skema bersama", atau "satu basis data per planet"

  • Paling murah per penyewa.
  • Tingkat isolasi data terendah. Setiap tabel memiliki kolom yang mengidentifikasi penyewa mana yang memiliki baris. Karena baris penyewa dicampur di setiap tabel, relatif mudah untuk secara tidak sengaja mengekspos data penyewa lain.
  • Pemulihan bencana untuk satu penyewa relatif rumit; Anda harus memulihkan baris individual di banyak tabel.
  • Pemeliharaan struktural lebih sederhana, mengingat semua penyewa berbagi meja. Ini meningkatkan beban komunikasi, karena Anda harus mengomunikasikan dan mengoordinasikan setiap perubahan dengan setiap penyewa. Ini tidak mudah disesuaikan.
  • Jumlah baris per tabel tertinggi. Permintaan cepat lebih sulit, tetapi itu tergantung pada berapa banyak penyewa dan berapa banyak baris. Anda dapat dengan mudah masuk ke wilayah VLDB.

Antara "tidak berbagi apa-apa" dan "berbagi segalanya" adalah "skema bersama".

"Skema bersama"

  • Penyewa berbagi database, tetapi setiap penyewa memiliki skema bernama sendiri. Biaya jatuh antara "tidak berbagi apa-apa" dan "berbagi segalanya"; sistem besar biasanya membutuhkan lebih sedikit server daripada "tidak berbagi apa-apa", lebih banyak server daripada "berbagi segalanya".
  • Isolasi yang jauh lebih baik daripada "berbagi segalanya". Tidak sebanyak isolasi seperti "tidak berbagi apa-apa". (Anda dapat MEMBERIKAN dan MENCATAT izin pada skema.)
  • Pemulihan bencana untuk satu penyewa memerlukan pemulihan salah satu dari banyak skema. Ini relatif mudah atau cukup sulit, tergantung pada dbm Anda.
  • Pemeliharaan lebih mudah daripada "tidak berbagi apa-apa"; tidak semudah "berbagi segalanya". Ini relatif sederhana untuk menulis prosedur tersimpan yang akan dijalankan di setiap skema dalam database. Berbagi tabel umum di antara penyewa lebih mudah daripada dengan "tidak berbagi apa-apa".
  • Biasanya lebih banyak penyewa aktif per server daripada "tidak berbagi apa-apa", yang berarti mereka berbagi (menurunkan) lebih banyak sumber daya. Tapi tidak seburuk "berbagi segalanya".

Microsoft memiliki artikel bagus tentang arsitektur multi-tenant dengan lebih detail. (Tautan hanya ke satu halaman dari dokumen multi-halaman.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kueri SQL untuk menjumlahkan dua nilai berbeda dari kolom ID yang sama dalam satu kueri

  2. Cara menulis kueri MySQL di mana A berisi ( a atau b )

  3. temukan di set di laravel? contoh

  4. Bagaimana saya bisa meniru WHERE 1 dalam kueri dinamis?

  5. Bagaimana cara mengelompokkan berdasarkan bulan dan mengembalikan nol jika tidak ada nilai untuk bulan tertentu?