2013-07-29 21 views
6

Muszę przechowywać dane, takie jak artykuły, w bazie danych mysql, a jeśli artykuł jest modyfikowany, muszę również zachować starą wersję, aby umożliwić jej przywrócenie. Znalazłem kilka podobnych pytań i postów na ten temat, ale nie jestem pewien, które rozwiązanie jest najlepsze, aby rozwiązać problem.Najlepsza praktyka dla systemu przetwarzania danych mysql

Oto podstawowej tabeli "artykuły" dla lepszego zrozumienia:

artykułów (id, nazwa, tekst)

Dla mnie istnieją dwa różne podejścia do tego:

Approach 1

Zapisz dane i każdą wersję artykułu w tabeli "artykuły" i dodaj kolumny "wersja" i "status". W wersji i przechowuję zwiększany numer wersji artykułu. Aktywna artykuł dostaje "status" 1 i innym "status" 2.

Pro:

  • tylko jeden stół jest potrzebny

  • Nowa wersja jest wkładka nowe dane i tylko uaktualnienie „stan” -column starego jednego

Con

  • Bardzo duże stoły (może wolniej zapytań ???)

Approach 2

dodać pole "Wersja" do "art" i przechowywać tylko aktywne dane do tabeli " artykuły ". Stare wersje danych są przechowywane/przenoszone do nowej tabeli "articles_versioned".

Pro:

  • Tylko rzeczywista ważne dane w tabeli "artykułów"

Con

  • Dublication tabel

So. Czy zapomniałem dobry aproach? Jak radzić sobie z powiązanymi danymi w innych tabelach (np. Obrazy itp.)?

+1

Nazywa się to zwykle "zmianą przechwytywania danych" (CDC). Google dla niego: http://www.google.com/search?aq = f & gcx = w & sourceid = chrome & ie = UTF-8 & q = mysql + change + data + capture & safe = active – duffymo

+0

Nie musisz nawet aktualizować poprzedniego statusu, wybierz najwyższy identyfikator dla tego konkretnego artykułu. – Anigel

+0

Status jest, jeśli chcę aby powrócić do poprzedniej wersji – bernhardh

Odpowiedz

3

Mój wybór byłby wariantem podejścia 2. Pogrubienie oznacza pola w kluczu podstawowym.

  • wstawić każdy artykuł w tabeli articles_versioned (id, datownika, Nazwa, tekst)
  • Twoja druga tabela jest articles (id, datownik, [imię i nazwisko, tekst]). Zwróć uwagę, że znacznik czasu nie jest pierwotny; imię i tekst może być powielana lub można użyć złączenia z articles_versioned (który będzie szybko od id i datownik są kluczem articles_versioned pierwotne)
  • articles_versioned posiada spust na wkładkę, która zaczyna się właśnie wstawionego wiersza i replikuje ją na articles
  • Aby przywrócić określoną wersję artykułu, należy zmodyfikować tabelę articles.

Zaletami tej metody są:

  1. dostać za darmo kolejne informacje (datę i godzinę artykułu) w tabeli, że być może trzeba w każdym razie
  2. Nie trzeba zapytać bazę danych, aby uzyskać aktualną datę. Jeśli używasz wersji, musisz.
  3. Twój kod nie musi wstawiać artykułu do dwóch tabel. Po prostu wstawiasz w articles_versioned i czytasz z articles, db zajmuje się migracją danych podczas wstawiania przez wyzwalacz, unikając problemów z konsystencją.

Con

  1. W środowisku silnie jednoczesnego dwie wersje mogą być umieszczone w tym samym czasie, więc jeden z nich może zakończyć się niepowodzeniem. Nie powinno to stanowić problemu przy wstawianiu napisanych przez użytkownika artykułów (jest to mało prawdopodobne, biorąc pod uwagę precyzję znaczników czasu w dzisiejszych czasach). Jeśli nie określisz znacznika czasu w instrukcji INSERT, ale zamiast tego ustawisz pole datetime na bieżący czas jako wartość domyślną, możesz całkowicie uniknąć tego problemu.

Aby odpowiedzieć na resztę Twojego pytania. Podejście 1 nie będzie prowadzić do dłuższych zapytań, o ile dodasz indeks statusu. Ma to sens tylko wtedy, gdy masz zazwyczaj wiele różnych wersji każdego artykułu; tak długo, jak średnio masz 2 wersje na artykuł lub mniej, indeks tylko spowolni, a podejście 2 nie byłoby sensownie szybsze i tak (mimo, że nadal zalecałbym moje podejście, ponieważ po prostu wymaga kodu, ponieważ przywrócenie wersji robi nie wymagają statusu przełączania dla dwóch wierszy).

Powiązane zasoby, takie jak obrazy, powinny mieć podobną wersję. Zakładam, że zapisujesz je w systemie plików; zamiast zapisywać je z ich prawdziwymi nazwami, użyj tabeli (id, nazwa obrazu), aby nadać każdemu obrazowi identyfikator, a następnie zapisz obraz jako -id-.jpg. Pole image_name pozwoli ci dowiedzieć się, jaka była oryginalna nazwa pliku (jeśli ci na tym zależy). W ten sposób możesz wyświetlać obrazy w taki sam sposób, jak wersje artykułów, a w artykułach można użyć czegoś takiego jak <img src="-id-.jpg">, o którym wiesz, że pozostanie dostępne na zawsze.

+0

Niestety ta odpowiedź pojawia się nieco późno, ale może być przydatna dla innych. – p91paul

+0

Wybierasz się na ten archeologiczny gong? – Strawberry

+1

Dalej, wpadłem na to pytanie, szukając czegoś innego, i zacząłem odpowiadać przed zauważeniem daty pytania :). Myślę, że nadal może być istotne. – p91paul

Powiązane problemy