Indeksowanie i zapytania

Odpytuj wszystko. Nie przetwarzaj niczego drugi raz.

Magazyn append-only w MindooDB i śledzenie zmian kursorem pozwalają budować indeksy, które pozostają aktualne, bo przetwarzają wyłącznie to, co się zmieniło — bez ponownego skanowania całej bazy danych. To samo prymitywne narzędzie napędza widoki wirtualne, wyszukiwanie pełnotekstowe, synchronizację z zewnętrznymi systemami i zapytania o przeszłe stany.

Indeksowanie przyrostowe: bazy danych podają zmienione dokumenty przez kursor do widoków wirtualnych, zewnętrznych indekserów i zapytań o przeszłe stany
Dla decydentów

Dlaczego indeksowanie przyrostowe ma znaczenie

W bazach danych szyfrowanych end-to-end serwer nie wykona zapytań — wszystkie dane to szyfrogram. MindooDB rozwiązuje to przyrostowym indeksowaniem po stronie klienta: jedną opartą na kursorze API, która przetwarza tylko zmienione dokumenty. Niesie ona wszystko, od hierarchicznych zestawień, przez wyszukiwanie pełnotekstowe, po audyty zgodności — i nigdy nie wymaga pełnego skanu bazy. Efektem jest przewidywalna wydajność, która skaluje się z tempem zmian, a nie z ilością danych.

Jedno prymitywne narzędzie, wiele wzorców

iterateChangesSince() to wspólny fundament widoków wirtualnych, wyszukiwania pełnotekstowego, synchronizacji z zewnętrznymi systemami i własnych analiz. Poznaj jedną API, odblokuj wszystkie wzorce odpytywania.

Zapytania ponad granicami

Widoki wirtualne obejmują wiele baz danych w jednym tenancie, sięgają ponad tenanty albo mieszają dane lokalne i zdalne — bez przenoszenia dokumentów. Idealne do skonsolidowanych pulpitów i raportowania ponad organizacjami.

Wbudowana podróż w czasie

Magazyn append-only zachowuje każdą zmianę. Odpytuj dowolny przeszły stan, porównuj, jak dokumenty zmieniały się w czasie, twórz migawki bazy danych na dany moment i buduj pełne ścieżki audytu — wszystko z tych samych danych.

Fundament

iterateChangesSince() — przetwarzaj tylko to, co się zmieniło

Każda strategia odpytywania w MindooDB zaczyna się od tego samego prymitywu: opartego na kursorze generatora asynchronicznego, który wydaje dokumenty w kolejności ich zmian. Przy pierwszym wywołaniu przechodzi całą bazę danych; przy kolejnych podejmuje dokładnie tam, gdzie skończył. Usunięte dokumenty przychodzą ze znacznikiem usunięcia, więc indeksy po drugiej stronie mogą posprzątać. Koszt każdego przebiegu jest proporcjonalny do liczby zmian od ostatniego kursora — nie do wielkości całej bazy.

Jak to działa
  • Oparte na kursorze — przy pierwszym skanie przekaż null, a przy przyrostowych aktualizacjach ostatnio zwrócony kursor
  • Kolejność zmian — dokumenty przychodzą od najstarszej zmiany, więc indeksy widzą spójny przebieg
  • Świadome usunięć — usunięte dokumenty pojawiają się z flagą isDeleted() i dają się czysto usunąć z indeksów
  • Porcjowanie po stronie odbiorcy — generator asynchroniczny pozwala zatrzymać się w dowolnym momencie i wznowić później
Charakterystyka wydajności
  • O(changed) — każdy przyrostowy przebieg przetwarza tylko dokumenty zmienione od ostatniego kursora
  • Żadnych pełnych skanów — wewnętrzny indeks prowadzi (lastModified, docId), żeby kursor wznawiał się wydajnie
  • Wymienni odbiorcy — jeden strumień zmian może w jednym przebiegu zasilić wiele indekserów
  • Działa offline — indeksy aktualizują się lokalnie; synchronizacja przynosi zdalne zmiany, a potem indeksery przetwarzają deltę
