Podzielę się z wami moim projektem, który różni się od obu projektów tym, że wymaga jednej tabeli na każdy typ jednostki. Najlepszym sposobem opisania projektu bazy danych jest użycie ERD, oto moje:
W tym przykładzie mamy jednostkę o nazwie pracownik . user table przechowuje rekordy użytkowników, a entity i entity_revision to dwie tabele, które przechowują historię wersji dla wszystkich typów encji, które będziesz mieć w systemie. Oto jak działa ten projekt:
Dwa pola entity_id i revision_id
Każda jednostka w twoim systemie będzie miała swój własny unikalny identyfikator. Twój obiekt może przejść przez zmiany, ale jego entity_id pozostanie taki sam. Musisz zachować ten identyfikator jednostki w tabeli pracowników (jako klucz obcy). W tabeli encji należy również zapisać typ swojego podmiotu (np. „Pracownik”). Teraz, jeśli chodzi o revision_id, jak wskazuje jego nazwa, śledzi on wersje encji. Najlepszym sposobem, jaki znalazłem, jest użycie atrybutu Employer_id jako revision_id. Oznacza to, że będziesz mieć zduplikowane identyfikatory wersji dla różnych typów podmiotów, ale nie jest to dla mnie gratką (nie jestem pewien co do Twojego przypadku). Jedyną ważną uwagą jest to, że kombinacja entity_id i revision_id powinna być unikalna.
W tabeli entity_revision znajduje się również pole stanu, które wskazuje stan wersji. To może mieć jeden z trzech stanów: , lublatest
obsolete
deleted
(nie opierając się na bieżąco korekt pomaga wiele, aby zwiększyć zapytań).
Ostatnia uwaga na temat revision_id: nie utworzyłem klucza obcego łączącego Employer_id z revision_id, ponieważ nie chcemy zmieniać tabeli entity_revision dla każdego typu jednostki, którą moglibyśmy dodać w przyszłości.
WPROWADZENIE
Dla każdego pracownika , którego chcesz wstawić do bazy danych, dodasz również rekord do encji i rewizji encji . Te dwa ostatnie rekordy ułatwiają śledzenie przez kogo i kiedy rekord został wstawiony do bazy danych.
AKTUALIZACJA
Każda aktualizacja istniejącego rekordu pracownika zostanie zaimplementowana jako dwie wstawki, jedna w tabeli pracowników i jedna w rewizji encji. Drugi pomoże ci dowiedzieć się, przez kogo i kiedy rekord został zaktualizowany.
USUNIĘCIE
W celu usunięcia pracownika do rewizji entity_revision wstawiany jest rekord określający usunięcie i wykonane.
Jak widać w tym projekcie, żadne dane nigdy nie są zmieniane ani usuwane z bazy danych, a co ważniejsze, każdy typ jednostki wymaga tylko jednej tabeli. Osobiście uważam ten projekt za naprawdę elastyczny i łatwy w użyciu. Ale nie jestem pewien co do Ciebie, ponieważ Twoje potrzeby mogą być inne.
[AKTUALIZACJA]
Mając obsługiwane partycje w nowych wersjach MySQL, uważam, że mój projekt ma również jedną z najlepszych wydajności. Można podzielić entity
tabelę za pomocą type
pola, podczas gdy partycjonować entity_revision
za pomocą jego state
pola. SELECT
Znacznie zwiększy to liczbę zapytań, zachowując prostotę i przejrzystość projektu.