Tại sao các hệ thống kiểm soát nguồn vẫn chủ yếu được hỗ trợ với các tệp?


22

Có vẻ như nhiều hệ thống kiểm soát nguồn vẫn sử dụng các tệp làm phương tiện lưu trữ dữ liệu phiên bản. Vault và TFS sử dụng Sql Server làm kho lưu trữ dữ liệu của họ, điều mà tôi nghĩ sẽ tốt hơn cho tính nhất quán dữ liệu cũng như tốc độ.

Vậy tại sao SVN, tôi tin rằng GIT, CVS, v.v. vẫn sử dụng hệ thống tệp như là một cơ sở dữ liệu, (tôi hỏi câu hỏi này vì chúng tôi đã có máy chủ SVN của chúng tôi tự hỏng trong một cam kết bình thường) thay vì sử dụng phần mềm cơ sở dữ liệu thực tế ( MSSQL, Oracle, Postgre, v.v.)?

EDIT: Tôi nghĩ một cách khác để đặt câu hỏi của tôi là "tại sao các nhà phát triển VCS cuộn hệ thống lưu trữ dữ liệu có cấu trúc của riêng họ thay vì sử dụng một hệ thống hiện có?"


29
Bạn nghĩ gì hầu hết các cơ sở dữ liệu sử dụng như là sự hỗ trợ cơ bản của họ? Hầu hết sử dụng các tệp (tuy nhiên một số sử dụng truy cập trực tiếp vào đĩa cứng). Bạn có thể có tất cả các tính năng của cơ sở dữ liệu bằng cách sử dụng "chỉ các tệp".
Joachim Sauer

2
@JoachimSauer Điểm công bằng, mặc dù tất nhiên bạn phải tự tạo cơ sở dữ liệu. Thật là ngớ ngẩn nếu bộ tính năng mong muốn của bạn gần với các giải pháp hiện có và không có lý do chính đáng để không sử dụng bất kỳ giải pháp nào.

1
@JoachimSauer Vâng, tôi nhận ra điều đó, nhưng các hệ thống DBM có cách để đảm bảo rằng không có gì không nhất quán vào cơ sở dữ liệu. Trừ khi các kho lưu trữ dựa trên tệp này đang sử dụng một cái gì đó như NTSF giao dịch, vẫn có khả năng bị tham nhũng. Và tôi tin tưởng một cơ sở dữ liệu thực tế hơn là một nhóm các nhà phát triển về cơ bản phát minh lại bánh xe, vì tôi nghĩ chúng ta có thể đồng ý rằng các hệ thống kiểm soát nguồn yêu cầu toàn vẹn dữ liệu.
Andy

2
@delnan Hỗ trợ giao dịch và thống nhất nội bộ. Chúng tôi hiện đang khôi phục kho lưu trữ SVN của mình từ băng b / c, máy chủ SVN không ghi đúng vào tất cả các tệp mà nó được cho là. Cũng tìm kiếm khối lượng dữ liệu khổng lồ. Quan điểm của tôi là, tại sao thử phát minh lại bánh xe.
Andy

7
Mỗi hệ điều hành chính đi kèm với một hệ thống tệp được tích hợp. Tất cả các hệ thống tệp này có cùng chức năng cơ bản (tệp, thư mục, tính bền vững như nhau). Về cơ bản, cơ sở dữ liệu là một phụ thuộc bổ sung mà người dùng cuối cần cài đặt và tiếp tục cập nhật. Kiểm soát nguồn không phải là kinh doanh chính của mọi người (trừ khi bạn là sourceforge hoặc github). VC thường được cài đặt trên các máy chủ thông qua dòng lệnh bởi thành viên mới nhất của nhóm. Dễ cài đặt và thiết lập là quan trọng.
GlenPeterson

Câu trả lời:


23

TL; DR: Rất ít hệ thống kiểm soát phiên bản sử dụng cơ sở dữ liệu vì không cần thiết.

Là một câu hỏi cho một câu trả lời câu hỏi, tại sao họ sẽ không? Những lợi ích nào mà hệ thống cơ sở dữ liệu "thực" mang lại cho một hệ thống tệp trong ngữ cảnh này?

Hãy xem xét rằng kiểm soát sửa đổi chủ yếu là theo dõi một siêu dữ liệu nhỏ và rất nhiều khác biệt văn bản. Văn bản không được lưu trữ trong cơ sở dữ liệu hiệu quả hơn và khả năng lập chỉ mục của nội dung sẽ không phải là một yếu tố.