Widoki wirtualne

Hierarchiczne widoki z kategoriami, sortowaniem i sumami

Widoki wirtualne układają dokumenty w strukturę drzewa w pamięci — pomyśl o dynamicznym spisie treści, który kategoryzuje, sortuje i agreguje Twoje dane. Wzorowane na sprawdzonym paradygmacie widoków z HCL Notes/Domino, obsługują zagnieżdżone hierarchie kategorii, sortowanie rosnące i malejące po wielu kolumnach oraz wbudowane agregacje SUM i AVERAGE na wierszach kategorii. Aktualizacje są przyrostowe: gdy dokument się zmienia, widok odświeża tylko dotknięte gałęzie.

Co dostajesz
  • Kolumny kategorii — grupują dokumenty w zagnieżdżone hierarchie (np. Dział > Rok > Kwartał)
  • Kolumny sortujące — porządkują wpisy wewnątrz każdej kategorii po jednym lub kilku polach
  • Kolumny sum — automatyczne SUM albo AVERAGE dla każdej kategorii, aktualizowane przyrostowo
  • Kolumny wyświetlane — dodatkowe dane pokazywane przy każdym wpisie
  • Funkcje wartości — wyliczają wartości kolumn dynamicznie z danych dokumentu
Nawigacja i kontrola dostępu
  • Rozwijanie i zwijanie — wchodź w kategorie albo je zamykaj, jak w menedżerze plików
  • Nawigacja po pozycji — skocz do „1.2.3” (pierwsza kategoria, druga podkategoria, trzeci wpis)
  • Zaznaczanie — wybieraj pojedyncze wpisy albo całe kategorie do operacji masowych
  • Callbacki kontroli dostępu — filtruj widoczne wpisy dla każdego użytkownika, nie zmieniając struktury widoku
  • Iteracja w przód i w tył — przechodź drzewo w obu kierunkach
Przykładowy wynik: widok pracowników z kategoriami i sumami wynagrodzeń
Engineering (Suma: $260,000)
Johnson, Alice — $130,000
Smith, Bob — $130,000
Sales (Suma: $200,000)
Brown, Charlie — $100,000
Williams, Diana — $100,000
Zapytania ponad granicami

Jeden widok, wiele baz danych — także ponad tenantami

Jedną z najmocniejszych cech widoków wirtualnych jest możliwość połączenia dokumentów z wielu instancji MindooDB w jeden, wspólny widok. Każde źródło danych jest identyfikowane łańcuchem „origin”, więc zawsze wiadomo, z której bazy danych (i z którego tenanta) pochodzi dokument. Dzięki temu bez trudu zbudujesz skonsolidowane pulpity, raporty ponad regionami i analizy ponad organizacjami — bez przenoszenia i duplikowania danych.

Widoki ponad wieloma bazami danych

Połącz bazę produktów z USA i bazę produktów z UE w jeden katalog produktów. Widok kategoryzuje i sortuje w poprzek obu źródeł. Każdy wpis niesie swój origin, więc interfejs może pokazać region pochodzenia.

Widoki ponad wieloma tenantami

Rozepnij widoki na różne obiekty MindooTenant, żeby raportować ponad organizacjami. Dwie organizacje dzielą dane w trzecim tenancie; skonsolidowany widok agreguje przychód z wszystkich trzech — a każdy tenant zachowuje własną administrację.

Przyrostowo we wszystkich źródłach

Każdy dostawca danych prowadzi własny kursor niezależnie. Wywołanie view.update() przetwarza tylko te dokumenty, które zmieniły się w danym źródle od ostatniego przebiegu. Pojedynczy origin odświeżysz też przez view.updateOrigin("us-products").

Integracja z zewnętrznymi systemami

Wysyłaj przyrostowe aktualizacje do dowolnego indeksera i potoku

