2011-12-15 15 views
7

Chcę przechowywać wpis w blogu w bazie danych. Pomyślałem, że byłoby miło mieć różne wersje tych danych, podobnie jak w przypadku kontroli wersji dla plików tekstowych.Jakie są standardowe/zalecane sposoby przechowywania danych baz danych kontrolowanych przez wersję?

Wyobrażam sobie, że działa jak wiersz w tabeli, który miał kontrolę wersji. Na przykład możesz pobrać najnowszą wersję tego wiersza lub poprzednią wersję. Możesz nawet rozgałęzić się z tego rzędu.

Czy coś takiego istnieje?

Prawdopodobnie użyteczne informacje: Aktualnie używam Pythona, Django & MySQL. Eksperymentuję z MongoDB

Edytuj dla jasności/kontekstu: Poszukuję rozwiązania bardziej dostosowanego do "kontroli wersji" wierszy niż baz danych; Nie jestem tak bardzo zainteresowany rozgałęzianiem całych baz danych. Na przykład, mógłbym zapytać o treść postu na blogu w 1/1/2011 i 1/1/2010 (bez przełączania baz danych).

+0

Czy rozważałeś zastosowanie systemu kontroli wersji, takiego jak git? Byłoby interesujące zobaczyć plusy i minusy takiego rozwiązania. – milan

+0

@milan - od kiedy baza danych wersji git ** rekordy **? –

+0

Pytanie nie oznacza * żadnego * rekordu bazy danych, to wpisy na blogu, które w większości są tekstem, więc dlaczego nie? – milan

Odpowiedz

2

Po pierwsze, muszę powiedzieć, że jest to interesujące pytanie.

W mojej pracy muszę zapisać wersje różnych danych wejściowych użytkownika. Sposób, w jaki to robię, i wcale nie wiem, czy jest to właściwy sposób, czy nie, jest następujący:

Mam tabelę master i revisions. Wybrałem te 2 imiona tylko dla przykładu.

Co robi pan jest przechowuje następujące informacje:

  • id (autoincrement)
  • version_id (int)

Co revisions sklep jest następujący:

  • id
  • master_id
  • version_id
  • resztę odpowiednich danych o wprowadzone jednostki (daktyle, etc)

Co mogę osiągnąć w ten sposób jest to, że dostał się identyfikator, powiedzmy blogu. Jeśli ktoś edytuje wpis, będę przechowywać te informacje pod tabelą revisions. Za pomocą wyzwalaczy Inkrementuję tabelę version_id w revisions. Następnie aktualizuję tabelę master z najnowszym numerem version_id. W ten sposób nie muszę wykonywać MAX(), kiedy chcę zobaczyć, jaka jest najnowsza wersja.

W ten sposób uzyskałem prosty, ale mocny system wersji zawartości strony. Łatwo jest zobaczyć zmiany, a także bardzo szybko uzyskać dane, jeśli nadużywasz niektórych funkcji MySQL (w moich rzeczywistych tabelach nadużywam klastrowanego klucza podstawowego InnoDB do maks., Więc projekt bazy danych jest nieco inny niż ten Wysłałem tutaj).

3

Kontrola wersji jest skomplikowanym tematem; robienie tego dobrze jest naprawdę trudne, co jest zasadniczo powodem, dla którego nawet przy użyciu np. git może być trudny. Nie chciałbym pisać pełnego systemu kontroli wersji.

Do prostych wymagań, należy rozważyć tę strukturę, w pseudo-MongoDB/JSON:

BlogPost { 
    "_id": ObjectId("..."), 
    "slug" : "how-to-version-my-posts", 
    "author" : "cammil", 
    "published" : date, 
    "lastModified" : date, 
    "publicVersion" : 32, 
    "draftVersion" : 34, 
    "teaserText" : "lorem ipsum dolor sit amet..." 
} 

BlogPostBody { 
    "_id" : ObjectId("..."), 
    "Version" : 32, 
    "Text" : "lorem ipsum dolor sit amet..." 
} 

Więc Chodzi o to, aby przechowywać każdej wersji oddzielnie i wskaźnik do aktualnej wersji publicznej i aktualną wersję dla redaktorów , bloggerów itp.

Moja odpowiedź jest trochę skoncentrowana na MongoDB (ponieważ zbudowałem oparty na MongoDB silnik blogowy do użytku domowego), ale powinien działać podobnie dla dowolnego systemu pamięci masowej.

Zalety:

  • Nie trzeba robić MAX zapytania numeru wersji zarówno dla stanowisk publicznych lub prywatnych
  • nie koreluje last edited do numerów wersji, co może nie być pożądane
  • Pozwala wersjonowanie nawet jeśli określona wersja jest już opublikowana
  • Może pobrać zwiastun bez konieczności pobierania całego artykułu

Wady:

  • kopiuje cały tekst za każdym razem. To nie jest prawdziwa troska o dane tekstowe (spróbuj wpisać 1GB ...). Będzie to jednak problem dla większych witryn blogowych. Łagodzenie: Kompresuj tekst za pomocą deflate, delta-compression.
  • musi zaktualizować dwa obiekty na aktualizację
2

OffScale DataGrove pozwala na wersji, którą cały DB.

Śledzi wszystkie zmiany, które zachodzą w DB, i możesz oznaczać wersje i przełączać się między nimi. DataGrove jest wyjątkowy w tym, że jest wersją całego DB - schematu i danych.

W twoim przykładzie - wystarczy dodać wiersz/dane, które chcesz do DB i oznacz wersję. Zawsze będziesz mógł wrócić do tej wersji, a nawet od niej.

+1

Z Twojego opisu, DataGrove wydaje się być bardziej zorientowany na rozgałęzienia dla całych baz danych niż dla pojedynczych wierszy. (Zobacz edycję) – cammil

Powiązane problemy