Tampaknya lebih banyak sistem kontrol sumber masih menggunakan file sebagai cara menyimpan data versi. Vault dan TFS menggunakan Sql Server sebagai penyimpan data mereka, yang saya pikir akan lebih baik untuk konsistensi data serta kecepatan.
Jadi mengapa SVN, saya percaya GIT, CVS, dll masih menggunakan sistem file sebagai dasarnya sebuah database, (Saya mengajukan pertanyaan ini karena server SVN kami hanya merusak dirinya sendiri selama komit normal) daripada menggunakan perangkat lunak database aktual ( MSSQL, Oracle, Postgre, dll)?
EDIT: Saya pikir cara lain untuk mengajukan pertanyaan saya adalah "mengapa pengembang VCS menggulung sistem penyimpanan data terstruktur mereka sendiri daripada menggunakan yang ada?"
version-control
Andy
sumber
sumber
Jawaban:
TL; DR: Beberapa sistem kontrol versi menggunakan database karena itu tidak perlu.
Sebagai pertanyaan untuk jawaban pertanyaan, mengapa tidak? Apa manfaat yang ditawarkan sistem database "nyata" di atas sistem file dalam konteks ini?
Pertimbangkan bahwa kontrol revisi sebagian besar melacak metadata kecil dan banyak perbedaan teks. Teks tidak disimpan dalam database lebih efisien, dan indeksabilitas konten tidak akan menjadi faktor.
Mari kita berasumsi bahwa Git (demi argumen) menggunakan BDB atau SQLite DB untuk back-end untuk menyimpan data. Apa yang lebih bisa diandalkan tentang itu? Apa pun yang dapat merusak file sederhana juga dapat merusak database (karena itu juga file sederhana dengan pengkodean yang lebih kompleks).
Dari paradigma programmer tidak mengoptimalkan kecuali jika diperlukan, jika sistem kontrol revisi cukup cepat dan bekerja cukup andal, mengapa mengubah seluruh desain untuk menggunakan sistem yang lebih kompleks?
sumber
TL;DR
adalah versi singkat dari jawaban, bukan pernyataan bahwa pertanyaannya terlalu panjang dan dia tidak membacanya sebelum menjawab.Anda tampaknya membuat banyak asumsi, mungkin berdasarkan pengalaman Anda dengan SVN dan CVS.
Git dan Mercurial pada dasarnya seperti SVN dan CVS
Membandingkan git dan CVS seperti membandingkan iPad dan Atari. CVS diciptakan kembali ketika dinoaurs menjelajahi Bumi . Subversi pada dasarnya adalah versi perbaikan CVS. Dengan asumsi bahwa sistem kontrol versi modern seperti git dan pekerjaan Mercurial seperti mereka sangat tidak masuk akal.
Database relasional lebih efisien daripada database tujuan tunggal
Mengapa? Basis data relasional sangat rumit, dan mungkin tidak seefisien basis data satu tujuan. Beberapa perbedaan dari kepala saya:
Database relasional lebih aman
Lagi-lagi kenapa? Anda tampaknya berasumsi bahwa karena data disimpan dalam file, sistem kontrol versi seperti git dan Mercurial tidak memiliki komitmen atom , tetapi mereka melakukannya. Database relasional juga menyimpan database mereka sebagai file. Penting dicatat di sini bahwa CVS tidak melakukan komitmen atom, tetapi itu kemungkinan karena itu berasal dari zaman kegelapan, bukan karena mereka tidak menggunakan basis data relasional.
Ada juga masalah melindungi data dari korupsi begitu ada dalam database, dan sekali lagi jawabannya sama. Jika sistem file rusak, maka tidak masalah database mana yang Anda gunakan. Jika sistem file tidak rusak, maka mesin database Anda mungkin rusak. Saya tidak melihat mengapa database kontrol versi akan lebih rentan terhadap ini daripada database relasional.
Saya berpendapat bahwa sistem kontrol versi terdistribusi (seperti git dan Mercurial) lebih baik untuk melindungi database Anda daripada kontrol versi terpusat, karena Anda dapat mengembalikan seluruh repo dari klon mana pun. Jadi, jika server pusat Anda terbakar secara spontan, bersama dengan semua cadangan Anda, Anda dapat memulihkannya dengan menjalankannya
git init
di server baru, lalugit push
dari mesin pengembang mana pun .Menemukan kembali roda itu buruk
Hanya karena Anda dapat menggunakan database relasional untuk masalah penyimpanan apa pun, bukan berarti Anda harus melakukannya . Mengapa Anda menggunakan file konfigurasi alih-alih database relasional? Mengapa menyimpan gambar pada sistem file ketika Anda bisa menyimpan data dalam database relasional? Mengapa menyimpan kode Anda di sistem file ketika Anda bisa menyimpan semuanya dalam database relasional?
"Jika yang kamu miliki adalah palu, semuanya terlihat seperti paku."
Ada juga fakta bahwa proyek-proyek sumber terbuka mampu menemukan kembali roda kapan pun nyaman, karena Anda tidak memiliki jenis kendala sumber daya yang sama dengan proyek-proyek komersial. Jika Anda memiliki sukarelawan yang ahli dalam menulis basis data, mengapa tidak menggunakannya?
Adapun mengapa kami akan mempercayai para penulis sistem kontrol revisi untuk mengetahui apa yang mereka lakukan .. Saya tidak dapat berbicara untuk VCS lain, tetapi saya cukup yakin bahwa Linus Torvalds memahami sistem file .
Mengapa beberapa sistem kontrol versi komersial menggunakan database relasional?
Kemungkinan kombinasi dari yang berikut ini:
sumber
svn
direktori berbeda di direktori kerja Anda yang bisa berada padasvn
revisi berbeda dan atomisitas lebar repositori sejati yang Anda dapatkan dengangit
atauhg
.Sebenarnya
svn
digunakan untuk menggunakan BDB untuk repositori. Ini akhirnya dihilangkan karena rentan terhadap kerusakan.VCS lain yang saat ini menggunakan DB (SQLite) adalah
fossil
. Ini juga mengintegrasikan pelacak bug.Dugaan saya pada alasan sebenarnya adalah bahwa VCSes bekerja dengan banyak file. Filesystem hanyalah jenis database lain (hierarkis, fokus pada efisiensi penyimpanan CLOB / BLOB). Basis data normal tidak menangani dengan baik karena tidak ada alasan untuk - sistem file sudah ada.
sumber
Filesystem adalah database. Bukan database relasional, tentu saja, tetapi kebanyakan toko kunci / nilai yang sangat efisien. Dan jika pola akses Anda dirancang dengan baik untuk penyimpanan nilai kunci (misalnya, format repositori git), maka menggunakan database mungkin tidak menawarkan keuntungan signifikan dibandingkan menggunakan sistem file. (Faktanya, ini hanyalah lapisan abstraksi lain yang menghalangi.)
Banyak fitur basis data hanyalah bagasi tambahan. Pencarian teks lengkap? Apakah pencarian teks lengkap masuk akal untuk kode sumber? Atau Anda perlu tokenize berbeda? Ini juga mengharuskan Anda menyimpan file lengkap di setiap revisi, yang tidak biasa. Banyak sistem kontrol versi menyimpan delta di antara revisi file yang sama untuk menghemat ruang, misalnya Subversion dan Git (setidaknya, saat menggunakan file paket.)
Persyaratan lintas platform membuat penggunaan basis data lebih menantang.
Sebagian besar alat kontrol versi dibangun untuk dijalankan pada berbagai platform. Untuk alat kontrol versi terpusat, ini hanya mempengaruhi komponen server, tetapi masih sulit untuk mengandalkan server database tunggal karena pengguna Unix tidak dapat menginstal Microsoft SQL Server dan pengguna Windows mungkin tidak mau menginstal PostgreSQL atau MySQL. Sistem file adalah penyebut yang paling tidak umum. Namun, ada beberapa alat di mana server harus diinstal pada mesin Windows, dan karenanya memerlukan SQL Server, misalnya SourceGear Vault dan Microsoft Team Foundation Server .
Sistem kontrol versi terdistribusi menjadikan ini lebih sulit lagi, karena setiap pengguna mendapat salinan repositori. Ini berarti bahwa setiap pengguna membutuhkan database untuk menempatkan repositori ke dalamnya. Ini menyiratkan bahwa perangkat lunak:
Oleh karena itu, sebagian besar sistem kontrol versi terdistribusi hanya menggunakan sistem file. Pengecualian penting adalah SourceGear's Veracity , yang dapat menyimpan dalam database SQLite (berguna untuk repositori lokal) atau database relasional seperti SQL Server (mungkin berguna untuk server.) Tawaran cloud yang di-hosting-nya dapat menggunakan backend penyimpanan non-relasional seperti Amazon SimpleDB , tapi saya tidak tahu ini benar.
sumber
Sejauh yang saya lihat dalam banyak penawaran tampaknya file "cukup baik" untuk pekerjaan itu, sesuatu yang masuk akal, dengan mempertimbangkan bahwa pada akhirnya output VCSes juga file.
Ada banyak perusahaan yang menawarkan back end RDBMS dengan antarmuka svn / git / etc, jadi apa yang Anda minta pada dasarnya sudah ada.
sumber
Saya akan mengatakan itu karena struktur data primer dari sistem kontrol versi adalah DAG, yang memetakan ke database dengan sangat buruk. Banyak data juga konten yang bisa dialamatkan, yang juga memetakan ke database sangat buruk.
Integritas data bukan satu-satunya masalah VCS, mereka juga peduli dengan integritas riwayat versi , yang tidak dimiliki oleh database. Dengan kata lain, ketika Anda mengambil versi, Anda tidak hanya perlu memastikan bahwa versi tidak memiliki kekurangan saat ini, tetapi juga bahwa tidak ada dalam seluruh sejarahnya yang telah diubah secara diam-diam.
VCS juga merupakan produk konsumen di samping produk perusahaan. Orang-orang menggunakannya dalam proyek-proyek hobi kecil satu orang. Jika Anda menambahkan kerumitan menginstal dan mengkonfigurasi server database, Anda akan mengalienasi sebagian besar bagian pasar. Saya kira Anda tidak melihat banyak instalasi Vault dan TFS di rumah. Itu alasan yang sama spreadsheet dan pengolah kata tidak menggunakan database.
Juga, ini lebih merupakan alasan untuk DVCS, tetapi tidak menggunakan basis data membuatnya sangat portabel. Saya dapat menyalin pohon sumber saya ke drive jempol dan menggunakannya kembali pada mesin apa pun, tanpa harus mengkonfigurasi proses server database.
Sejauh merusak selama melakukan, VCS menggunakan teknik yang sama persis seperti database untuk mencegah akses simultan, melakukan transaksi atom, dll. Korupsi di keduanya sangat jarang, tetapi mereka memang terjadi . Untuk semua maksud dan tujuan, penyimpanan data VCS adalah database.
sumber
Pemulihan bencana yang lebih baik (skenario kasus terburuk: kami akan menguraikannya dengan mata, seperti di masa lalu)
Membuat pelacakan dan debug bencana seperti itu, mungkin disebabkan oleh kesalahan dalam sistem VCS, lebih mudah.
Menurunkan jumlah dependensi. (jangan lupa salah satu sistem penanganan yang kernel, dan lainnya seharusnya)
Editor teks selalu tersedia. (Lisensi MS SQL Server ... tidak terlalu banyak)
sumber
sqlite
adalah satu-satunya alternatif yang mungkin untuk file teks, mengingat sejumlah besar skenario terdistribusi yang dilayani DVCS modern. (idk, mungkin Anda mungkin telah melewatkan bagian "terdistribusi" dari DVCS) Hal lain akan terlalu rumit (konfigurasi + firewall + lisensi) atau bahkan konyol untuk didistribusikan . Kemudian lagi melakukan skenario terburuk postmortem ke sqlite mungkin terbukti sulit.Fossil adalah Sistem Kontrol Versi Terdistribusi (DVCS) yang sangat baik dan menggunakan SQLite untuk penyimpanan, tidak ada file teks biasa.
Saya sangat suka itu terintegrasi: pelacakan bug, Wiki dan benar-benar didistribusikan. Maksud saya Anda benar-benar dapat bekerja offline dan memperbaiki bug.
Fosil menggunakan Sqlite sebagai format file aplikasi. Dalam keynote di PgCon Dr. Richard Hipp menjelaskan apa keuntungan menggunakan sqlite sebagai Sistem File Aplikasi, dan membuat argumen yang cukup meyakinkan tentang manfaat menggunakan database sebagai sistem file.
Sekarang Dr. Hipp telah membahas masalah tentang menyimpan kode pada basis data
sumber