Kriteria keputusan kapan harus menggunakan skema non-dbo vs Database baru

22

Saya sebagian besar adalah pengembang aplikasi tetapi menemukan diri saya harus melakukan semua pekerjaan database di muka untuk proyek saya saat ini ( btw ... MS SQL Server 2008 ). Sebagai keputusan pertama, saya mencoba mencari tahu apakah akan membagi negara saya menggunakan Database terpisah atau menggunakan Skema terpisah dalam database yang sama. Saya telah melakukan sedikit bacaan pada Skema SQL Server dan sepertinya cara alami untuk memisahkan objek domain ( yang saya suka ), tapi saya tidak yakin apakah mungkin ada biaya tersembunyi untuk pola ini.

Apa hal-hal yang lebih praktis yang harus saya pertimbangkan ketika memilih antara dua pendekatan ini? Jika saya menghindari dbo.mytablemendukung myschema.mytableapakah saya akan menciptakan tantangan lain ( atau masalah ) untuk arsitektur saya?

Sebagai catatan ... Pada beberapa titik ini akan diserahkan ke DBA nyata untuk dipertahankan / didukung jadi saya mencoba untuk memastikan saya tidak membuat hidup mereka lebih sulit.

JoeGeeky
sumber
efek samping menggunakan skema selain dbo adalah Anda jangan lupa untuk menulisnya. Ini adalah langkah menuju penggunaan kembali rencana eksekusi.
Henrik Staun Poulsen

Jawaban:

15

Saya akan mulai dengan mengatakan jangan menganggap skema sebagai ruang nama atau domain objek dalam arti OO. Skema pada dasarnya adalah wadah izin dengan beberapa nilai tambah (lihat di bawah)

Juga, "skema terpisah" atau "database terpisah" adalah 2 konsep yang berbeda. Data yang perlu konsisten secara transaksi dan referensi perlu berada dalam database yang sama. Lihat Satu Database atau Sepuluh? artikel blog untuk lebih.

Dalam database itu, Anda mungkin atau mungkin tidak menggunakan skema untuk mengatur objek Anda.

Secara pribadi, saya penggemar skema dan selalu menggunakannya tetapi untuk hal-hal seperti izin dan pengelompokan logis. Untuk itu, saya akan mengarahkan Anda ke pertanyaan sebelumnya di mana Anda dapat melihat pendapat umum yang mendukung mereka:

Untuk kasus untuk database yang terpisah, lihat jawaban Aaron , tetapi ini semua bergantung pada persyaratan "yang konsisten secara transaksi dan referensial".

gbn
sumber
9

Setuju dengan @gbn. Saya sudah merancang solusi menggunakan skema untuk pemisahan dan basis data untuk pemisahan, dan saya menemukan menggunakan basis data jauh lebih praktis. Beberapa alasan:

  1. Memiliki aplikasi Anda terhubung ke database konteks khusus dan kemudian menjalankan kueri yang sama jauh lebih mudah daripada meminta kueri Anda menyuntikkan <schema>di depan semua referensi objek. Ini cocok untuk banyak SQL dinamis, banyak login aplikasi yang berbeda dengan skema default (artinya kode Anda tidak akan menggunakan awalan skema, mengandalkan skema default pengguna aplikasi - dapat menyebabkan penggembungan cache rencana masif dan debugging yang sulit), atau banyak prosedur tersimpan yang harus dikelola (gambar hanya laporan sederhana, jika Anda memerlukan satu per skema, maka kode berubah, sekarang Anda harus mengubah kode yang sama beberapa kali, satu kali untuk setiap skema).
  2. Memisahkan dengan basis data memungkinkan Anda fleksibilitas untuk memindahkan basis data sibuk ke penyimpanan / instance yang lebih cepat atau berbeda tanpa harus merobek objek dari satu basis data besar yang mencakup semua. Kebanyakan orang tidak memikirkannya sejauh ini di muka, tetapi ini jelas merupakan masalah skala potensial. Terutama jika Anda akhirnya memiliki satu skema yang "mengambil alih" dan membutuhkan sebagian besar sumber daya di server, membaginya dapat menjadi tugas yang sangat rumit, bahkan jika mereka sudah dipisahkan oleh skema.
  3. Database terpisah juga dapat memungkinkan Anda untuk memiliki jadwal pemeliharaan dan cadangan yang berbeda untuk setiap divisi. Saya tidak yakin apa yang Anda maksud dengan "divide by state" tetapi dengan asumsi Anda bermaksud mengisolasi pelanggan, Anda mungkin memiliki pelanggan dengan persyaratan berbeda dan toleransi berbeda untuk kehilangan data, pemeliharaan indeks, dll.
  4. Anda mungkin berakhir dengan pelanggan yang, menurut hukum atau oleh kebijakan perusahaan, mengharuskan Anda untuk menjaga data mereka terpisah dari orang lain. Ini biasanya dapat diterima di tingkat basis data, tetapi tingkat skema biasanya tidak memadai. Anda mungkin tidak memiliki pelanggan ini sekarang, tetapi itu bisa menjadi masalah nyata nanti jika Anda melakukannya.
Aaron Bertrand
sumber
3
Pertanyaan emas sekarang adalah "apakah semua data secara transaksional dan konsisten konsisten"? Saya berasumsi sekarang dan jawaban Anda benar untuk ini
gbn
@ Gbn Itu pertanyaan yang sangat bagus dan sesuatu yang perlu saya pikirkan juga sebelum melakukan jalan.
JoeGeeky
@ AaronBertrand Ini menarik ... Sepertinya saya perlu melakukan sedikit perencanaan kapasitas, dan melihat di mana masalah penskalaan mungkin muncul. Jika penskalaan secara horizontal cocok, lalu pisahkan basis data mungkin merupakan pilihan yang baik? Kalau tidak, saya harus mempertimbangkan pola lain.
JoeGeeky
2
@ JoeGeeky: tunduk pada "konsisten secara transaksional dan referensial", satu basis data dapat ditingkatkan dengan grup-grup fileg juga. Bagaimanapun, Anda memiliki 2 anser yang valid berdasarkan pada use case Anda. Tidak ada yang salah.
gbn