Giả sử rằng Git (vì lợi ích của đối số) đã sử dụng BDB hoặc SQLite DB cho back-end của nó để lưu trữ dữ liệu. Điều gì sẽ đáng tin cậy hơn về điều đó? Bất cứ điều gì có thể làm hỏng các tệp đơn giản cũng có thể làm hỏng cơ sở dữ liệu (vì đó cũng là một tệp đơn giản với mã hóa phức tạp hơn).

Từ mô hình lập trình viên không tối ưu hóa trừ khi cần thiết, nếu hệ thống kiểm soát sửa đổi đủ nhanh và hoạt động đủ tin cậy, tại sao phải thay đổi toàn bộ thiết kế để sử dụng một hệ thống phức tạp hơn?


2
TLDR? Bạn trả lời dài gấp đôi và câu hỏi thực sự ngắn như vậy!
Brad

25
@Brad Ba từ sau đây TL;DRlà phiên bản rút gọn của các câu trả lời, không phải là một tuyên bố rằng câu hỏi quá dài và anh ấy đã không đọc nó trước khi trả lời.

6
@Andy Mercurial cũng có "grep trong lịch sử", và git có khả năng cũng có nó. Nó cũng nhanh như chớp rồi. Về việc để lại những thứ cho chuyên gia: Những người phát triển VCS là những chuyên gia.

3
Chỉ muốn thêm vào rằng tôi thấy quan điểm của bạn; nếu VCS ghi dữ liệu xấu, việc ghi dữ liệu đó vào tệp hoặc cơ sở dữ liệu sẽ không thành vấn đề. Mặc dù mặt trái là các repos dựa trên tệp có thể đang ghi vào nhiều tệp cùng một lúc và thông thường không có hỗ trợ giao dịch nào cho việc đó vì vậy nếu một tệp ghi nhưng một tệp khác bị lỗi, thì bảng VCS của bạn hiện bị hỏng, so với bảng đối thoại ghi trong cơ sở dữ liệu giao dịch sẽ cam kết thất bại như một đơn vị. Tôi cảm thấy như thể một nhóm các nhà phát triển phần mềm cơ sở dữ liệu có nhiều kinh nghiệm về vấn đề này hơn những người viết SVN ... nhưng có lẽ tôi đã sai.
Andy

6
Sự lựa chọn của bạn về git "vì lý do" là một điểm quan trọng ở đây: git có một mô hình rất tốt để viết các đối tượng của nó, nhưng nhiều công cụ thì không. Với git, nếu máy tính bị tắt ở giữa một cam kết, bạn sẽ viết một số đối tượng vào hệ thống tệp và chúng sẽ không thể truy cập được. Với các VCS khác, bạn có thể đã thêm các thay đổi vào một nửa tệp (và xảy ra nhầm lẫn.) Bạn có thể lập luận rằng các công cụ kiểm soát phiên bản khác được thiết kế kém (và bạn sẽ đúng), nhưng khi bạn viết VCS, thì đó là dễ dàng hơn nhiều khi chỉ sử dụng một giao dịch SQL và để nó thực hiện đúng.
Edward Thomson

25

Bạn dường như đang đưa ra rất nhiều giả định, có thể dựa trên kinh nghiệm của bạn với SVN và CVS.

Git và Mercurial về cơ bản giống như SVN và CVS

So sánh git và CVS giống như so sánh iPad và Atari. CVS được tạo lại khi những con khủng long lang thang trên Trái đất . Subversion về cơ bản là một phiên bản cải tiến của CVS. Giả sử rằng các hệ thống kiểm soát phiên bản hiện đại như git và Mercurial hoạt động như chúng có rất ít ý nghĩa.

Cơ sở dữ liệu quan hệ hiệu quả hơn cơ sở dữ liệu đơn mục đích

