Apa praktik terbaik di sekitar pensiunan kolom database usang? [Tutup]

14

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.

Jad S
sumber
Saya pikir cara yang tepat untuk mendekati ini tergantung pada apakah Anda perlu membedakan antara baris yang telah dikumpulkan dari {A, B, C}, dan yang dikumpulkan dari {A, B, D}, dan jika ya, jika data Anda saat ini Model memungkinkan ini. Dan itu juga akan tergantung pada apa yang akan Anda lakukan dengan baris-baris yang dikumpulkan dari {A, B, C} - versi baru aplikasi menunjukkannya sebagai {A, B, D} dengan "D" yang kosong, tetapi sebuah pengguna tidak melihat konten kolom C, ia mungkin tergoda untuk menghapus baris itu dari db (jika aplikasi mengizinkan penghapusan baris), karena ia tidak melihat konten.
Doc Brown
Apakah ada baris dengan C dan D yang dikumpulkan pada saat yang sama? Atau akan selalu A, B, C, Null atau A, B, Null, D? Jika Anda memiliki C, D pada baris yang sama untuk waktu yang singkat ... apa alasan untuk tidak memiliki tabel A, B, C dan dan A, B, D? Apakah kita sedang berbicara ... ratusan baris data? Jutaan? miliaran? Apakah waktu respons merupakan faktor? Banyak detail yang membuat setiap situasi unik ...
WernerCD
@WernerCD menambahkan beberapa detail pada kasus saya dalam pertanyaan
Jad S
Entah Anda menggunakan kolom atau tidak. Gunakan itu, simpan. Jangan, jatuhkan. Jika Anda ingin menyimpan data, pindahkan ke tabel yang berbeda (tidak ada batasan kunci asing) atau ekspor.
Thaylon

Jawaban:

31

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.

kevin cline
sumber
1
Anda mungkin berakhir dengan banyak kolom nol setelah beberapa saat
Ewan
8
mungkin mereka bisa meminta pendekatan praktik terbaik di stackexchange .... ketika itu terjadi
Ewan
8
Saya kira kekesalan saya dengan jawaban semacam ini adalah, tentu Anda bisa lolos begitu saja, tetapi utang teknologinya. Akhirnya Anda menginginkan solusi nyata dan tidak perlu menjelaskan kepada semua karyawan baru mengapa perusahaan teknologi terbaik Anda saat ini di kelas memiliki kolom acak yang tidak digunakan tersebar di db Anda
Ewan
1
Saya melihat poin @wan, tetapi untuk kasus penggunaan saya ini harus dilakukan. Hal-hal mungkin terlalu disederhanakan di kepala saya, tetapi harus cukup mudah untuk menjalankan skrip migrasi data nanti, jika perlu, untuk menyalin data C ke tabel baru dengan referensi ke baris asli di tabel T, dan kemudian menghapus kolom C dari tabel T.
Jad S
3
@ Ewan - misalkan keusangan kolom tidak akan terjadi hanya sekali - itu mungkin terjadi beberapa kali, karena persyaratan desain ditemukan atau berubah. Jika alternatif untuk kolom nol adalah dengan memecah tabel yang terpisah (mis. Struktur warisan) kapan saja kolom menjadi usang, database akan dikotori dengan tabel-tabel gabungan untuk kolom-kolom usang. Saya percaya ini sangat mungkin menjadi lebih buruk.
Thomas W
8

OK, jadi situasinya adalah Anda ingin baris lama memiliki properti C tetapi yang baru tidak.

Ini setara dengan memiliki hubungan warisan kelas

class All
{
    string A;
    string B;
}

class Old : All
{
    string C;
}

class New : All
{
    string D;
}

yang akan Anda wakili pada database dengan tiga tabel dengan hubungan 1 banding 1

table All
    id varchar
    A varchar
    B varchar

table Old
    id varchar
    C  varchar

table New
    id varchar
    D  varchar

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

Ewan
sumber
1
Jika saya membagi tabel, saya lebih suka mengambil tiga dari mereka: {A, B} {C} {D}
Aconcagua
yang tidak cocok dengan contoh?
Ewan
Tunggu. aku rindu membaca
Ewan
2

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.

simon coleman
sumber
1

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.

amelvin
sumber
1

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.

Robbie Dee
sumber
2
OP mengatakan mereka menggunakan Postgres.
TripeHound
Terima kasih - tidak melihat tag. Saya akan mengedit Q.
Robbie Dee
0
  • Anda memiliki Tabel A dengan kolom a, b, c.
  • Buat Tabel B baru dengan kolom a, b, d.
  • Migrasikan data Anda ke Tabel B.
  • Pindahkan kunci asing Anda ke tabel A ke tabel B.

Anda sekarang dapat menggunakan Tabel B dan Anda masih memiliki data lama Anda untuk referensi.

Carra
sumber