moje 2 pensy warte. Trochę tęskniłem, ale ...... miałem podobne wymaganie w jednym z moich projektów inkubacyjnych. Podobnie jak twoje, moje kluczowe wymagania to baza danych dokumentów (w moim przypadku xml) z wersjonowaniem dokumentów. Było to dla systemu wielu użytkowników z wieloma przypadkami użycia współpracy. Wolałem korzystać z dostępnych rozwiązań open source, które obsługują większość kluczowych wymagań.
Aby przejść do sedna sprawy, nie mogłem znaleźć żadnego produktu, który zapewniałby oba, w sposób wystarczająco skalowalny (liczba użytkowników, wolumeny użytkowania, zasoby pamięci masowej i obliczeniowej). Byłem nastawiony na git dla wszystkich obiecujących możliwości, (prawdopodobne) rozwiązania, które można by z tego wymyślić. W miarę jak bawiłem się bardziej opcją git, przejście z perspektywy pojedynczego użytkownika do perspektywy wielu (miliardów) użytkowników stało się oczywistym wyzwaniem. Niestety, nie udało mi się przeprowadzić szczegółowej analizy wydajności, tak jak ty. (.. leniwy / zakończ wcześnie .... dla wersji 2, mantra) Moc dla ciebie !. W każdym razie, od tego czasu mój tendencyjny pomysł przekształcił się w następną (wciąż stronniczą) alternatywę: połączenie narzędzi, które są najlepsze w swoich oddzielnych sferach, bazach danych i kontroli wersji.
Podczas gdy wciąż trwają prace (... i trochę zaniedbane), wersja przekształcona jest po prostu taka.
- na frontendu: (dla użytkownika) użyj bazy danych do przechowywania 1-go poziomu (połączenie z aplikacjami użytkownika)
- na zapleczu użyj systemu kontroli wersji (VCS) (takiego jak git), aby przeprowadzić wersjonowanie obiektów danych w bazie danych
Zasadniczo sprowadzałoby się to do dodania wtyczki kontroli wersji do bazy danych, z pewnym klejem integracyjnym, który być może będziesz musiał opracować, ale może być znacznie łatwiejszy.
Jak to (powinno) działać, polega na tym, że główna wymiana danych w interfejsie wielu użytkowników odbywa się za pośrednictwem bazy danych. DBMS poradzi sobie ze wszystkimi zabawnymi i złożonymi problemami, takimi jak wielu użytkowników, współbieżność, operacje atomowe itp. Na zapleczu VCS wykonywałby kontrolę wersji na jednym zestawie obiektów danych (bez współbieżności lub problemów z wieloma użytkownikami). Dla każdej efektywnej transakcji w bazie danych kontrola wersji jest wykonywana tylko na rekordach danych, które zostałyby faktycznie zmienione.
Jeśli chodzi o klej do łączenia, będzie on miał postać prostej funkcji współdziałania między bazą danych a VCS. Jeśli chodzi o projekt, prostym podejściem byłby interfejs sterowany zdarzeniami, z aktualizacjami danych z bazy danych wyzwalającymi procedury kontroli wersji (wskazówka: zakładając Mysql, użycie wyzwalaczy i sys_exec () bla bla ...). Pod względem złożoności implementacji będzie to zakres od prostego i efektywnego (np. skrypty) do złożonego i wspaniałego (jakiś programowany interfejs złącza). Wszystko zależy od tego, jak szalony chcesz z tym iść i ile potu z kapitału jesteś w stanie wydać. Myślę, że proste skrypty powinny wystarczyć. Aby uzyskać dostęp do wyników końcowych, różnych wersji danych, prostą alternatywą jest wypełnienie klonu bazy danych (bardziej klonu struktury bazy danych) danymi, do których odwołuje się znacznik wersji / identyfikator / hash w VCS. znowu ten bit będzie prostym zadaniem zapytania / tłumaczenia / mapowania interfejsu.
Nadal istnieje kilka wyzwań i niewiadomych, z którymi trzeba się zmierzyć, ale przypuszczam, że wpływ i znaczenie większości z nich będą w dużej mierze zależeć od wymagań aplikacji i przypadków użycia. Niektóre mogą po prostu nie być problemem. Niektóre z problemów obejmują dopasowanie wydajności między 2 kluczowymi modułami, bazą danych i VCS, dla aplikacji z aktywnością aktualizacji danych o wysokiej częstotliwości, skalowanie zasobów (pamięci i mocy obliczeniowej) w czasie po stronie git jako dane i użytkownicy wzrost: stały, wykładniczy lub ostatecznie plateau
Z powyższego koktajlu, oto, co obecnie warzę
- używanie Git dla VCS (początkowo uważany za stary dobry CVS ze względu na użycie tylko zestawów zmian lub delt między 2 wersjami)
- przy użyciu mysql (ze względu na wysoce ustrukturyzowany charakter moich danych, xml ze ścisłymi schematami xml)
- bawić się z MongoDB (aby wypróbować bazę danych NoSQl, która jest ściśle dopasowana do natywnej struktury bazy danych używanej w git)
Kilka zabawnych faktów - git faktycznie robi jasne rzeczy w celu optymalizacji pamięci, takie jak kompresja i przechowywanie tylko różnic między wersjami obiektów - TAK, git przechowuje tylko zestawy zmian lub delty między wersjami obiektów danych, gdzie ma to zastosowanie (wie kiedy i jak) . Odniesienie: pliki packfiles, głęboko w wnętrznościach Gita
- Przegląd obiektowej pamięci masowej gita (system plików z adresowaniem treści) pokazuje uderzające podobieństwa (z punktu widzenia koncepcji) z bazami danych noSQL, takimi jak mongoDB. Ponownie, kosztem dużego wysiłku, może zapewnić bardziej interesujące możliwości integracji 2 i poprawienia wydajności
Jeśli dotarłeś tak daleko, pozwól mi, czy powyższe może mieć zastosowanie w twoim przypadku i zakładając, że tak będzie, jak to wyrównałoby się z niektórymi aspektami w twojej ostatniej kompleksowej analizie wydajności