Design do zapisy historii

0

Hej.

Mam następujący problem do rozwiązania w Javie.

Funkcjonalnie to działa tak:

  • Użytkownik (wydawca) ma pewien produkt (książkę).
  • Książka na autorów (1 lub więcej), licencje (1 lub więcej).
USER
id
user_name
PRODUCT
id
user_id
name
set<licences>
set<authors>
AUTHOR
id
author_name
LICENCE
id
details

Problem do rozwiązania wygląda nasępująco:
Gdy użytkownik (USER) robi edycję produktu, zapisywana jest historia tej zmiany (co i kiedy zostało zmienione). Przy każdej edycji tworzony jest nowy rekord historii.
W przypadku gdy użytkownik zdecyduje się usunąć konto, wtedy przywracana jest oryginalna 'wersja' produktu, czyli przed wszystkimi zmianami zrobionymi przed użytkownika.
**
Wymyśliłem to tak:**

  • powstaną nowe tabelki
HISTORY (tu tworzone będą wpisy historii)
id
date
user_id
text (co zostało zmienione)
ORIG_PRODUCT
ORIG_LICENCE
ORIG_AUTHOR

Tabelki ORIG* będą kompiami tabeli PRODUCT, LICENCE, AUTHOR.

Gdy użytkwnik zrobi edycję produktu, porównam czy zmieniły się poszczególne dane w tabelach (np, PRODUCT.name, AUTHOR.author_name, LICENCE.details).
Jeżeli tak:

  • w tabelce HISTORY stworzy się rekord że coś zostało zmienione przez USERA<name> z datą (now)
  • tabelki ORIG* zostaną wypełnione przez dane z przed zmian.

W przypadku usunięcia konta USERA, tabeli PRODUCT, LICENCE i AUTHOR zostaną wypełnione danymi z tabelek ORIG.
Nie więm co w przypadku gdy zmiana będzie polegała na usunięciu autora (np przed zmianą było dwóch, a po zmianie jeden). To samo tyczy się LICENCES.

Moje pytanie brzmi, czy taki design jest odpowiedni i ma sens.
A może ktoś ma lepszy pomysł na design takiej funkcjonalności i mógłby się podzielić pomysłami?

PS. Nie programuje zawodowo i na pewno mam braki jeżeli chodzi o więdzę z zakresu dostępnych bibliotek, patternów itp. więc dlatego proszę o pomoc na forum.

0

A co jak dwóch userow na przemian będzie robiło zmiany raz user1 raz user2, potem user1, potem user2 i tak ileś razy. Co po usunięciu user1?
Jak zrobię tak jak piszesz (wersja sprzed zmian user1) to zmiany user2 też znikną.
Jak wyglada tworzenie (kto tworzy produkt) ? User. Co jak tworzący usunie?

0

Nie będzie takiej możliwości.
USER1 może edytować tylko swoje produkty. USER2 nie może edytować produktów USERa1.

0

Czy to nie oznacza w takim razie, że jak użytkownik usunie swoje konto to możesz spokojnie usunąć jago produkty?
Jak te produkty są zakładane?

0

"Czy to nie oznacza w takim razie, że jak użytkownik usunie swoje konto to możesz spokojnie usunąć jago produkty?"

  • tak, właśnie tak jest i taki jest zamysł

