Inilah kesulitan saya. Salah satu dari beberapa program yang baru-baru ini saya warisi dibangun dengan database yang mengerikan di backend. Pencipta yang terhormat itu rupanya tidak menghargai konsep relasional. Tabel untuk masing-masing dan setiap klien, dinamai sebagai ID klien yang unik. Delapan puluh tiga bidang bernama cryptically. Kode ini semuanya prosedural dengan lusinan pernyataan SQL inline bersambung.
Karena kami tidak dilengkapi dengan aplikasi tambahan penting yang menjalankan database yang sama, saya telah ditugaskan untuk membuatnya dari awal. Saya adalah pengembang tunggal, yang bahkan bukan tanggung jawab utama saya karena setidaknya setengah dari waktu saya diambil oleh hal-hal operasi. Ada tenggat waktu yang tak terhindarkan yang ditetapkan selama 30 hari dari sekarang.
Terlepas dari pengalaman saya, saya yakin saya bisa mendesain database ini dan aplikasi yang ada jauh lebih baik daripada sebelumnya, tetapi saya tidak berpikir itu realistis bagi saya untuk mengubah database, menyesuaikan aplikasi yang ada, dan pastikan saya tidak melakukannya Jangan pecahkan apa pun saat perlu membuat aplikasi tambahan ini dengan cepat.
Jadi mari kita asumsikan saya terjebak dengan database yang mengerikan. Perlu bekerja dengan struktur yang begitu buruk, akankah sesuatu yang saya tulis yang sesuai dengannya hanya menambah tumpukan utang teknis yang harus ditangguhkan sampai sesuatu yang benar-benar rusak atau fungsi baru diperlukan? Bagaimana saya bisa mendekati situasi ini dan mendapatkan sesuatu yang baik selain dari aplikasi yang mudah-mudahan fungsional?
sunting: Jika ada yang tertarik, kami akhirnya menghapus basis data yang mengerikan ini dan aplikasi yang menjalankannya. Kami mengalihdayakan pembuatan aplikasi tambahan (saya tidak terlibat dalam pengaturan ini) pada akhirnya dua kontraktor yang berbeda yang akhirnya jatuh pada kami, tidak menghasilkan apa-apa. Saya akhirnya harus menjalankan perbaikan yang mengerikan, sebagian fungsional dari perbaikan dalam tiga hari yang masih digunakan sampai sekarang.
sumber
Jawaban:
Ada harapan, tetapi ini adalah perjuangan yang berat, terutama jika tidak ada yang menyadari bahwa desain database mengerikan. Anda dapat mencoba untuk mengabstraksi nastiness dengan lapisan abstraksi, tetapi kemungkinan itu tidak akan sebanding dengan pertempuran.
Saran saya adalah untuk membuat abstraksi yang cukup atas database sehingga aplikasi itu sendiri bersih dan dirancang dengan baik; dengan begitu jika Anda dapat memperbaiki database, aplikasi tidak akan terpengaruh karena tidak peduli bagaimana database dirancang.
Ini adalah pendekatan yang biasanya saya gunakan ketika berhadapan dengan database yang ada dan, lebih sering daripada tidak, dirancang dengan pemikiran nol. Beberapa aplikasi pilihan pola Repositori atau Gateway, dengan beberapa lapisan layanan untuk berbicara dengan gateway / repositori, akan membantu untuk mengkarantina desain yang buruk.
sumber
Buat layer antarmuka yang menangani semua hal DB lalu tulis aplikasi Anda untuk berinteraksi dengannya. Jika database pernah "diperbaiki", Anda hanya mengganti / memperbarui "antarmuka" Anda. Pendekatan ini telah menyelamatkan saya banyak waktu ketika berhadapan dengan database yang buruk atau database yang memberi makan aplikasi lain dan tidak dapat dikacaukan.
sumber
Aduh ... Anda mewarisi kekacauan mimpi buruk, Anda punya 30 hari untuk membuatnya dapat digunakan untuk organisasi Anda, dan setengah hari Anda diambil dengan tugas-tugas operasi?
Saya yakin Anda bisa refactor tetapi tentu saja tidak dalam waktu sebanyak itu.
Untuk menjawab pertanyaan Anda, saya rasa Anda tidak bisa menulis kode yang bagus pada desain seperti itu. Utang teknis sudah terlalu banyak. Jika saya adalah Anda, saya akan meretas fitur yang saya bisa, dan tekan untuk refactoring lengkap di kemudian hari ketika Anda memiliki lebih banyak waktu dan orang-orang di tim Anda untuk mengatasinya dengan lebih baik.
Hati-hati mendorong untuk refactoring. Terkadang atasan akan membuat keputusan untuk membeli kode sumber produk dan hak kepemilikan dan mereka tidak ingin berpikir bahwa mereka benar-benar membuang-buang uang mereka untuk sampah. Ini adalah kasus bagi saya di satu pekerjaan yang saya miliki. Sayangnya manajer membuat keputusan untuk membeli perangkat lunak seperti ini dan mereka tidak pernah mendapatkan keterlibatan teknis untuk mengevaluasi apa yang mereka beli dan melihat apakah itu dapat dipertahankan dan memiliki banyak hutang teknis. Dalam hal ini keputusan yang buruk adalah keputusan politik dan mendorong refactoring dapat membahayakan pekerjaan Anda.
sumber
Database dapat di-refactored seperti kode lainnya. Perbaiki bagian yang dipengaruhi oleh kode yang Anda butuhkan untuk menulis dan menulis tes untuk memastikan tidak ada lagi yang rusak. Lakukan sedikit demi sedikit sama seperti refactoring lainnya. Ada buku bagus tentang refactoring basis data yang mungkin membantu Anda memulai membersihkan kekacauan. http://www.amazon.com/Refactoring-Databases-Evolutionary-paperback-Addison-Wesley/dp/0321774515/ref=sr_1_1?ie=UTF8&qid=1307025831&sr=8-1
Ada yang lain juga, tapi saya pribadi sudah membaca dan bekerja dengan teknik yang satu ini.
Dan jangan lupa Anda dapat merestrukturisasi cara yang Anda butuhkan untuk query database dengan membuat tampilan untuk melakukan pekerjaan transformatif yang buruk bagi Anda menjadi sturcture yang lebih mudah untuk query.
sumber
Untuk mendapatkan keuntungan terbesar dari uang Anda, buat tampilan yang dapat diperbarui untuk memulihkan beberapa "keterkaitan" dan untuk memberikan nama kolom yang lebih bermakna.
sumber
Satu kemungkinan adalah untuk membuat database kedua yang terstruktur (setidaknya lebih dekat dengan) seperti yang Anda inginkan, dan mengatur replikasi antara dua database. Kemudian Anda dapat menulis kode Anda terhadap basis data baru dan tetap membiarkan basis data (dan aplikasi) yang ada tetap utuh, untuk ditangani ketika Anda memiliki lebih banyak waktu.
Sejujurnya, masih terbuka untuk banyak pertanyaan apakah Anda dapat melakukannya dalam ~ 15 hari kerja. Secara khusus, itu kemungkinan tergantung pada apakah Anda memerlukan replikasi dua arah (yaitu, aplikasi baru Anda benar-benar akan memperbarui data) atau hanya satu arah (aplikasi baru Anda hanya membuat orang melihat data). Kasus terakhir (tentu saja) secara dramatis lebih mudah untuk ditangani.
Jika Anda membutuhkan replikasi dua arah, kemungkinannya adalah itu tidak cukup waktu untuk melakukan pekerjaan itu. Secara khusus, replikasi dua arah yang melibatkan transformasi struktur secara substansial tidak pernah sepele, dan alat yang tersedia sering mendukungnya dengan sangat buruk (misalnya, harus menulis secara manual semua SQL untuk semua transformasi data di kedua arah).
Jika Anda hanya perlu satu arah, itu tepat pada titik yang mungkin membatasi kemungkinan. Hal ini juga akan tergantung sedikit pada apakah Anda diperbolehkan untuk menghabiskan uang atau tidak - ada beberapa data yang pergudangan aplikasi yang ditujukan untuk persis semacam ini tugas yang mungkin akan membuatnya sedikit lebih cepat dan lebih mudah untuk mengelola - tetapi kebanyakan dari mereka tidak murah.
sumber