Tại sao? Cơ sở dữ liệu quan hệ thực sự phức tạp và có thể không hiệu quả như cơ sở dữ liệu đơn mục đích. Một số khác biệt ngoài đỉnh đầu của tôi:

  • Các hệ thống kiểm soát phiên bản không cần khóa phức tạp, vì dù sao bạn cũng không thể thực hiện nhiều lần xác nhận.
  • Các hệ thống kiểm soát phiên bản phân tán cần phải cực kỳ hiệu quả về không gian, vì cơ sở dữ liệu cục bộ là bản sao đầy đủ của repo.
  • Các hệ thống kiểm soát phiên bản chỉ cần tra cứu dữ liệu theo một vài cách cụ thể (theo tác giả, theo ID sửa đổi, đôi khi là tìm kiếm toàn văn). Tạo cơ sở dữ liệu của riêng bạn có thể xử lý các tìm kiếm ID tác giả / sửa đổi là chuyện nhỏ và tìm kiếm toàn văn bản không nhanh lắm trong bất kỳ cơ sở dữ liệu quan hệ nào tôi đã thử.
  • Hệ thống kiểm soát phiên bản cần phải hoạt động trên nhiều nền tảng. Điều này làm cho việc sử dụng một cơ sở dữ liệu cần được cài đặt và chạy như một dịch vụ (như MySQL hoặc PostgreQuery) khó khăn hơn.
  • Hệ thống kiểm soát phiên bản trên máy cục bộ của bạn chỉ cần chạy khi bạn đang làm gì đó (như cam kết). Rời khỏi một dịch vụ như MySQL chạy mọi lúc chỉ trong trường hợp bạn muốn thực hiện một cam kết là lãng phí.
  • Đối với hầu hết các phần, các hệ thống kiểm soát phiên bản không bao giờ muốn xóa lịch sử, chỉ cần thêm vào nó. Điều đó có thể dẫn đến các tối ưu hóa khác nhau và các phương pháp bảo vệ tính toàn vẹn khác nhau.

Cơ sở dữ liệu quan hệ an toàn hơn

Một lần nữa, tại sao? Bạn dường như cho rằng vì dữ liệu được lưu trữ trong các tệp, các hệ thống kiểm soát phiên bản như git và Mercurial không có các cam kết nguyên tử , nhưng chúng có. Cơ sở dữ liệu quan hệ cũng lưu trữ cơ sở dữ liệu của họ dưới dạng tệp. Điều đáng chú ý ở đây là CVS không thực hiện các cam kết nguyên tử, nhưng đó có thể là vì nó từ thời kỳ đen tối, không phải vì họ không sử dụng cơ sở dữ liệu quan hệ.

Ngoài ra còn có vấn đề bảo vệ dữ liệu khỏi tham nhũng một khi nó có trong cơ sở dữ liệu, và một lần nữa câu trả lời là như vậy. Nếu hệ thống tập tin bị hỏng, thì bạn không sử dụng cơ sở dữ liệu nào. Nếu hệ thống tập tin không bị hỏng, thì công cụ cơ sở dữ liệu của bạn có thể bị hỏng. Tôi không thấy lý do tại sao cơ sở dữ liệu kiểm soát phiên bản sẽ dễ bị điều này hơn cơ sở dữ liệu quan hệ.

Tôi cho rằng các hệ thống kiểm soát phiên bản phân tán (như git và Mercurial) sẽ tốt hơn cho việc bảo vệ cơ sở dữ liệu của bạn so với kiểm soát phiên bản tập trung, vì bạn có thể khôi phục toàn bộ repo từ bất kỳ bản sao nào. Vì vậy, nếu máy chủ trung tâm của bạn tự động đốt cháy, cùng với tất cả các bản sao lưu của bạn, bạn có thể khôi phục nó bằng cách chạy git inittrên máy chủ mới, sau đó git pushtừ bất kỳ máy nào của nhà phát triển .

Phát minh lại bánh xe là xấu

Chỉ vì bạn có thể sử dụng cơ sở dữ liệu quan hệ cho bất kỳ vấn đề lưu trữ nào không có nghĩa là bạn nên làm . Tại sao bạn sử dụng tệp cấu hình thay vì cơ sở dữ liệu quan hệ? Tại sao lưu trữ hình ảnh trên hệ thống tập tin khi bạn có thể lưu trữ dữ liệu trong cơ sở dữ liệu quan hệ? Tại sao giữ mã của bạn trên hệ thống tệp khi bạn có thể lưu trữ tất cả trong cơ sở dữ liệu quan hệ?

"Nếu tất cả những gì bạn có là một cái búa, mọi thứ trông giống như một cái đinh."

Ngoài ra còn có một thực tế là các dự án nguồn mở có thể đủ khả năng để phát minh lại bánh xe bất cứ khi nào thuận tiện, vì bạn không có các loại ràng buộc tài nguyên giống như các dự án thương mại. Nếu bạn có một tình nguyện viên là một chuyên gia viết cơ sở dữ liệu, thì tại sao không sử dụng chúng?

Về lý do tại sao chúng tôi sẽ tin tưởng các tác giả của các hệ thống kiểm soát sửa đổi để biết họ đang làm gì .. Tôi không thể nói cho các VCS khác, nhưng tôi khá tin tưởng rằng Linus Torvalds hiểu các hệ thống tệp .