"Jak te produkty są zakładane?"

  • produkty zakładane są przez USERA (np USER1 zakłada PRODUCT 'dla siebie', USER2 dla siebie itp. Każdy USER zakłada tylko swoje produkty.

  • Moje pytanie dotyczyło raczej designu, czy można ten problem w jakiś inny sposób rozwiązać.

  • Czy są może jakieś gotowe biblioteki to tego.

  • zastanawia mnie to czy konieczne jest tworzenie tych nowych tabelek (ORIG)

  • no i jak obliczyć delte na obiektach (czy są do tego może jakieś biblioteki, itp).

0

Kompletnie nie rozumiem w takim razie gdzie tu jest jakiś problem i po co Ci te tabele ORIG i Historia, delty?. Nie ma usera, wywalasz produkty, koniec.

Z innej strony warto wiedzieč, że praktyka pokazuje, że najlepiej z baz niczego nie usuwać, chyba że musisz ustawowo lub masz archiwum.

0

Wydaje mi się że nie rozumiesz problemu.

Po usunięciu konta USERA, produkty mają zostać, tylko w wersji oryginalnej (czyli w w wersji przed jakimikolwiek zmianami, oczywiście nie są już podpęte pod USERA bo o nie ma).
Wszystkie zmiany USERA i HISRTORIA wylatuje, produkty zostają w oryginlnych wersjach.

0

Delta musi być obliczana aby stworzyć wpis w HISTORII, co się zmieniło.

0

mamy

produkty zakładane są przez USERA (np USER1 zakłada PRODUCT 'dla siebie', USER2 dla siebie itp. Każdy USER zakłada tylko swoje produkty.

a niżej

Wszystkie zmiany USERA i HISRTORIA wylatuje, produkty zostają w oryginalnych wersjach.

To się nie kompiluje. Oryginalną wersję też założył USER.
Ale może chodzi o to, że ma zostac pierwsza wprowadzona przez USERa wersja produktu ?

0

Ale może chodzi o to, że ma zostac pierwsza wprowadzona przez USERa wersja produktu ?

Tak, dokładnie o to chodzi. Po usunięciu konta USERA, ma zostać pierwsza wersja wprowadzona przez tego usera, bez żadnych zmian wprowadzanych przez niego później.

0

Hmm, i właśnie przyszedł mi do głowy inny pomysł na rozwiązanie tego problemu.
Zamiast tworzenia tabelek ORIG, można dodać do każdej z nich kolumnę version

  • Gdy użytkownik ustowrzy produkt, to wiadomo, version = 1. Przy każdej edycji produktu zwiększamy wersję.
  • Gdy użytkownik istnieje (nie usunął konta) wtedy wyświetlamy PRODUCT z najwyższym version.
  • Gdy użytkownik usunął konto to wyświetlamy PRODUCT bez jego zmian, czyli VERSION 1. Przy usuwaniu konta można usunąć wszystkie PRODUCT z version > 1 (chcemy również usunąć wszystkie zmiany).
0

To też jestr opcja, żeby było śmieszniej jeśli korzystasz z javy i hibernate to jest cos takiego jak http://hibernate.org/orm/envers/ , który to automatyzuje.

Sam podchodzę do tego od drugiej strony i zapisuje zmianny (jakiś tam event sourcing) -
czyli mam log postaci:

  • USER1 created new version of product 77 with authors = {}, name= "" ...
  • USER3 created new version of product 42 with authors = {}, name= "" ...
  • USER1 created new version of product 77 with authors = {}, name= "" ...

I na podstawie tego wyliczam co jest w produktach
Ale nie polecam jak nie jesteś doświadczony.

Z całego twojego designu dziwi mnie tylko założenie, żeby wracac do wersji 1 - bo to znaczy, że jak w wesji 1 będzie głupia literówka, którą user zaraz poprawił to na koniec i tak do tego wrócimy.

0

To też jestr opcja, żeby było śmieszniej jeśli korzystasz z javy i hibernate to jest cos takiego jak http://hibernate.org/orm/envers/ , który to automatyzuje.
O,dzięki. Właśnie dlatego założyłem ten post, żeby ktoś coś mądergo podpowiedział. Przyjrzę się temu.

Z całego twojego designu dziwi mnie tylko założenie, żeby wracac do wersji 1 - bo to znaczy, że jak w wesji 1 będzie głupia literówka, którą user zaraz poprawił to na koniec i tak do tego wrócimy.
Jeżeli użytkownik usuwa konto, to wszystkie jego zmiany również. Czyli, tak jak pisałeś wracamy do wprowadzonej przez niego wersji.
W przypadku, gdy użytkownik popełni literówkę, to jest jeszcze użytkownik admin, który będzie miał prawa edycji produktów innych USERÓW, właśńie w takich przypadkach (nie pisałem tego wcześńiej bo nie sądziłem że będzie istotne).

1 użytkowników online, w tym zalogowanych: 0, gości: 1