Kami memiliki tabel pembayaran, dan agen mendapatkan komisi pembayaran. Komisi didasarkan pada beberapa faktor yang berbeda, seperti berapa lama waktu yang dibutuhkan untuk mendapatkan pembayaran, sehingga ada beberapa perhitungan yang terlibat ketika menentukan tingkat komisi yang didapat agen, tetapi tidak ada yang rumit.
Misalnya, mungkin tidak akan pernah lebih kompleks dari ini:
SELECT Payments.Amount * CASE
WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 1 THEN Rates.Rate1
WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 2 THEN Rates.Rate2
ELSE Rates.Rate3 END
Apakah masuk akal untuk membangun tabel ke-2 untuk menyimpan data ini alih-alih menanyakannya kapan saja dibutuhkan? Atau haruskah saya tetap dengan kueri run-time yang menarik data kapan pun itu diminta?
Dan yang lebih penting, faktor-faktor apa yang digunakan ketika menentukan apakah kueri harus dijalankan kapan saja data diperlukan, atau jika data harus disimpan dalam tabel terpisah miliknya sendiri?
Jawaban:
Jika kueri dijalankan jarang (misalnya laporan) maka membangun tabel dengan cepat mungkin lebih baik 1 . Jika kueri sering dijalankan dan tabel temp diperlukan untuk kinerja maka Anda berpotensi memiliki masalah.
Jika meja murah untuk dibangun, maka lakukan sebagai tabel temp. Selama database cukup cepat Anda bisa lolos begitu saja. Namun Anda perlu mengawasi kinerja.
Jika tabel tidak harus benar-benar terkini tetapi akan menjadi subjek kegiatan pelaporan yang relatif sering daripada membangun kembali secara berkala mungkin adalah cara terbaik untuk pergi.
Jika tabel mahal untuk dibuat tetapi perlu diperbarui, Anda mungkin perlu mengelolanya sebagai struktur yang dinormalisasi, baik dipertahankan sebagai tampilan yang diindeks atau melalui pemicu. Ini agak lebih rumit dan menempatkan beban tambahan pada operasi penulisan.
Dalam kasus yang lebih ekstrem (yaitu volume data besar), Anda mungkin memerlukan pendekatan hibrid di mana data historis ditanyakan dari struktur yang dinormalisasi yang dioptimalkan untuk kinerja dan data saat ini ditanyakan dari aplikasi langsung.
Kasus-kasus yang paling ekstrem dari hal ini dapat membawa Anda ke data data feed latensi rendah dan solusi OLAP hibrid, jadi ini sejauh ini yang paling kompleks dalam hal seberapa dalam lubang kelinci bisa masuk. Sebaiknya dihindari kecuali Anda memiliki persyaratan asli.
Dalam kasus yang Anda jelaskan di atas, rekondisi berkala tabel pelaporan terdengar tepat. Jika Anda perlu menutup di tengah hari untuk menjalankan laporan, maka Anda dapat menyediakan fasilitas untuk memaksa pembaruan dari aplikasi. Kalau tidak, jalankan pada proses semalam dan agen dapat melihat komisi mereka 'pada tengah malam pada hari kerja sebelumnya.'
1
select into
kueri membuat tabel temp cukup cepat di SQL Server karena operasi penyisipan dicatat secara minimal.Jadi untuk meringkas, Anda menggunakan faktor-faktor berikut untuk menentukan apakah Anda harus memiliki tabel baru untuk data Anda atau tidak:
sumber
how often the data is needed
danhow expensive the query is
?Satu masalah yang tidak tercakup dalam jawaban yang diterima adalah "apakah Anda memerlukan nilai ini dari waktu ke waktu" dan "akankah rumusnya berubah".
Misalnya perhatikan contoh komisi. Jika komisi dibayarkan, jumlah tersebut harus disimpan karena itu adalah angka historis dari apa yang sebenarnya dibayarkan. Cara menghitung komisi dapat berubah bulan depan (dan sering kali demikian) tetapi itu tidak akan mengubah apa yang sebenarnya dibayarkan yang harus disimpan secara terpisah.
Ini adalah ide yang sama dengan menyimpan harga yang sebenarnya dibayar oleh pelanggan untuk suatu produk (setelah perhitungan diskon, dll.) Daripada mengandalkan formula terhadap tabel harga untuk melakukan apa pun kecuali perhitungan awal karena harga produk bulan depan mungkin tidak sama dengan harga saat pelanggan melakukan pemesanan.
Jika Anda memerlukan catatan historis tentang berapa nilainya pada suatu saat, selalu simpan nilainya setelah menggunakan rumus untuk perhitungan awal.
sumber
Mungkin tidak menarik jika Anda dikunci ke dalam basis data tertentu, tetapi MariaDB (yang berbasis pada MySQL) memiliki sesuatu yang luar biasa yang disebut "kolom virtual" yang dapat dihitung secara langsung atau di-cache dalam penyimpanan aktual, tetapi secara otomatis dihitung ulang sesuai kebutuhan. Saya melewatkan fungsi ini sejak saya meninggalkan FileMaker Pro untuk dunia SQL bertahun-tahun yang lalu ...
sumber