To samo prymitywne iterateChangesSince(), które napędza widoki wirtualne, zasili każdy zewnętrzny system. Utrzymuj nim aktualny indeks wyszukiwania pełnotekstowego, przekazuj zmiany do potoku analitycznego albo replikuj dane do usługi zewnętrznej. Ponieważ kursor dokładnie pamięta, które dokumenty zostały już przetworzone, integracja nie przegapi żadnej zmiany i nie przetworzy niczego niepotrzebnie drugi raz.

Wyszukiwanie pełnotekstowe — wbudowane

Wyszukiwanie pełnotekstowe po stronie klienta to naturalne dopełnienie szyfrowania end-to-end — i MindooDB ma je od razu w zestawie: włączany opcjonalnie, utrzymywany przez changefeed indeks pełnotekstowy (na bazie MiniSearch), który jest przechowywany w postaci zaszyfrowanej i wchodzi wprost w zapytania, z wynikami sortowanymi po trafności.

  • Różnorodne treści — zwykły tekst, pola tekstowe Automerge, fragmenty rich text, tekst z załączników (PDF/Office)
  • Integracja z zapytaniami — łącz trafienia pełnotekstowe ze strukturalnymi filtrami i sortowaniem po trafności
  • Świadome języka — tokenizacja przez Intl.Segmenter, konfigurowalna osobno dla każdej bazy danych
  • Zewnętrzne indeksery — FlexSearch, Lunr.js i własne systemy dalej podłączysz przez changefeed
Własne potoki

Buduj potoki danych, które reagują na zmiany dokumentów. Wzorzec generatora asynchronicznego pozwala przetwarzać zmiany we własnym tempie, z wbudowanym mechanizmem przeciwciśnienia.

  • Zasilanie analityki — wysyłaj zagregowane wskaźniki na pulpity
  • Wyzwalacze webhook — powiadamiaj zewnętrzne systemy, gdy zmienią się konkretne dokumenty
  • Potoki ETL — wyciągaj i przekształcaj dane dla systemów raportowych
  • Replikacja — odwzoruj dane w systemach wtórnych z semantyką exactly-once
Orkiestracja indeksów

Menedżer indeksów może sterować wieloma indekserami z jednego strumienia zmian. Każdy zmieniony dokument jest przetwarzany raz, a aktualizacje trafiają w jednym przebiegu do wszystkich zarejestrowanych indeksów — widoków wirtualnych, wyszukiwania pełnotekstowego, analityki i własnych odbiorców. Każdy indekser prowadzi własny stan, więc dodanie albo przebudowa jednego z nich nie dotyka pozostałych.

Podróż w czasie

Odpytuj przeszłość, porównuj zmiany, buduj ścieżki audytu

Magazyn append-only w MindooDB zachowuje każdą zmianę dokumentu. Daje to trzy mocne możliwości: pobranie dokumentu z dowolnego historycznego znacznika czasu, przejście pełnej historii zmian dokumentu i wypisanie wszystkich dokumentów, które istniały w danej chwili. Razem niosą audyty zgodności, porównywanie wersji, cofanie i ponawianie zmian oraz migawki bazy danych na dany moment.

Zapytania o dany moment
  • getDocumentAtTimestamp() — pobiera migawkę dokumentu z dowolnego przeszłego znacznika czasu, wraz ze wszystkimi zmianami do tej chwili
  • getAllDocumentIdsAtTimestamp() — wydajnie zwraca identyfikatory wszystkich dokumentów, które istniały w danej chwili, bez wczytywania treści
  • Obsługa usuniętych dokumentów — odróżnia „jeszcze nie istniał” (zwraca null) od „został usunięty” (zwraca dokument z flagą isDeleted())
