Pertanyaan ini sebenarnya adalah banyak masalah dengan model data Anda digulung menjadi satu. Anda harus mulai melepaskan mereka, satu per satu. Solusi yang lebih alami dan intuitif akan keluar saat Anda mencoba menyederhanakan setiap bagian teka-teki.
Masalah 1: Anda tidak dapat bergantung pada Pesanan DB
Deskripsi Anda tentang pengurutan data Anda tidak jelas.
- Masalah potensial terbesar adalah bahwa Anda tidak menentukan jenis eksplisit dalam database Anda, melalui
ORDER BY
klausa. Jika bukan karena sepertinya terlalu mahal, program Anda memiliki bug . Database diizinkan untuk mengembalikan hasil dalam urutan apa pun jika Anda tidak menentukannya; Anda tidak dapat bergantung padanya secara acak mengembalikan data dalam urutan hanya karena Anda menjalankan kueri beberapa kali dan terlihat seperti itu. Urutan mungkin berubah karena baris disusun ulang pada disk, atau beberapa dihapus dan yang baru menggantikannya, atau indeks ditambahkan. Anda harus menentukan ORDER BY
klausa dari beberapa jenis. Kecepatan tidak ada artinya tanpa kebenaran.
- Juga tidak jelas apa yang Anda maksud dengan penyisipan urutan penyisipan. Jika Anda berbicara tentang database itu sendiri, Anda harus memiliki kolom yang benar-benar melacak ini, dan itu harus dimasukkan dalam
ORDER BY
klausa Anda . Kalau tidak, Anda memiliki bug. Jika kolom seperti itu belum ada, maka Anda perlu menambahkannya. Opsi khas untuk kolom seperti ini adalah kolom cap waktu penyisipan atau kunci penambahan otomatis. Kunci peningkatan otomatis lebih dapat diandalkan.
Masalah 2: Membuat memori menjadi efisien
Setelah Anda memastikan itu dijamin akan mengembalikan data dalam urutan yang Anda harapkan, Anda dapat memanfaatkan fakta ini untuk membuat jenis memori jauh lebih efisien. Cukup tambahkan kolom row_number()
ataudense_rank()
(atau setara dengan basis data Anda) ke set hasil kueri Anda. Sekarang setiap baris memiliki indeks yang akan memberi Anda indikasi langsung tentang urutan seharusnya, dan Anda dapat mengurutkannya dalam memori dengan mudah. Pastikan Anda memberi indeks nama yang bermakna (seperti sortedBySomethingIndex
).
Biola. Sekarang Anda tidak perlu lagi bergantung pada urutan hasil basis data.
Masalah 3: Apakah Anda bahkan perlu melakukan pemrosesan kode ini?
SQL sebenarnya sangat kuat. Ini adalah bahasa deklaratif luar biasa yang memungkinkan Anda melakukan banyak transformasi dan agregasi pada data Anda. Sebagian besar DB bahkan mendukung operasi lintas baris saat ini. Mereka disebut fungsi jendela atau analitik:
Apakah Anda bahkan perlu menarik data Anda ke dalam memori seperti ini? Atau bisakah Anda melakukan semua pekerjaan dalam kueri SQL dengan menggunakan fungsi jendela? Jika Anda dapat melakukan semua (atau bahkan mungkin hanya bagian penting) dari pekerjaan di DB, fantastis! Masalah kode Anda hilang (atau menjadi lebih sederhana)!
Masalah 4: Anda melakukan apa untuk itu data
?
Dengan asumsi Anda tidak dapat melakukan semuanya dalam DB, biarkan saya meluruskan ini. Anda mengambil data sebagai peta (yang dikunci oleh hal-hal yang tidak ingin Anda urutkan berdasarkan), lalu Anda mengulanginya dengan urutan penyisipan , dan memodifikasi peta dengan mengganti nilai beberapa kunci dan menambahkan yang baru?
Maaf, tapi apa-apaan ini?
Penelepon seharusnya tidak perlu khawatir tentang semua ini . Sistem yang Anda buat sangat rapuh. Hanya perlu satu kesalahan bodoh (bahkan mungkin dibuat sendiri, seperti yang telah kita semua lakukan) untuk membuat satu perubahan kecil yang salah dan semuanya runtuh seperti setumpuk kartu.
Ini mungkin ide yang lebih baik:
- Apakah fungsi Anda menerima a
List
.
- Ada beberapa cara untuk menangani masalah pemesanan.
- Terapkan Gagal Cepat. Lempar kesalahan jika daftar tidak sesuai dengan urutan fungsi yang disyaratkan. (Catatan: Anda dapat menggunakan indeks pengurutan dari Masalah 2 untuk mengetahui apakah itu benar.)
- Buat salinan yang diurutkan sendiri (lagi menggunakan indeks dari masalah 2).
- Mencari cara untuk membangun peta itu sendiri secara berurutan.
- Buat peta yang Anda butuhkan secara internal untuk fungsi tersebut, sehingga penelepon tidak perlu mempedulikannya.
- Sekarang ulangi apa pun dalam rangka representasi yang Anda miliki dan lakukan apa yang harus Anda lakukan.
- Kembalikan peta, atau ubah menjadi nilai pengembalian yang sesuai
Variasi yang mungkin bisa berupa membangun representasi yang diurutkan dan kemudian membuat peta kunci untuk diindeks . Ini akan memungkinkan Anda memodifikasi salinan yang disortir di tempatnya, tanpa sengaja membuat duplikat.
Atau mungkin ini lebih masuk akal: singkirkan data
parameternya dan buat processData
benar - benar mengambil datanya sendiri. Anda kemudian dapat mendokumentasikan bahwa Anda melakukan ini karena memiliki persyaratan yang sangat spesifik tentang cara pengambilan data. Dengan kata lain, buat fungsi memiliki seluruh proses, bukan hanya satu bagian saja; inter-dependensi terlalu kuat untuk membagi logika menjadi potongan yang lebih kecil. (Ubah nama fungsi dalam proses.)
Mungkin ini tidak akan berhasil untuk situasi Anda. Saya tidak tahu tanpa detail lengkap masalah. Tapi saya tahu desain yang rapuh dan membingungkan ketika saya mendengarnya.
Ringkasan
Saya pikir masalah di sini pada akhirnya adalah bahwa setan ada dalam perinciannya. Ketika saya mulai mengalami masalah seperti ini, biasanya karena saya memiliki representasi data saya yang tidak sesuai untuk masalah yang saya coba selesaikan. Solusi terbaik adalah menemukan representasi yang lebih baik , dan kemudian masalah saya menjadi sederhana (mungkin tidak mudah, tetapi langsung) untuk dipecahkan.
Temukan seseorang yang mendapatkan poin itu: pekerjaan Anda adalah mengurangi masalah Anda menjadi serangkaian masalah yang sederhana dan langsung. Kemudian Anda dapat membuat kode yang kuat dan intuitif. Bicaralah pada mereka. Kode yang bagus dan desain yang bagus membuat Anda berpikir bahwa ada orang idiot yang bisa memikirkannya, karena mereka sederhana dan mudah. Mungkin ada pengembang senior yang memiliki pola pikir yang bisa Anda ajak bicara.