Id jako oznaczenie kolejności dodania rekordu [MSSQL i inne]

0

Mam takie zagadnienie:
Jest w bazie jedna tabela gdzie trzymam bardzo dużo rekordów (powiedzmy że więcej niż 1 miliard) - opisy pewnych zdarzeń. Jedno z pól to oznaczenie czasu zdarzenia - nazwijmy to Time. Oczywiście tabela jest powiązana z innymi obiektami - na których te zdarzenia są wykonywane.

Często chcę w aplikacji zrobić select rekordów np. z ostatnich 3 miesięcy - powiedzmy że jest to około 20k rekordów-zdarzeń na każdy obiekt do którego są przypisane. Chcę zrobić jakiś system buforowania tych rekordów na dysku, żeby nie pobierać ich za każdym razem. Zamiast pobierać zawsze 3 miesiące będę pobierał np 2 dni (bo 2 dni temu były ostatnio pobrane i się ładnie zapisały na dysku - lub w lokalnej db). Problem w tym że czasem inna aplikacja zrobi edycję starego rekordy (edycja, dodanie rekordu z wcześniejszą datą etc). Więc nie mogę po prostu zrobić select where data > DateTime.Now-2dni. Potrzebuję jakiegoś pola, które powie mi że ten rekord nie był jeszcze pobrany i zbuforowany. Czy mogę użyć do tego Id autoinkrementowalnego?

Ponieważ każdy rekord ma Id które się zwiększa mógłbym go użyć, ale zastanawiam się czy nie ma jakiegoś haczyka. Mogę dodać kolejne pole coś w stylu "NumerDodania" i pobierać rekordy z NumeremDodania większym niż ostatnio pobrany.
Jak to fachowo zrobić? Chodzi też o to żeby wydajnościowo działało to szybko.

Baza to mssql, ale chciałbym żeby rozwiązanie było uniwersalne.

0

Nie bardzo rozumiem jak pomysł z ID rozwiązuje według ciebie problem z edycją starego rekordu. Przecież ID po edycji się nie zmieni...

0

Sorry, pomyłka zaszła w moim tekście. Nie będzie czegoś takiego jak edycja jako taka. Będzie tylko dodawanie nowych - ale z Time równym np. 2 miesiące temu. Edycję faktyczną załatwię przez ustawienie odpowiedniej flagi (usunięte) na rekordzie i dodanie nowego, ponieważ chcę też trzymać historię.

0

dodaj jakies pole z flaga, ktora Ci pomoze w wyszukiwaniu.
0 - nie bylo aktualizowane w ciagu ostatniego miesiaca
1 - bylo aktualizowane w ciagu ostatniego miesiaca

jak ktos robi inserta czy update'a jakiegos to flaga ma sie automatycznie przestawiac na 1 i tyle.
tylko pasowaloby jeszcze zrobic jakis sktypt w (nie wiem czy mssql ma jakis jezyk typu PL/SQL) ktory po jakims czasie od ostatniej zmiany flagi na 1 zmieni ja na 0.
ewentualnie mozna pokombinowac z jakims triggerem, ktory po jakims czasie bedzie zmienial flage.

0

a) trigger (ogolnie wyzwalacz) uruchamia sie w wyniku zmiany stanu rekordu (dodanie. usuniecie, modyfikacja) wiec odpada
b) przy takiej ilosci danych zapewnie masz partycje
c) jesli masz sql2012 w odpowiedniej wersji masz do dyspozycji columnstore index - moglbyc kazdego dnia materializowac np o 23 dane za ostatni miesiac i zakladac tam columnstore index (problem bedzie tylko z nowo dodanymi rekordami - odpowiednia flaga i masz unie materializacji + nowe rekordy z oryginalenej tabeli

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