Beberapa rekan kerja dan saya berdebat tentang cara terbaik untuk menyimpan data historis. Saat ini, untuk beberapa sistem, saya menggunakan tabel terpisah untuk menyimpan data historis, dan saya menyimpan tabel asli untuk catatan aktif saat ini. Jadi, katakanlah saya punya meja FOO. Di bawah sistem saya, semua catatan aktif akan masuk FOO, dan semua catatan historis akan masuk FOO_Hist. Banyak bidang berbeda di FOO dapat diperbarui oleh pengguna, jadi saya ingin menyimpan akun yang akurat dari semua yang diperbarui. FOO_Hist memiliki bidang yang sama persis dengan FOO dengan pengecualian HIST_ID yang bertambah otomatis. Setiap kali FOO diperbarui, saya melakukan pernyataan menyisipkan ke FOO_Hist mirip dengan:insert into FOO_HIST select * from FOO where id = @id
.
Rekan kerja saya mengatakan bahwa ini adalah desain yang buruk karena saya tidak boleh memiliki salinan tabel yang tepat karena alasan historis dan harus memasukkan catatan lain ke tabel aktif dengan bendera yang menunjukkan bahwa itu untuk tujuan historis.
Apakah ada standar untuk menangani penyimpanan data historis? Tampaknya bagi saya bahwa saya tidak ingin mengacaukan catatan aktif saya dengan semua catatan sejarah saya dalam tabel yang sama mengingat mungkin ada lebih dari satu juta catatan (saya berpikir jangka panjang).
Bagaimana Anda atau perusahaan Anda menangani ini?
Saya menggunakan MS SQL Server 2008, tetapi saya ingin tetap menyimpan jawaban generik dan sembarang dari DBMS mana pun.
sumber
Saya tidak berpikir ada cara standar tertentu untuk melakukannya tetapi saya pikir saya akan melemparkan metode yang mungkin. Saya bekerja di Oracle dan kerangka kerja aplikasi web in-house kami yang menggunakan XML untuk menyimpan data aplikasi.
Kami menggunakan sesuatu yang disebut model Master - Detail yang paling sederhana terdiri dari:
Master Table misalnya dipanggil
Widgets
sering hanya berisi ID. Akan sering berisi data yang tidak akan berubah seiring waktu / tidak historis.Detail / Tabel Sejarah misalnya disebut
Widget_Details
mengandung setidaknya:Jadi pada dasarnya, sebuah entitas dimulai dengan memiliki 1 baris di master dan 1 baris di detail. Detail memiliki tanggal akhir NULL dan STATUS_CONTROL dari 'C'. Ketika pembaruan terjadi, baris saat ini diperbarui untuk memiliki END_DATETIME dari waktu saat ini dan status_control diatur ke NULL (atau 'A' jika lebih disukai). Baris baru dibuat di tabel detail, masih ditautkan ke master yang sama, dengan status_control 'C', id orang yang membuat pembaruan dan data baru yang disimpan di kolom XMLDATA.
Ini adalah dasar dari model sejarah kita. Logika Buat / Perbarui ditangani dalam paket Oracle PL / SQL sehingga Anda cukup melewatkan fungsi ID saat ini, ID pengguna Anda dan data XML baru dan secara internal ia melakukan semua pembaruan / penyisipan baris untuk mewakili bahwa dalam model historis . Waktu mulai dan berakhir menunjukkan kapan baris dalam tabel aktif untuk.
Penyimpanan murah, kami biasanya tidak MENGHAPUS data dan lebih memilih untuk menjaga jejak audit. Ini memungkinkan kami untuk melihat seperti apa data kami pada waktu tertentu. Dengan mengindeks status_control = 'C' atau menggunakan Tampilan, kekacauan bukan masalah. Jelas pertanyaan Anda perlu memperhitungkan Anda harus selalu menggunakan versi saat ini (NULL end_datetime dan status_control = 'C').
sumber
Saya pikir pendekatan Anda sudah benar. Tabel historis harus merupakan salinan dari tabel utama tanpa indeks, pastikan Anda memiliki timestamp pembaruan di tabel juga.
Jika Anda mencoba pendekatan lain segera Anda akan menghadapi masalah:
sumber
Di SQL Server 2016 dan di atasnya , ada fitur baru yang disebut Tabel Temporal yang bertujuan untuk mengatasi tantangan ini dengan upaya minimal dari pengembang . Konsep tabel temporal mirip dengan Change Data Capture (CDC), dengan perbedaan bahwa tabel temporal telah mengabstraksi sebagian besar hal yang harus Anda lakukan secara manual jika Anda menggunakan CDC.
sumber
Ubah pengambilan data: https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-data-capture-sql-server?view=sql-server-2017
Didukung di SQL Server 2008 R2, mungkin didukung di SQL Server 2008.
sumber
pertanyaan ini agak lama tetapi orang masih mengerjakan masalah ini. jadi jika Anda menggunakan oracle Anda mungkin tertarik pada flashback oracle: http://docs.oracle.com/cd/B28359_01/appdev.111/b28424/adfns_flashback.htm
sumber
Hanya ingin menambahkan opsi yang saya mulai gunakan karena saya menggunakan Azure SQL dan beberapa tabel terlalu rumit untuk saya. Saya menambahkan pemicu sisipkan / perbarui / hapus di meja saya dan kemudian ubah sebelum / sesudah diubah menjadi json menggunakan fitur "FOR JSON AUTO".
Itu mengembalikan representasi JSON untuk catatan sebelum / setelah perubahan. Saya kemudian menyimpan nilai-nilai itu di tabel sejarah dengan cap waktu kapan perubahan terjadi (saya juga menyimpan ID untuk catatan kekhawatiran saat ini). Dengan menggunakan proses serialisasi, saya dapat mengontrol bagaimana data ditimbun dalam kasus perubahan skema.
Saya belajar tentang ini dari tautan ini di sini
sumber
Anda bisa mempartisi tabel tidak?
"Tabel Partisi dan Strategi Indeks Menggunakan SQL Server 2008 Ketika tabel database tumbuh dalam ukuran hingga ratusan gigabyte atau lebih, itu bisa menjadi lebih sulit untuk memuat data baru, menghapus data lama, dan mempertahankan indeks. Hanya ukuran tabel semata-mata menyebabkan operasi seperti itu memakan waktu lebih lama. Bahkan data yang harus dimuat atau dihapus bisa sangat besar, membuat operasi INSERT dan DELETE di atas meja tidak praktis. Perangkat lunak database Microsoft SQL Server 2008 menyediakan partisi tabel untuk membuat operasi seperti itu lebih mudah dikelola. "
sumber
Pertanyaan sebenarnya adalah apakah Anda perlu menggunakan data historis dan data aktif bersama untuk pelaporan? Jika demikian simpan dalam satu tabel, partisi dan buat tampilan untuk catatan aktif untuk digunakan dalam kueri aktif. Jika Anda hanya perlu melihatnya sesekali (untuk meneliti masalah leagal atau semacamnya) maka letakkan di tabel terpisah.
sumber
JOIN
dua tabel dalam beberapa laporan historis atau lebih sulit untuk memodifikasi setiap tabel tunggal menyisipkan / memperbarui / menghapus untuk mengetahui masalah sejarah? Sebenarnya, log audit bahkan akan memasukkan data saat ini dalam tabel sejarah, jadi tabel saat ini bahkan tidak diperlukan dalam laporan.Pilihan lain adalah mengarsipkan data operasional berdasarkan [setiap hari | setiap jam | apa pun]. Sebagian besar mesin basis data mendukung ekstraksi data ke dalam arsip .
Pada dasarnya, idenya adalah membuat pekerjaan Windows atau CRON terjadwal itu
Banyak mesin basis data SQL datang dengan alat yang dapat digunakan untuk tujuan ini. Misalnya, saat menggunakan MySQL di Linux, perintah berikut dapat digunakan dalam pekerjaan CRON untuk menjadwalkan ekstraksi:
sumber
Saya Tahu posting lama ini tetapi Hanya ingin menambahkan beberapa poin. Standar untuk masalah seperti itu adalah yang paling sesuai untuk situasi tersebut. memahami perlunya penyimpanan seperti itu, dan potensi penggunaan data pelacakan historis / audit / perubahan sangat penting.
Audit (tujuan keamanan) : Gunakan tabel umum untuk semua tabel yang dapat diaudit. mendefinisikan struktur untuk menyimpan nama kolom, sebelum nilai dan setelah bidang nilai.
Arsip / Historis : untuk kasus-kasus seperti melacak alamat sebelumnya, nomor telepon dll. Membuat tabel terpisah FOO_HIST lebih baik jika skema tabel transaksi aktif Anda tidak berubah secara signifikan di masa mendatang (jika tabel riwayat Anda harus memiliki struktur yang sama). Jika Anda mengantisipasi normalisasi tabel, datatype mengubah penambahan / penghapusan kolom, simpan data historis Anda dalam format xml. mendefinisikan tabel dengan kolom berikut (ID, Tanggal, Versi Skema, XMLData). ini akan dengan mudah menangani perubahan skema. tetapi Anda harus berurusan dengan xml dan itu bisa menimbulkan tingkat komplikasi untuk pengambilan data.
sumber
Anda dapat menggunakan fitur Audit Server MSSQL. Dari versi SQL Server 2012 Anda akan menemukan fitur ini di semua edisi:
http://technet.microsoft.com/en-us/library/cc280386.aspx
sumber
Anda dapat membuat tampilan terwujud / terindeks di atas meja. Berdasarkan kebutuhan Anda, Anda dapat melakukan pembaruan tampilan secara penuh atau sebagian. Silakan lihat ini untuk membuat mview dan login. Bagaimana cara membuat pandangan terwujud dalam SQL Server?
sumber