Wpis z mikrobloga

Jaki jest najbardziej efektywny sposób sprawdzania jakie są różnice między tym co w bazie a miedzy tym co przychodzi z api? Może ktoś rzucić jakiś buzzword?

Chodzi o sytuację kiedy na bazie jest np. 10 000 rekordów w kilku tabelach i codziennie odpytuje się zewnętrzne api po te dane, jak wychwycić co trzeba będzie zaktualizować, co nowego dodać, co usunąć, a co przywrócić (poprzez soft delete)? Póki co pomysłem jest dodanie hash code i equals na encjach na kolumnach zewnętrzne id + te kolumny które mogą ulec zmianie. Wychwyciło by to zmiany ale czy jest to super wydajne? Wątpię.

#java #bazydanych #hibernate #spring
  • 12
@MrFisherman:
1. Dane w tabelach nie mogą być kasowane (delete), tylko oznaczane do skasowania. Np. dodać kolumnę o nazwie ISDEL ustawioną na TRUE w momencie gdy aplikacja wiersz kasuja, to oznacza, że rekord został usunięty. Widoki korzystające z tej tabeli muszą jedynie mieć where ISDEL <> TRUE aby miało to sens
2. Dodać kolumnę na tabeli ROWUPDATE typu Date
3. Trigger after insert/update, który aktualizuje kolumnę ROW
UPDATE
@Supaplex: dzięki za odpowiedź ale chyba się źle zrozumieliśmy co do ostatniego punktu albo źle napisałem. Pisząć "codziennie odpytuje się zewnętrzne api po te dane" to chodziło mi o to że to ja zaciągam dane z zewnątrz, nie mogę tam dodać parametru "podaj mi tylko dane które się zmieniły", sam muszę wywnioskować które są zmienione/usunięte/dodane (na razie pomysłem jest bazowanie na hashcode) :D
@MrFisherman: jeżeli Ciebie dobrze rozumiem, to dodaj kolumnę :datetime_updated - data i czas ostatniej modyfikacji encji z indeksem, wtedy możesz wybierać tylko te, które uległy / nie uegły zamianie od jakiegoś czasu. Indeks da że będzie to szybkie. 10k rekordów to żadna ilośc, nie odczujesz spadku performancu

Jeżeli chcesz trzymać historię zmian, konieczna będzie tabela - repo. Gdzie w tabeli głównej będziesz miał ostatnią "albo masterową" wartość

podaj przykład danych, o
@aaandrzeeey: przerobie mój przykład na jakiś abstrakcyjny.

Zbiór banków z dostępami do modułów jakiegoś tam programu:

Bank {
apiId
name
shortName
status
}

BankAccount{
apiId
name
surname
bankId
status
}

AccountModuleAccess{
accountId
moduleName
status
}

Przykład jest nieprawdziwy i te dane które mam mogą się zmieniać codziennie wszystkie, (tak jak tutaj status, imie, nazwisko itp.). I nie mogę tego ograniczyć do jakiejś daty, muszę zawsze odpytywać api o wszystkie dane i
@MrFisherman: a dlaczego nie MERGE? (powtarzam się)

pobierasz dane z api do tabeli tymczasowej i potem merge'ujesz ją do tej głównej tabeli, w której przechowujesz dane, usuwasz dane z tymczasowej i jutro od nowa

wpisz w google merge into source target i poszukaj jakiegoś przykładu zapytania. merge'm możesz ograć jednocześnie insert, update i delete
via Wykop Mobilny (Android)
  • 0
@janek_: niby tak ale merge chyba się opiera na @Id a to jest oznaczenie dla identyfikatora encji i nie da się tego przestawić na klucz naturalny. Musiałbym ustawić to zewnętrzne apiId jako moje @Id co w sumie nie jest głupim pomysłem.
@MrFisherman: nie rozumiem, co masz na mysli z tym opieraniem się na id

robisz coś w stylu:

MERGE docelowa_tabela as target
using ta_nasza_tabela_tymczasowa_z_danymi_z_api as source
ON source.jakas_kolumna = target.jakas_kolumna
and source.jakas_kolumna_o_innej_nazwie = target.jakas_inna_kolumna
--and itd
when matched then
-- kod odpowiedzalny za update
when not matched by target then
-- kod odpowiedzialny za insert
when not matched by source then
-- kod odpowiedzialny za delete

jeśli dodasz jeszcze OUTPUT to będziesz