Saya merancang aplikasi yang pada tahap awal mengumpulkan data A, B, dan C dari klien, tetapi nantinya akan mengumpulkan data A, B, dan D.
A, B, C, dan D yang sangat terkait dan sekarang ada sebagai kolom dari tabel database PostgreSQL tunggal T .
Setelah C tidak lagi diperlukan, saya ingin menghapus referensi dari aplikasi saya (saya menggunakan Django ORM ), tetapi saya ingin menyimpan data yang sudah dimasukkan. Apa cara terbaik untuk melakukannya?
Saya sudah berpikir untuk membuat tabel baru untuk ABD, tetapi itu berarti yang dapat menyebabkan masalah dengan setiap baris referensi tabel T.
Saya bisa membiarkan kolom C bersama, dan menghapus referensi ke dalamnya dalam kode, memungkinkan data yang ada untuk bertahan hidup.
Apakah ada opsi yang lebih baik yang tidak saya lihat?
Beberapa detail tambahan:
Jumlah baris tidak akan besar, kemungkinan besar 1-2 per pengguna. Ini adalah aplikasi pasar massal, tetapi pada saat saya beralih dari C ke D, basis pengguna belum akan terlalu besar. C dan D kemungkinan tidak akan dikumpulkan pada saat yang sama, meskipun itu kemungkinan. C dan D cenderung masing-masing mewakili beberapa kolom, bukan hanya satu.
Jawaban:
Jika Anda ingin menyimpan data, maka itu tidak usang. Biarkan saja di tempatnya. Tidak masalah jika beberapa kelas yang dipetakan ke tabel tidak memetakan setiap kolom.
sumber
OK, jadi situasinya adalah Anda ingin baris lama memiliki properti C tetapi yang baru tidak.
Ini setara dengan memiliki hubungan warisan kelas
yang akan Anda wakili pada database dengan tiga tabel dengan hubungan 1 banding 1
Jadi Anda bisa membuat skrip migrasi untuk membuat tabel lama baru, salin data id dan C ke sana dan hapus kolom C dari tabel Semua.
Memperbarui kode Anda seperti yang dipersyaratkan dengan sql baru;
Atau, Jika Anda hanya perlu untuk dapat meminta data C lama Anda bisa membuat tabel Arsip baru dengan A, B, C menyalin semua data dan menghapus kolom C, tambahkan kolom D ke tabel 'Langsung' Anda
sumber
Jika penyimpanan data bisa menjadi masalah, maka bagi tabel: kunci / kunci A / B / kunci C / D
Anda dapat melakukan akses baik melalui tampilan (definisi lokasi data di db) atau melalui mengubah definisi ORM.
Ini bukan yang paling berkinerja (bergabung terlibat), tetapi dapat menghadirkan kombinasi A / B / C / D dari waktu ke waktu tanpa mengubah penyimpanan yang mendasarinya & tergantung pada pola akses Anda yang sebenarnya mungkin sudah cukup.
Anda mungkin tidak beruntung dengan kemampuan untuk mengambil downtime, merestrukturisasi tabel dll dalam sistem produksi.
Melakukan akses melalui tampilan memungkinkan Anda untuk beralih dari A / B / C ke A / B / C / D ke A / B / D di tabel di bawahnya dengan perubahan minimal dan tidak ada pergerakan data. Tampilan akan transparan untuk logika baca dan jika dbms Anda mendukung fungsi atau tampilan yang dapat diperbarui, maka transparan juga untuk logika tulis.
Sungguh saya pikir keputusan Anda akan mencerminkan banyak masalah dunia nyata: 1) apa tipe data C & D 2) volume data relatif yang dikumpulkan untuk C / D 3) Tumpang tindih relatif data C / D dibandingkan dengan entri C atau D murni 4) Ketersediaan dan durasi jendela Downtime / pemeliharaan 5) Dukungan DBMS untuk tampilan yang dapat diperbarui 6) Keinginan menjaga detail struktur fisik db dalam ORM vs membuatnya transparan dengan menghadirkan melalui tampilan / fungsi dalam db (di mana sama untuk semua akses aplikasi, bukan hanya yang sekarang)
Jawaban saya lebih disukai untuk tipe data besar / kompleks untuk (1), sedikit tumpang tindih untuk (3) dan downtime minimal untuk (4), idealnya dengan dukungan dbms yang baik di (5) dan beberapa aplikasi mengakses data di (6)
Tetapi tidak ada benar / salah untuk banyak alternatif: - mulai dengan A / B / C, kemudian tambahkan D, sesuaikan ORM, masih kemudian drop kolom C - mulai dengan A / B / C / D & abaikan nulls dll. Saya pikir , pertimbangkan solusi Anda & apa yang Anda ketahui tentang tujuan / siklus hidup yang dimaksud, lakukan pemodelan ukuran / volume & perkirakan untuk mengubah segalanya nanti karena tidak semua akan berubah sesuai harapan.
sumber
Menghapus referensi & menjadi yatim piatu data adalah pilihan berisiko rendah.
Selalu ada kemungkinan penggunaan 'pintu belakang' data yang tidak diketahui yang mungkin atau mungkin tidak penting untuk diungkapkan dengan menghapus kolom.
Bergantung pada konten kolom C mungkin ada masalah kinerja kecil ketika DB secara internal melakukan pemindaian tabel penuh atau upaya untuk menarik seluruh tabel ke dalam memori selama penggabungan jika pengoptimal melihat ini lebih efisien daripada menggunakan indeks.
Aplikasi mungkin membaca seluruh tabel beberapa kali daripada kolom yang dipilih - tetapi jika Anda menggunakan ORM secara eksklusif maka ini tidak mungkin.
sumber
Banyak hal yang perlu dipertimbangkan di sini, tetapi Anda mungkin ingin mempertimbangkan untuk menambahkan tampilan ke overlay tabel daripada membuat perubahan pada tabel secara langsung. Dengan begitu, hanya pandangan yang perlu diubah.
Saya tidak tahu Django ORM, tapi itu bisa jadi kemungkinan.
sumber
Anda sekarang dapat menggunakan Tabel B dan Anda masih memiliki data lama Anda untuk referensi.
sumber