Saya yakin saya bukan satu-satunya yang frustrasi ketika mereka melihat halaman kode yang dikotori dengan query SQL. ActiveRecord dan pola ORM lainnya membantu mengurangi jumlah SQL yang digunakan dalam proyek, tetapi dalam banyak kasus pertanyaan kompleks, penggunaan SQL tampaknya tidak dapat dihindari.
Saya mencari pendapat tentang bagaimana query SQL harus diatur dengan sisa kode (atau eksternal untuk itu) agar tidak tersebar di semua tempat? Satu ide yang jelas adalah penggunaan Views, tetapi sering Views dapat menjadi sumber masalah kinerja ketika berhadapan dengan banyak tabel besar yang diindeks, dll.
EDIT 1 - Saya berasumsi Anda sudah memisahkannya ke dalam lapisan model
sql
code-formatting
ubur-ubur
sumber
sumber
Jawaban:
Bagi saya, SQL adalah bagian mendasar (dalam banyak kasus, mayoritas) dari kode logika bisnis. Jika Anda mencoba untuk memisahkannya dari kode yang beroperasi pada data yang dikembalikan, Anda lebih cenderung tidak menyeimbangkan pengertian dan keteraturan kode.
Ketika saya melihatnya, membaca data, memproses data, menulis data, mencari data ... mereka semua adalah operasi yang sama, dan paling baik disimpan di tempat yang sama.
Jika Anda mulai merasakan duplikasi upaya dengan kueri, maka mungkin Anda memerlukan tampilan basis data atau objek yang dapat merangkum aspek akses basis data itu.
Tip lainnya adalah benar-benar memiliki metode kueri basis data yang baik. Dalam perangkat lunak yang saya tulis (PostgreSQL, MySQL, SQL Server), saya telah memastikan bahwa sebagian besar operasi permintaan saya dapat dilakukan sebagai pernyataan kode tunggal.
Itulah (kira-kira) panggilan fungsi utama yang saya pastikan adalah bagian dari "objek koneksi" saya. Itu tergantung pada bahasa, apa yang sebenarnya Anda implementasikan, tetapi poin saya adalah menjaganya tetap benar-benar sederhana dan tidak menyakitkan.
Singkatnya, perlakukan SQL sebagai bagian asli pemrograman, dan jangan abstraksi demi abstraksi.
sumber
Secara umum, memiliki lapisan model terpisah adalah pendekatan terbaik. Ada sejumlah pola desain perusahaan yang memberi jalan kepada arsitek ini.
sumber
Mungkin ide yang baik untuk memisahkan layer model Anda menjadi 3 sub-layer - "entitas", "repositori" dan "layanan". Ini akan memberi Anda pemisahan kekhawatiran dan mengumpulkan SQL di satu tempat, di luar logika bisnis Anda.
Dalam skenario ini semua kode pengambilan data, termasuk SQL kompleks - akan ditempatkan di repositori. Jadi tujuan repositori adalah untuk menyembunyikan pernyataan SQL yang rumit di belakang metode self-explanatory like
getUsersWithActiveSubscription()
.Abstrak entitas yang benar-benar nama bidang tabel DB dengan getter dan setter, dapat memberikan beberapa konversi data antara jenis dan tipe bidang DB yang tersedia di aplikasi / bahasa pemrograman Anda. Jika ORM Anda mendukung bahwa - entitas dapat menangani asosiasi.
Lapisan layanan adalah tempat untuk logika bisnis. Layanan mengambil entitas menggunakan repositori, bertindak atas mereka dan menyimpannya kembali.
sumber