Tại sao một số hệ thống kiểm soát phiên bản thương mại sử dụng cơ sở dữ liệu quan hệ sau đó?

Rất có thể là một số kết hợp sau đây:

  • Một số nhà phát triển không muốn viết cơ sở dữ liệu.
  • Các nhà phát triển hệ thống kiểm soát phiên bản thương mại có những hạn chế về thời gian và tài nguyên, vì vậy họ không đủ khả năng để viết cơ sở dữ liệu khi họ đã có thứ gì đó gần với những gì họ muốn. Ngoài ra, các nhà phát triển rất tốn kém và các nhà phát triển cơ sở dữ liệu (như, những người viết cơ sở dữ liệu) có thể đắt hơn, vì hầu hết mọi người không có loại kinh nghiệm đó.
  • Người dùng hệ thống kiểm soát phiên bản thương mại ít quan tâm đến chi phí thiết lập và chạy cơ sở dữ liệu quan hệ, vì họ đã có sẵn.
  • Người dùng hệ thống kiểm soát phiên bản thương mại có nhiều khả năng muốn có cơ sở dữ liệu quan hệ sao lưu dữ liệu sửa đổi của họ, vì điều này có thể tích hợp với các quy trình của họ tốt hơn (ví dụ như sao lưu).

1
Một điều: SVN cam kết nguyên tử. Trên thực tế, đó là một điểm bán hàng lớn (hoặc ít nhất là, trở lại khi họ phải thuyết phục người dùng CSV chuyển đổi).

1
@delnan - Lưu ý rằng có một sự khác biệt lớn giữa tính nguyên tử lý thuyết mà bạn có với svncác thư mục khác nhau trong thư mục làm việc của bạn có thể ở các svnphiên bản khác nhau và tính nguyên tử rộng của kho lưu trữ thực sự mà bạn có với githoặc hg.
Đánh dấu gian hàng

2
@Andy Và quan điểm của tôi là bạn có thể xử lý các tình huống chính xác như vậy mà không cần cơ sở dữ liệu quan hệ đầy đủ. Nếu hai người cam kết cùng một lúc, máy chủ có thể thực hiện lần lượt từng người một. Đó không phải là một tính năng phức tạp để thực hiện. Nếu bạn muốn làm điều đó với một người dùng cục bộ, chỉ cần có một tệp khóa. Khi bạn bắt đầu một cam kết, hãy lấy một khóa trên tệp. Khi bạn kết thúc một cam kết, phát hành khóa. Nếu bạn muốn cho phép cam kết nhiều nhánh cùng một lúc, hãy sử dụng tệp khóa cho mỗi nhánh. Chắc chắn, SQLite sẽ làm điều này cho tôi, nhưng nó không cần thiết .
Phục hồi lại

1
Tương tự, thực hiện một tạp chí cơ bản cũng không phức tạp. (1) Viết cam kết mới vào một tập tin. (2) Sao chép tệp chỉ mục cũ. (3) Viết một tệp chỉ mục mới. (4) Xóa bản sao của tệp chỉ mục cũ. Nếu bạn thất bại ở bước 1, 2 hoặc 4, bạn chỉ cần dọn sạch các tệp mới mà bạn đã tạo. Nếu bạn thất bại ở bước 3, bạn chỉ cần sao chép tệp chỉ mục cũ trở lại. Ai đó hiểu hệ thống tập tin tốt hơn có thể tạo ra phiên bản này hiệu quả hơn nhiều, nhưng bạn luôn có thể tham khảo mã nguồn của SQLite nếu bạn cần (đó là miền công cộng).
Phục hồi lại

1
@BrendanLong Điểm tuyệt vời. Đánh giá cao các cuộc thảo luận. Nói rõ hơn, tôi nghĩ có cả ưu điểm và nhược điểm đối với cả hai loại cửa hàng ủng hộ, tôi không tin chỉ có một câu trả lời đúng. Tuy nhiên, tôi đã ngạc nhiên khi dường như chỉ có ba (bốn nếu bạn tính riêng Vault và Vercity) sử dụng SQL và đại đa số là không, đó là tất cả.
Andy

18

Thực tế svnđược sử dụng để sử dụng BDB cho các kho lưu trữ. Điều này cuối cùng đã được loại bỏ bởi vì nó dễ bị phá vỡ.

Một VCS khác hiện đang sử dụng DB (SQLite) là fossil. Nó cũng tích hợp một trình theo dõi lỗi.

