Cześć wszystkim,
Mój dzisiejszy problem jest dość nietypowy. Chciałem zrealizować system statystyk. Dla każdego użytkownika systemu byłaby generowana jedna liczba określająca postęp w danym dniu i wpisywana do bazy danych. Wpis miałby postać:
id_user | date | points
Chciałbym docelowo przechowywać statystyki z miesiąca, a najlepiej roku. Problemy zaczynają się, gdy zaczniemy liczyć. Załóżmy, że portal ma 10 tysięcy użytkowników. Wtedy statystyki obejmujące tylko miesiąc (starsze automatycznie kasujemy) zajmują:
100k * 30 = 3 miliony rekordów - bardzo dużo!
PROBLEM
Dopuszczam możliwość, że użytkowników może być znacznie więcej, albo okres przechowywania może być dłuższy. W obu przypadkach uzyskuję bazę danych, w których mam dużo rekordów przechowujących mało informacji. Wnioskuję, że wydajność tak błahego rozwiązanie będzie okropna.
OPTYMALIZACJA 1
Przechowuję dane tygodniami, czyli mam rekord zawierający łącznie zapis z 7 ostatnich dni. Wtedy znacząco zmniejszam ilość rekordów, komplikuję jednak pobieranie i wstawianie danych, które robią się nieoczywiste. Opcji z miesięcznym rekordem (30 pól) nawet nie biorę pod uwagę.
OPTYMALIZACJA 2
Kompresuję dane do formatu JSON i w ten sposób dla każdego rekordu przechowuję dowolną ilość dni. Rozmiar takich danych nie jest tragiczny, a ilość rekordów jest już minimalna. Pobieranie - żaden problem. Modyfikacja będzie wymagała aktualizacji przynajmniej 1/24 rekordów (robię to dla każdej strefy czasowej). Wtedy mogę użyć jakieś "inteligentnego JOINA" z operacją na łańcuchach i pośrednio zaleczyć problem. Usuwanie starych dni jest jednak problematyczne: muszę wczytywać osobno każdy rekord, modyfikować go w skrypcie i odsyłać - masakra.
OPTYMALIZACJA 3
Podobny sposób, jak w wersji 2, jednak w danym rekordzie pilnuję, aby była informacja tylko o konkretnej ilości dni (np. miesiąc). Wtedy w razie potrzeby pobieram odpowiednią ilość rekordów (max 2 dla okresu miesięcznego) i jest fajnie. Regularnie usuwam rekordy ze zbyt starą informacją (starsze niż miesiąc). Oczywiście 30 dni można zamienić na dowolną ilość dni.
PODSUMOWANIE
CO o tym sądzicie? Macie jakieś lepsze pomysły/metody? Jak realizujecie takie problemy?
Pozdrawiam,
Marcin