Przechodzenie historii
  • iterateDocumentHistory() — przechodzi każdą zmianę od utworzenia do stanu bieżącego, w kolejności chronologicznej
  • Metadane autora — każda zmiana zawiera znacznik czasu i publiczny klucz podpisujący użytkownika, który ją wprowadził
  • Niezależne kopie — każda wydana wersja dokumentu to samodzielna migawka, którą można bezpiecznie zapisać i porównać
  • Wykrywanie zmian — wydaje wynik tylko wtedy, gdy dokument faktycznie się zmienił (aktualizacje bez skutku są pomijane)
Migawki na dany moment

Twórz osobne instancje bazy danych zsynchronizowane na dowolną datę

Ponieważ protokół synchronizacji MindooDB przenosi pojedyncze wpisy zmian wraz ze znacznikami czasu, możesz założyć nową instancję bazy danych i zsynchronizować ją tylko do określonego momentu. Powstaje z tego zamrożona migawka bazy z tej chwili — przydatna przy audytach regulacyjnych, w odtwarzalnych analizach i przy porównywaniu stanu danych między okresami. Magazyn append-only gwarantuje, że migawka jest kompletna i odporna na manipulacje.

Migawki dla nadzoru

Twórz zamrożoną kopię bazy danych na koniec każdego kwartału obrotowego. Audytorzy mogą niezależnie zweryfikować stany dokumentów, podpisy autorstwa i historię zmian — wszystko jest kryptograficznie dowodliwe.

Porównanie w czasie

Zestaw dokumenty z dwóch znaczników czasu, żeby zobaczyć, co w międzyczasie powstało, zmieniło się albo zostało usunięte. W połączeniu z getDocumentAtTimestamp() prześledzisz dokładnie, jak zmieniały się pojedyncze dokumenty.

Odtwarzalne analizy

Uruchom ten sam widok wirtualny albo to samo zapytanie na migawkach bazy danych z różnych dat. Porównuj wyniki miesiąc do miesiąca albo kwartał do kwartału, bez utrzymywania osobnych baz raportowych.

Przykłady kodu

Wzorce do skopiowania

Te fragmenty pochodzą z dokumentacji MindooDB i z zestawu testów, żeby odpowiadały rzeczywistym wzorcom użycia.

Miejsce w architekturze

Jak indeksowanie przyrostowe wpisuje się w architekturę MindooDB

Dlaczego indeksowanie po stronie klienta?

W MindooDB treść dokumentów jest szyfrowana end-to-end. Serwer przechowuje wyłącznie szyfrogram i nie wykona zapytań. To świadomy kompromis na rzecz bezpieczeństwa: poufność przed wygodą po stronie serwera. Indeksowanie na kliencie przywraca oczekiwane możliwości odpytywania — z gwarancją, że Twoje dane nigdy nie odsłaniają się przed serwerem.

Podejście przyrostowe utrzymuje to w praktyce także przy dużej skali. Zamiast przebudowywać indeksy od zera po każdej synchronizacji, kursor podejmuje dokładnie tam, gdzie skończył, i przetwarza samą deltę. Przy bazie ze 100 000 dokumentów, z których od ostatniej synchronizacji zmieniło się 50, indekser przetwarza 50 dokumentów — nie 100 000.

Przewaga append-only

Magazyn append-only w MindooDB jest tym, co w ogóle umożliwia wszystkie te wzorce. Ponieważ zmiany nigdy nie są nadpisywane:

  • Kursory są stabilne — kolejność zmian się nie zmienia, więc wznowienie od kursora jest zawsze spójne
  • Podróż w czasie nic nie kosztuje — pełna historia już jest zapisana; dodatkowe logi ani migawki nie są potrzebne
  • Ścieżki audytu są wbudowane — każda zmiana jest podpisana przez autora i opatrzona znacznikiem czasu
  • Przyrostowe aktualizacje są poprawne — strumień zmian jest kompletny i uporządkowany; żadna aktualizacja nie ginie

Stoi to w kontraście do baz danych z nadpisywaniem, w których śledzenie zmian, historia i indeksowanie przyrostowe wymagają dodatkowej infrastruktury (WAL, CDC, strumienie zmian, tabele audytowe).