Tôi đoán lý do thực sự là các VCSes hoạt động với rất nhiều tệp. Hệ thống tập tin chỉ là một loại cơ sở dữ liệu khác (phân cấp, tập trung vào hiệu quả lưu trữ CLOB / BLOB). Cơ sở dữ liệu thông thường không xử lý tốt điều đó vì không có lý do nào - các hệ thống tập tin đã tồn tại.


1
BDB chính xác sẽ không được tính là đáng tin cậy - như SQLite là cơ sở dữ liệu đang xử lý. Điều đó nói rằng, tôi nghĩ rằng độ tin cậy của Oracle / MSSQL / MySQL / Postgres, tùy thuộc vào cách bạn định cấu hình chúng, không khác nhiều so với các hệ thống tệp. Vấn đề chính là RDBMS không được xây dựng cho các cấu trúc phân cấp & đồ thị mà các VCS thường làm việc với. Và trong trường hợp đó, hệ thống tập tin chỉ cần giành chiến thắng.
Mike Larsen

3
@Andy: Fossil được tạo bởi SQLite. Nó không thực sự đáng ngạc nhiên :-)
Jörg W Mittag

1
@Andy: tôi muốn tin tưởng SQLite nhiều hơn Oracle hoặc MSSQL. Không có gì ngạc nhiên khi đó là cơ sở dữ liệu SQL được sử dụng nhiều nhất hiện có, với một tỷ lệ rất lớn. Ngoài ra, nó là một trong những kiến ​​trúc được chuyển đến hầu hết các kiến ​​trúc khác nhau, mỗi kiến ​​trúc đều có những thách thức riêng, làm cho mã được chia sẻ chống đạn vô cùng.
Javier

1
@Javier Tôi sẽ không tin tưởng Sqlite nhiều như MSSQL hoặc Oracle; như Mike nói, phần trong quá trình làm tôi sợ, như thể ứng dụng của bạn chết có thể khiến DB của bạn bị hỏng ngay bây giờ. Với cơ sở dữ liệu máy khách / máy chủ, máy khách sẽ hủy bỏ giao dịch. Không nói rằng CS DB không thể bị hỏng nhưng tôi nghĩ nó ít có khả năng kết hợp với công cụ DB hơn với ứng dụng.
Andy

5
@Andy, đó là những gì giao dịch dành cho. Bất kể tại thời điểm nào bạn giết một công cụ DB tốt, một giao dịch nhất định có được cam kết hay không. Việc triển khai các cam kết nguyên tử của SQLite ( sqlite.org/atomiccommit.html ) là một cách đặc biệt tinh vi.
Javier

10
  1. Một hệ thống tập tin một cơ sở dữ liệu. Tất nhiên không phải là cơ sở dữ liệu quan hệ, nhưng hầu hết là các kho lưu trữ khóa / giá trị rất hiệu quả. Và nếu các mẫu truy cập của bạn được thiết kế tốt cho kho lưu trữ khóa-giá trị (ví dụ: định dạng kho git), thì việc sử dụng cơ sở dữ liệu có thể không mang lại lợi thế đáng kể so với sử dụng hệ thống tệp. (Trên thực tế, đó chỉ là một lớp trừu tượng khác để cản trở.)

  2. Rất nhiều tính năng cơ sở dữ liệu chỉ là hành lý bổ sung. Tìm kiếm toàn văn? Liệu tìm kiếm toàn văn có ý nghĩa cho mã nguồn? Hay bạn cần token hóa nó khác nhau? Điều này cũng yêu cầu bạn lưu trữ các tệp đầy đủ ở mỗi lần sửa đổi, điều này không phổ biến. Nhiều hệ thống kiểm soát phiên bản lưu trữ đồng bằng giữa các lần sửa đổi của cùng một tệp để tiết kiệm dung lượng, ví dụ SubversionGit (ít nhất là khi sử dụng tệp gói.)

  3. Các yêu cầu đa nền tảng làm cho việc sử dụng một cơ sở dữ liệu trở nên khó khăn hơn.

    Hầu hết các công cụ kiểm soát phiên bản được xây dựng để chạy trên nhiều nền tảng. Đối với các công cụ kiểm soát phiên bản tập trung, điều này chỉ ảnh hưởng đến thành phần máy chủ, nhưng vẫn khó dựa vào một máy chủ cơ sở dữ liệu vì người dùng Unix không thể cài đặt Microsoft SQL Server và người dùng Windows có thể không muốn cài đặt PostgreQuery hoặc MySQL. Hệ thống tập tin là mẫu số ít phổ biến nhất. Tuy nhiên, có một số công cụ mà máy chủ phải được cài đặt trên máy Windows và do đó yêu cầu SQL Server, ví dụ SourceGear Vault và Microsoft Team Foundation Server .

    Các hệ thống kiểm soát phiên bản phân tán làm cho điều này trở nên khó khăn hơn vì mọi người dùng đều có một bản sao của kho lưu trữ. Điều này có nghĩa là mọi người dùng đều cần một cơ sở dữ liệu để đưa kho lưu trữ vào. Điều này ngụ ý rằng phần mềm:

    1. Được giới hạn trong một tập hợp con của các nền tảng có cơ sở dữ liệu cụ thể
    2. Nhắm mục tiêu một phụ trợ cơ sở dữ liệu duy nhất là đa nền tảng (ví dụ: SQLite).
    3. Nhắm mục tiêu một phụ trợ lưu trữ có thể cắm, để người ta có thể sử dụng bất kỳ cơ sở dữ liệu nào họ muốn (có thể bao gồm cả hệ thống tệp).

    Hầu hết các hệ thống kiểm soát phiên bản phân tán, do đó, chỉ cần sử dụng hệ thống tập tin. Một ngoại lệ đáng chú ý là Veracity của SourceGear , có thể lưu trữ trong cơ sở dữ liệu SQLite (hữu ích cho kho lưu trữ cục bộ) hoặc cơ sở dữ liệu quan hệ như SQL Server (có thể hữu ích cho máy chủ.) Việc cung cấp lưu trữ đám mây của họ có thể sử dụng phụ trợ lưu trữ không liên quan như Amazon SimpleDB , nhưng tôi không biết điều này là đúng.


