Apakah memiliki hubungan antara basis data yang terpisah merupakan praktik buruk?

8

Saya bekerja dengan klien yang memiliki banyak basis data. Ada beberapa masterbasis data tingkat yang memiliki hubungan kembali ke mereka dari instancebasis data tingkat (DB spesifik aplikasi). Hubungan dari instanceke masteradalah nilai integer yang mewakili kunci utama ke tabel di master. Tampilan dan prosedur yang tersimpan di instancessetup untuk memuat data dari mastermelalui kunci yang disimpan ini.

Jelas, tidak ada integritas referensial yang nyata, tetapi apakah itu praktik buruk atau haruskah data berada dalam tabel read-only di instancedatabase?

DDiVita
sumber

Jawaban:

8

Satu-satunya masalah adalah bahwa sebenarnya tidak ada cara yang nyaman untuk menegakkan hubungan ini. Anda bisa menggunakan satu kapal pemicu, atau menyimpan tabel master di setiap database contoh dan cukup memaparkan semuanya sebagai metadata ke master, mungkin menggunakan tampilan.

Kelemahan terbesar, saya pikir, ada hubungannya dengan menjaga data akurat dan disinkronkan, dalam setidaknya tiga skenario di atas kepala saya (semuanya masih bisa menjadi masalah bahkan jika Anda menggunakan pemicu):

  • transaksi lintas-basis data yang tidak terkoordinasi dengan benar - misalnya satu transaksi menambahkan baris baru untuk dikuasai, melepaskan identitas ke transaksi lain, dan kemudian transaksi pertama dibatalkan.
  • pemulihan dari kegagalan basis data tunggal - database lumpuh, Anda harus mengembalikan ke titik waktu, yang mungkin sebelum transaksi sukses lainnya di database lain selesai. Ini bisa berarti jika database instance harus kembali ke waktu sebelumnya, itu adalah baris yang tidak diharapkan master; jika master harus kembali, mungkin semua database instance akan memiliki nilai yang tidak ada di master.
  • konsistensi cadangan secara umum - jika Anda memerlukan pemulihan bencana, Anda akan mengalami kesulitan menjaga semua cadangan lengkap dan mencatat secara konsisten sesuai dengan waktu. Cuplikan sistem file tidak membantu dengan ini, dan bahkan Grup yang Tersedia tidak menjamin konsistensi transaksional pangkalan data untuk database dalam satu Grup Ketersediaan. Jika Anda memiliki bencana dan perlu mengembalikan database Anda ke sistem baru, tidak ada cara untuk memastikan mereka akan konsisten secara transaksi.

Semua yang dikatakan, saya selalu dan akan selalu menjadi penggemar memisahkan penyewa ke dalam database mereka sendiri, dan saya mengakui ada risiko yang terkait dengan database pusat - tetapi itu perlu.

(Sebagai tambahan, Anda harus menggunakan nama untuk database Anda selain master / contoh. masterDi SQL Server pasti memiliki makna yang eksplisit, dan bahkan membaca kata-kata saya sendiri di atas mereka bisa ambigu. Sama untuk instance. Dalam kehidupan sebelumnya saya menjalankan multi sistem -tenant dan kami disebut pusat database Controldan basis data penyewa, well Tenants,.)

Aaron Bertrand
sumber
2

Jika Anda mengikuti arsitektur seperti Microservices, cukup banyak keharusan untuk dapat mengkorelasikan data di berbagai layanan otonom, masing-masing dengan penyimpanan datanya sendiri. Akan dipahami oleh setiap layanan bahwa proses bisnis yang secara tradisional akan dilakukan dalam satu transaksi basis data sekarang mungkin berpotensi berjalan lebih lama.

pnschofield
sumber