Latar Belakang
Saya menulis banyak laporan besar untuk dan umumnya memelihara catatan kesehatan besar DB (menulis SP, fungsi, pekerjaan, dll.). Skema asli, dan perangkat lunak yang menggunakannya, berasal dari vendor yang berbeda, jadi saya tidak bisa banyak berubah tentang hal itu secara struktural. Ada banyak catatan yang memerlukan pelacakan seperti laboratorium, prosedur, vaksin, dll. Dan mereka tersebar di puluhan meja, banyak di antaranya membengkak dan indeksnya buruk (saya sudah bisa memperbaikinya).
Masalah
Masalahnya adalah karena kita memiliki sedikit kendali atas DB, dan karena dapat berubah dari pembaruan atau tambalan apa pun, itu membuat penulisan dan pemeliharaan laporan ini menjadi sulit dan melelahkan - terutama ketika ada banyak tumpang tindih. Yang diperlukan hanyalah satu tambalan dan saya buntu menulis ulang sebagian besar laporan. Selain itu, kueri dengan cepat menjadi dikaburkan dan lambat saat bergabung, bersarang memilih, dan menerapkan tumpukan.
"Solusi" saya
Rencana saya adalah untuk menulis semua catatan ini ke satu tabel "catch-all", dan menulis pemicu pada tabel asli untuk mempertahankan catatan dalam tabel agregat ini. Tentu saja saya perlu memastikan pemicu saya tetap utuh setelah pembaruan, tetapi ini akan jauh lebih mudah dari sudut pandang rawatan, dan hanya merujuk data.
Tabelnya akan tipis dan panjang, hanya menyimpan data yang diperlukan, sesuatu seperti ini:
CREATE TABLE dbo.HCM_Event_Log (
id INT IDENTITY,
type_id INT NULL,
orig_id VARCHAR(36) NULL,
patient_id UNIQUEIDENTIFIER NOT NULL,
visit_id UNIQUEIDENTIFIER NULL,
lookup_id VARCHAR(50) NULL,
status VARCHAR(15) NULL,
ordered_datetime DATETIME NULL,
completed_datetime DATETIME NULL,
CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id)
)
Kemudian saya akan memiliki berbagai tabel relasional untuk hal-hal seperti pengelompokan type_id dan item.
Saya mulai menebak ide ini karena beberapa tabel ini ditulis untuk sedikit, SP dan laporan yang akan saya tulis akan referensi data banyak juga. Jadi saya khawatir bahwa tabel ini akan menjadi penguncian rekor dan mimpi buruk kinerja dengan begitu banyak I / O.
Pertanyaan saya
Apakah itu ide yang buruk atau bagus? Saya menyadari setiap situasi berbeda dalam SQL Server (2008 r2 Edisi Standar BTW), dan aturan "kadang-kadang", tapi saya benar-benar hanya mencari saran umum.
Saya mulai mempertimbangkan untuk menggunakan broker layanan, tetapi saya hanya akan melakukan pembaruan / sisipan sederhana ( Lihat alternatif untuk jawaban yang diterima ). Data dalam banyak kasus harus realtime, jadi menggunakan cadangan DB tidak akan berfungsi. Kinerja sudah agak menjadi masalah bagi kami, tetapi sebagian besar terkait perangkat keras yang akan segera diatasi.
sumber
Jawaban:
Jika saya mengerti Anda dengan benar,
Saya akan mendekatinya seperti ini:
Dalam hal ini Anda dapat menyempurnakan struktur dan indeks database Anda untuk meningkatkan kinerja laporan Anda, tanpa mempengaruhi sistem pihak ketiga. Kecuali jika struktur data asli berubah secara dramatis, logika kueri Anda untuk laporan Anda tidak akan berubah jika database pihak ketiga berubah. Anda harus menyesuaikan hanya proses sinkronisasi.
Proses sinkronisasi secara efektif adalah proses konversi - Anda mengonversi data dari basis data pihak ketiga ke dalam struktur yang Anda butuhkan. Bagian dari proses konversi ini dapat memperbaiki masalah normalisasi yang mungkin dimiliki oleh database pihak ketiga. Hanya bagian dari sistem ini yang harus mengetahui dan bergantung pada struktur internal sistem pihak ketiga. Laporan utama dan pertanyaan utama Anda hanya akan bergantung pada basis data Anda.
Jadi, intinya adalah - pisahkan dan batasi bagian sistem Anda yang tergantung pada internal sistem pihak ketiga.
memperbarui
Mengenai persyaratan waktu-nyata. BTW, saya selalu berpikir bahwa definisi "waktu nyata" adalah "waktu respons yang dijamin", bukan "waktu respons yang kecil". Itu tergantung pada aplikasi Anda, tentu saja. Dalam praktik saya sudah cukup jika saya menyinkronkan dua database dalam satu menit dari perubahan yang terdeteksi. Jika pengguna melihat laporan di layar dan beberapa perubahan data yang mendasarinya, laporan tersebut harus dijalankan kembali untuk mencerminkan perubahan ini. Anda dapat polling untuk perubahan atau mendengarkan beberapa acara / pesan, masih permintaan laporan harus dieksekusi lagi untuk menunjukkan perubahan terbaru.
Anda sudah bermaksud menulis pemicu untuk menangkap perubahan di tabel asli dan menulis perubahan ini ke satu tabel umum. Jadi, ambil perubahan seperti yang Anda inginkan, tetapi tulislah untuk tabel yang dinormalisasi dengan benar, bukan satu.
Jadi, ini adalah kasus ekstrem - konversi struktur data pihak ketiga ke dalam struktur data internal Anda dilakukan di pemicu yang mengaktifkan
INSERT/UPDATE/DELETE
tabel pihak ketiga. Ini bisa rumit. Kode pemicu akan tergantung pada struktur internal kedua sistem. Jika konversi non-sepele itu mungkin menunda yang asliINSERT/UPDATE/DELETE
ke titik kegagalan mereka. Jika ada bug di pemicu Anda, hal itu dapat memengaruhi transaksi asli hingga gagal. Jika sistem pihak ketiga berubah, hal itu dapat merusak pelatuk Anda, yang akan menyebabkan transaksi sistem pihak ketiga gagal.Kasus yang kurang ekstrim. Untuk membuat kode pemicu Anda lebih sederhana dan lebih rentan terhadap kesalahan, tulis semua perubahan yang diambil ke beberapa tabel pementasan / audit / diff, tetapkan beberapa tanda / kirim pesan bahwa ada perubahan yang tertunda dan luncurkan proses konversi utama yang akan dilakukan melalui tabel perantara ini dan melakukan konversi. Hal utama di sini adalah bahwa proses konversi yang berpotensi berat harus terjadi di luar ruang lingkup transaksi asli.
Pada pandangan kedua, ini terlihat seperti saran awal Anda dalam pertanyaan. Tapi, perbedaannya adalah: tabel capture-all menampung data hanya sementara; jumlah data kecil - hanya apa yang telah berubah; tidak harus berupa satu tabel; akhirnya data akan disimpan dalam tabel permanen yang dinormalisasi dengan benar, yang Anda kendalikan sepenuhnya, yang independen dari sistem pihak ketiga dan yang dapat Anda sesuaikan dengan pertanyaan Anda.
sumber
Dengan segala cara memasukkannya ke dalam seperangkat tabel standar sehingga Anda dapat mengubah tahap impor daripada harus mengubah laporan dan kueri yang rumit. Tetapi data masih harus dinormalisasi yang akan membutuhkan beberapa tabel (tetapi dengan indeks yang baik).
Seperti yang disebutkan orang lain, jangan gunakan pemicu, sinkronkan dalam batch.
Jangan khawatir tentang banyak gabungan, ketika data dinormalkan dan diindeks dengan benar, ini tidak menambah biaya atau beban manajemen yang signifikan.
Waktu untuk mendenormalisasi menjadi sesuatu seperti data warehouse adalah ketika Anda harus dapat membuat banyak jenis kueri yang berbeda pada data yang tidak dapat Anda prediksi. Ini memiliki kelemahan dan overhead sendiri dan harus digunakan di mana sesuai, bukan sebagai hal yang masuk akal.
sumber
Saya bekerja dengan situasi yang sangat mirip seperti ini di masa lalu di perusahaan manufaktur 24x7 dan akhirnya memutuskan untuk menggunakan replikasi transaksional. Dimungkinkan untuk mengkonfigurasi DDL untuk direplikasi sedemikian rupa sehingga Anda dapat mendorong keluar apa pun tambalan yang berubah menjadi pelanggan. Jelas ada pro dan kontra untuk semuanya dan Anda perlu menimbang mereka untuk menentukan apa yang dapat Anda dukung terhadap apa yang terbaik untuk perusahaan.
Di sisi positif:
Ada kontra, meskipun:
sumber
Pemicu memiliki banyak masalah sehingga Anda harus menghindarinya:
Opsi yang lebih baik adalah pekerjaan yang secara berkala menyalin data ke tabel baru. Laporan Anda dapat menjalankan salinannya. Pekerjaan yang menyalin baris mudah untuk ditulis dan dipelihara, dan tidak ada risiko bahwa itu akan mempengaruhi operasi aplikasi pihak ketiga.
sumber
NOCOUNT
? 4. Tidak akan ada pemicu pada tabel tujuan, dan saya bisa memastikan yang sama untuk yang lain.