Có lẽ giống như bình luận ủng hộ của một ác quỷ, hầu hết những người hỏi những câu hỏi "tại sao không sử dụng cơ sở dữ liệu" này dường như có nghĩa là "tại sao không sử dụng RDBMS?" với tất cả sự tuân thủ ACID và các vấn đề khác liên quan. Thực tế là tất cả các hệ thống tập tin đã là cơ sở dữ liệu của ilk của riêng chúng đã bị loại bỏ.
mikebabcock

6

Theo như tôi đã thấy trong nhiều dịch vụ, có vẻ như các tệp "đủ tốt" cho công việc, một điều hợp lý, có tính đến việc vào cuối ngày đầu ra của VCSes cũng là các tệp.

Có nhiều công ty cung cấp mặt sau RDBMS với giao diện svn / git / etc, vì vậy những gì bạn đang yêu cầu về cơ bản đã tồn tại.


5

Tôi muốn nói rằng đó là vì cấu trúc dữ liệu chính của hệ thống kiểm soát phiên bản là DAG, ánh xạ tới cơ sở dữ liệu rất kém. Rất nhiều dữ liệu cũng có thể truy cập nội dung, nó cũng ánh xạ tới cơ sở dữ liệu rất kém.

Tính toàn vẹn dữ liệu không phải là mối quan tâm duy nhất của VCS, họ cũng quan tâm đến tính toàn vẹn lịch sử phiên bản , cơ sở dữ liệu không tốt lắm. Nói cách khác, khi bạn truy xuất một phiên bản, bạn không chỉ cần đảm bảo rằng phiên bản đó không có sai sót hiện tại, mà còn không có gì trong toàn bộ lịch sử của nó đã bị thay đổi một cách lén lút.

VCS cũng là một sản phẩm tiêu dùng ngoài một sản phẩm doanh nghiệp. Mọi người sử dụng chúng trong các dự án sở thích nhỏ, một người đàn ông. Nếu bạn thêm rắc rối khi cài đặt và định cấu hình máy chủ cơ sở dữ liệu, bạn sẽ xa lánh phần lớn thị trường đó. Tôi đoán bạn không thấy nhiều cài đặt Vault và TFS ở nhà. Đó là cùng một lý do bảng tính và trình xử lý văn bản không sử dụng cơ sở dữ liệu.

Ngoài ra, đây là một lý do cho DVCS, nhưng việc không sử dụng cơ sở dữ liệu làm cho nó cực kỳ di động. Tôi có thể sao chép cây nguồn của mình vào ổ USB và sử dụng lại trên bất kỳ máy nào mà không phải cấu hình quy trình máy chủ cơ sở dữ liệu.

