Baru-baru ini, saya mulai bekerja pada beberapa sistem warisan. Orang-orang yang mengembangkannya, datang ke ide untuk menyimpan daftar string dalam bidang tunggal dari tabel database. Katakanlah itu adalah pengidentifikasi untuk objek yang tidak memiliki representasi atau data dalam database. Kisaran pengidentifikasi itu akan relatif kecil dalam produksi.
Di sisi lain, intuisi saya dan "selera desain yang bagus" memberi tahu saya bahwa itu harus diwakili dalam tabel terpisah (mirip dengan meja yang digunakan untuk mewakili banyak-ke-banyak hubungan).
Apakah pendekatan mereka benar-benar buruk dan akan lebih baik untuk memulai refactoring? Jika ya, konsekuensi buruk apa yang dapat ditimbulkan oleh desain asli di masa depan? Apakah ada prinsip desain relasional yang menjelaskan pendekatan itu?
Edit untuk menanggapi komentar:
Seperti yang saya duga, mereka tidak menggunakan pendekatan ini untuk menyelesaikan beberapa masalah khusus seperti penataan hierarkis dengan cara yang rumit. Skenario yang paling mungkin adalah mereka hanya bekerja di bawah tekanan waktu dan perlu mengimplementasikan fitur baru secepat mungkin.
Saya yakin bahwa sebelumnya bidang mewakili nilai tunggal. Mereka akan mengimplementasikan fitur untuk menyimpan lebih dari satu nilai dan mencoba menghindari migrasi basis data.
Jawaban:
Datamodel tidak dinormalisasi; untuk jadi itu akan membutuhkan tabel terpisah seperti yang Anda katakan. Dalam hal itu, itu bukan praktik datamodelling yang sangat baik.
Apakah itu dilakukan untuk alasan yang baik atau tidak sulit untuk ditentukan. Dapat dibayangkan, pengkodean penyederhanaan atau kinerja mungkin merupakan motivator. Kemungkinannya adalah bahwa bidang awalnya berisi satu pengidentifikasi, persyaratan berubah dan pengembang tidak punya waktu atau kecenderungan untuk faktor ulang.
Mungkin yang lebih penting adalah apakah Anda harus memperbaiki diri atau tidak. Dalam keadaan yang serupa, saya tidak akan secara langsung menolak kasus seperti ini secara default. Saya akan mempertimbangkannya jika salah satu dari yang berikut ini diterapkan:
Apa yang akan saya lakukan, dan TBH saya akan merekomendasikan ini setiap kali Anda mengambil alih aplikasi warisan, adalah memulai wiki (atau setara) dan mendokumentasikan kasus-kasus seperti ini. Sebagai contoh,
Saya telah menemukan bahwa ini adalah memo ajudan yang berguna bagi saya ketika saya bekerja di dan / atau kembali ke basis kode. Ini juga bisa sangat membantu penerus Anda ketika mereka, pada gilirannya, perlu mulai mempelajari basis kode.
sumber
Ini umumnya akan dianggap sebagai pelanggaran normalisasi.
Namun, kadang-kadang ini digunakan solusi untuk masalah, misalnya dalam penataan hierarkis, di mana string jalur panjang variabel semacam mewakili struktur.
Di antara masalah dengan daftar item dalam satu string dapat berupa:
sumber
Ini adalah antipattern umum untuk melakukan ini.
Persyaratan Anda berubah dan sekarang Anda membutuhkan lebih banyak nilai di tempat yang dulu hanya membutuhkan nilai. Seperti buku, hanya punya satu penulis, bukan? Siapa yang dapat menduga bahwa sebuah buku memiliki banyak penulis? Ini adalah cara mudah untuk memenuhi perubahan persyaratan ini tanpa harus mengubah skema basis data Anda.
Ada beberapa kelemahannya.
Jadi pada dasarnya, tolong jangan lakukan ini.
Pada dasarnya Anda mengambil "relasional" dalam "database relasional".
sumber
Ada banyak argumen untuk menjadi ide yang buruk. Saya pikir akan adil untuk menambahkan beberapa alasan mengapa itu akan menjadi ide yang bagus, atau setidaknya OK. Tidak yakin berapa banyak dari ini berlaku dalam kasus khusus, tetapi tampaknya setidaknya pernyataan kinerja yang dilakukan relevan:
Ketika mencoba refactoring, itu selalu merupakan ide yang baik untuk terlebih dahulu memahami alasan di balik pilihan desain sebelumnya. Pastikan bahwa kondisi dan persyaratan memang cukup berubah untuk menjamin biaya dan risiko.
sumber