Saya mencoba mengembangkan alat pelaporan kecil (dengan backlite sqlite). Saya bisa menggambarkan alat ini sebagai buku besar "transaksi". Apa yang saya coba lakukan adalah melacak "transaksi" dari ekstrak data mingguan:
- "baru" (atau tambahkan) - sumber daya baru untuk aplikasi saya karena aplikasi saya mungkin belum melacak sumber ini sebelumnya karena belum terlihat melalui ekstrak.
- "perbarui" (atau klik) - ada penggunaan sumber daya itu baru-baru ini, perbarui periode penyimpanan seminggu lagi.
- "delete" (atau drop) - item ini tidak digunakan sejak laporan terakhir (opsional, tetapi akan menyenangkan untuk membuat grafik perubahan permintaan dari minggu ke minggu untuk sumber daya).
Yang saya dapatkan hanyalah ekstrak data mingguan (flat-delimited file flat) yang berasal dari sistem pengarsipan / manajemen catatan lama yang tidak dapat saya kendalikan.
Setiap baris dapat didistilasi pada dasarnya ini:
resource_id | resource info | customer_id | customer_info
Contoh data:
10| Title X | 1 | Bob
11| Another title | 1 | Bob
10| Title X | 2 | Alice
Tujuannya adalah memudahkan untuk melaporkan sumber daya yang belum terlihat digunakan selama X-bulan (berdasarkan hit terakhir). Ada periode retensi di mana sumber daya disimpan untuk memudahkan akses jika populer. Sumber daya yang tidak terlihat digunakan selama 18 bulan ditandai untuk arsip jangka panjang di tempat lain.
Ini pasti masalah umum. Ingin tahu apakah ada algoritma tujuan umum untuk menentukan apa yang baru / sama / dihapus antara set data (db vs ekstrak terbaru)?
Jika Anda tetap menyimpan pembaruan dalam backend SQLite, Anda bisa mengubah pembaruan mingguan menjadi tabel baru dan membandingkannya dengan data yang diarsipkan dengan kueri, sebelum menggabungkannya.
Contoh menggunakan SQL untuk menemukan tambahan baru ke tabel: /programming/2077807/sql-query-to-return-differences-between-two-tables
Jika bidang di DB Anda menyimpan tanggal transaksi, Anda bisa menanyakan semua pengguna yang telah melakukan transaksi dalam 18 bulan terakhir. Maka arsipnya hanyalah DB penuh. Atau, Anda dapat meminta semua pengguna yang belum, mengekstrak datanya, lalu menjatuhkannya. Pembaruan hanyalah setiap baris waktu yang dicentang minggu ini.
sumber
Vector
.Ide alternatif:
Parsing daftar transaksi Anda ke dalam beberapa jenis struktur data, seperti sebuah array. (Dalam C ++, pikirkan
Vector
, dan di JawaArrayList
,.)Lakukan kueri pada SQL backend Anda seperti
SELECT DISTINCT customer_id FROM Transactions ORDER BY customer_id
dan kemas ID pelanggan berbeda yang diurutkan ke dalam satu setold
,. Jika Anda melakukan hal yang sama persis denganWHERE
klausa yang memisahkan transaksi lama dan baru, Anda dapat melewati langkah 3.Dapatkan ID pelanggan unik dari pembaruan baru ke dalam struktur data yang terpisah, dalam urutan diurutkan. Ada beberapa struktur data yang bisa Anda gunakan untuk masuk ke dalam struktur data
new
,. Urutan penyisipan ke dalam daftar ditautkan ganda sangat sederhana, tetapi menggunakan hashtable antara akan berjalan mendekati waktu linier, atau jika Anda tetap menyortir larik asli, mendapatkan seperangkat yang mudah.Ambil perbedaan set
new
-old
menggunakan perpustakaan standar bahasa favorit Anda. Bahasa favorit Anda memang memiliki algoritma ini di perpustakaan standarnya?Hal-hal lain yang ingin Anda lakukan adalah pertanyaan SQL setelah Anda memperbarui basis data transaksi Anda.
Catatan pada langkah 3: Pertimbangkan sifat data Anda. Misalkan file teks Anda mencantumkan pesanan secara kronologis, dan dalam minggu-minggu biasa, ada banyak pelanggan baru yang diberi pesanan baru
customer_id
dalam urutan menaik. Misalkan sebagian besar pesanan lainnya berasal dari sejumlah kecil pelanggan setia, dengan yang lebih rendahcustomer_id
. Maka input Anda sudah sebagian besar diurutkan. Jenis penyisipan di mana Anda mencoba memasukkan rendahcustomer_id
di depan daftar ditautkan ganda dan tinggicustomer_id
di belakang akan, dalam situasi itu, berkinerja baik dalam praktek.sumber
Seperti yang saya mengerti dari pertanyaan Anda, Anda sebenarnya memiliki resource_id (+ info) dan "daftar" pelanggan (id + info).
Jadi Anda dapat dengan mudah menyimpan Daftar pelanggan per sumber daya dan memeriksa simpul terakhir di setiap daftar pada sumber daya (untuk mengetahui waktu operasi terakhir; Anda hanya perlu menambahkan bidang tanggal ke pelanggan Anda dalam kode)
Saya tidak terbiasa dengan SQL, oleh karena itu saya memberikan contoh saya dengan
HashMap
dan Daftar tapi saya yakin itu ide yang sama:,HashMap <Resource, List<Customer>>
kapanResource
harus mengandung resourceID sebagai kunci danCustomer
harus berisi ID pelanggan, info dan tanggal operasi.Dengan ide ini Anda dapat dengan mudah mengetahui waktu pengoperasian terakhir dan dapat memodifikasi sumber daya apa pun (tambahkan \ hapus sumber daya \ pelanggan).
sumber
Jika Anda menggunakan database SqLite, jika Anda menambahkan tanggal batch juga sebagai kolom tabel,
akan sangat mudah untuk menggunakan SQL untuk mendapatkan sumber daya yang tidak digunakan dalam X hari terakhir
Saya belum menguji SQL tetapi harus memberi Anda ide
sumber
Dari posting asli, kedengarannya seperti data yang dicerna tidak memiliki bidang untuk menunjukkan tanggal / waktu transaksi, dan saya kira file tersebut dicerna secara berkala berdasarkan jadwal seperti harian, jam, dll.
Saya akan menangani ini dengan menambahkan kolom timestamp SQL yang dapat dibuat secara otomatis pada tingkat basis data, atau dengan kode yang mengekstrak data dan memasukkan ke dalam DB. Kemudian Anda meletakkan indeks pada kolom cap waktu itu dan selesai dengan itu. Biarkan mesin DB melakukan tugasnya agar efisien untuk menjawab pertanyaan "berapa banyak transaksi yang belum terjadi sejak saat ini", atau "berapa banyak antara waktu ini dan waktu itu".
Kemudian Anda menjadwalkan pekerjaan untuk meminta dan menghitung perbedaan yang ingin Anda laporkan. Transaksi yang "baru" adalah transaksi yang tidak memiliki catatan dalam DB sebelum tanggal Anda menanyakan "baru sejak". Catatan lama adalah catatan yang tidak memiliki transaksi sejak tanggal cut-off.
sumber
Bukankah ini untuk apa HashTables? Jika semua yang ingin Anda lakukan adalah menyimpan catatan sumber daya mana yang telah digunakan dalam beberapa bulan terakhir dan menghapus sumber daya yang belum diakses dalam 18 bulan terakhir maka Anda dapat menggunakan HashTable di mana Kuncinya adalah resource_id dan nilainya adalah tanggal akses terakhir.
Untuk pengarsipan catatan> 18 bulan, Anda bisa menelusuri semua catatan di tabel hash dan hanya menghapus (atau memindahkan) catatan spesifik tersebut. (Anda dapat melakukan ini setiap minggu saat laporan masuk)
sumber