Theo như tham nhũng trong quá trình cam kết, VCS sử dụng các kỹ thuật chính xác giống như cơ sở dữ liệu để ngăn chặn truy cập đồng thời, thực hiện giao dịch nguyên tử, v.v ... Tham nhũng ở cả hai đều rất hiếm, nhưng chúng vẫn xảy ra . Đối với tất cả ý định và mục đích, kho dữ liệu VCS một cơ sở dữ liệu.


1
"Bản đồ đến cơ sở dữ liệu rất kém" Tuy nhiên, Vault và TFS làm việc này. "Tính toàn vẹn dữ liệu không phải là mối quan tâm duy nhất của VCS, họ cũng quan tâm đến tính toàn vẹn lịch sử phiên bản, cơ sở dữ liệu không tốt lắm." Tôi không thấy cách lưu trữ lịch sử phiên bản cho vay vào các tệp qua cơ sở dữ liệu, đặc biệt là vì tôi đã đặt tên cho các sản phẩm làm việc đó. ". Tham nhũng ở cả hai rất hiếm, nhưng chúng có xảy ra." Không có kết quả nào trong trang đầu tiên nói về cơ sở dữ liệu máy chủ Vault bị hỏng. Một liên kết thậm chí nói về phần mềm Vault, vấn đề là WC bị hỏng.
Andy

"Đối với tất cả ý định và mục đích, kho dữ liệu VCS là cơ sở dữ liệu." Chà ... đó là quan điểm của tôi. Tại sao không chỉ dán dữ liệu trong một hệ thống cơ sở dữ liệu thực sự thay vì tự lăn?
Andy

2
@Andy Vâng, đó là một cơ sở dữ liệu, nhưng không phải tất cả các cơ sở dữ liệu đều có thể thay thế cho nhau. Mỗi cơ sở dữ liệu có một chế độ xem nhất định về thế giới (ví dụ: SQL DB về cơ bản triển khai mô hình quan hệ). Như câu trả lời này chi tiết, dữ liệu mà VCS lưu trữ và cách sử dụng dữ liệu không phù hợp với mô hình quan hệ. Tôi không chắc chắn nếu một số NoQuery db làm tốt hơn, nhưng chúng còn khá mới và chưa chứng minh được tính ưu việt của chúng (tôi nhớ lại các báo cáo về các vấn đề toàn vẹn nghiêm trọng đối với một số người). Và sau đó là tất cả các vấn đề khác trên đó.

DAG chỉ được sử dụng trong DVCS (trừ khi bạn coi lịch sử tuyến tính là một DAG cực kỳ đơn giản, nhưng thực sự không phải là một sự trừu tượng hóa hữu ích.) Khi lịch sử của bạn là tuyến tính, với các thay đổi tăng đơn điệu, cơ sở dữ liệu SQL có ý nghĩa hơn nhiều .
Edward Thomson

Số phiên bản tăng đơn điệu không có ý nghĩa nhiều đối với các VCS. Tôi đã sử dụng một số lượng khá lớn trong số họ và những người có số phiên bản tập trung (CVS & SVN là 2 tôi quen thuộc nhất) có xu hướng khó hợp nhất. Và ngay cả những người sử dụng DAG khi họ cố gắng hợp nhất. Chỉ vì đại diện lưu trữ của họ không dựa trên điều đó không có nghĩa là nó không được sử dụng.
Mike Larsen

2
  • Phục hồi thảm họa tốt hơn (trường hợp xấu nhất: chúng ta sẽ phân tích bằng mắt, như thời xưa)

  • Việc theo dõi và gỡ lỗi những thảm họa như vậy, có thể do lỗi trong hệ thống VCS, dễ dàng hơn.

  • Giảm số lượng phụ thuộc. (chúng ta không quên một trong những hệ thống là xử lý các hạt nhân, và người kia đã được yêu cầu)

  • Một trình soạn thảo văn bản luôn có sẵn. (Giấy phép MS SQL Server ... không quá nhiều)


Câu trả lời này chỉ là xấu. Điểm thực sự duy nhất là giảm số lượng phụ thuộc. Cả hai hệ thống sao lưu nên ngang bằng vì bạn nên thực hiện sao lưu đúng cách, gỡ lỗi các ứng dụng DB không khó hơn so với gỡ lỗi các ứng dụng ghi tệp và trình soạn thảo văn bản luôn khả dụng? Tôi thậm chí không biết quan điểm của bạn là gì, vì VCS sẽ không sử dụng trình soạn thảo văn bản và có các máy chủ DB khác ngoài đó (Sqlite, Postgre, MySql, v.v.) để nếu bạn MUỐN giải pháp hỗ trợ db thiếu máy chủ db không nên là một yếu tố.
Andy

1
@Andy ... các lập trình viên sẽ sử dụng để sử dụng trình soạn thảo văn bản. Bạn biết đấy, chỉnh sửa văn bản vẫn có sẵn như là một chức năng phụ ngay cả trong IDE yêu thích của bạn.
ZJR

1
@Andy sqlitelà sự thay thế khả dĩ duy nhất cho các tệp văn bản, với số lượng lớn các kịch bản phân tán DVCS hiện đại phục vụ. (idk, có thể bạn đã bỏ lỡ phần "phân phối" của DVCS) Bất cứ điều gì khác sẽ quá cồng kềnh (cấu hình + tường lửa + giấy phép) hoặc thậm chí ngớ ngẩn để được phân phối . Sau đó, một lần nữa làm một tình huống xấu nhất xảy ra với một sqlite có thể chứng minh khó khăn.
ZJR

1
@ZJR: Tôi không nghĩ câu hỏi ban đầu bao giờ chỉ định kiểm soát phiên bản phân tán, nó hỏi về các hệ thống kiểm soát phiên bản nói chung. Hơn nữa, đối số trình soạn thảo văn bản của bạn hơi phẳng, vì nhiều hệ thống không lưu trữ các tệp văn bản phẳng. Ngay cả git cũng có nhiều định dạng tệp nhị phân (đối tượng lỏng lẻo, tệp gói, v.v.) khiến trình soạn thảo văn bản của bạn trở nên vô dụng.
Edward Thomson

@ZJR Làm thế nào để chỉnh sửa mã trong trình soạn thảo văn bản có liên quan đến kho lưu trữ sao lưu của VCS? Bạn đang đề xuất chỉnh sửa thủ công, nói cơ sở dữ liệu của SVN? Ngoài ra, câu hỏi của tôi không giới hạn ở DVCS, vì vậy tôi không biết tại sao bạn lại hiểu về nó.
Andy

2

Fossil là một Hệ thống kiểm soát phiên bản phân tán (DVCS) tuyệt vời và sử dụng SQLite để lưu trữ, không có tệp văn bản thuần túy.

Tôi thực sự thích nó đã được tích hợp: theo dõi lỗi, Wiki và nó thực sự được phân phối. Tôi có nghĩa là bạn thực sự có thể làm việc ngoại tuyến và sửa lỗi.

Fossil sử dụng Sqlite như định dạng tệp ứng dụng. Trong bài phát biểu tại PGCon, Tiến sĩ Richard Hipp giải thích những lợi thế của việc sử dụng sqlite làm Hệ thống tệp ứng dụng và đưa ra một lập luận khá thuyết phục về lợi ích của việc sử dụng cơ sở dữ liệu làm hệ thống tệp.

Chủ đề chính thứ hai là SQLite nên được xem như là một định dạng tệp ứng dụng Thay thế cho việc phát minh các định dạng tệp của riêng mình hoặc sử dụng các XML được ZIP. Câu lệnh SQL SQLite không phải là sự thay thế cho PostgreSQL. SQLite là sự thay thế cho móng tay fopen () mà (slide 21). Cuối cùng, Richard rất chú trọng đến thực tế rằng SQLite chăm sóc dữ liệu của bạn (sự cố an toàn, ACID) sử dụng- the-index.com

Bây giờ Tiến sĩ Hipp đã giải quyết các mối quan tâm về việc lưu mã trên cơ sở dữ liệu

  • Tại sao Fossil dựa trên SQLite thay vì cơ sở dữ liệu NoQuery phân tán?

Hóa thạch không dựa trên SQLite. Việc triển khai Fossil hiện tại sử dụng SQLite làm kho lưu trữ cục bộ cho nội dung của cơ sở dữ liệu phân tán và làm bộ đệm cho thông tin meta về cơ sở dữ liệu phân tán được tính toán trước để trình bày nhanh chóng và dễ dàng. Nhưng việc sử dụng SQLite trong vai trò này là một chi tiết triển khai và không phải là cơ bản cho thiết kế. Một số phiên bản tương lai của Fossil có thể loại bỏ SQLite và thay thế một tệp tệp hoặc cơ sở dữ liệu khóa / giá trị thay cho SQLite. (Trên thực tế, điều đó rất khó xảy ra vì SQLite hoạt động rất tốt trong vai trò hiện tại của nó, nhưng vấn đề là bỏ qua SQLite khỏi Fossil là một khả năng lý thuyết.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.