2010-06-21 5 views
7

Większość badań, które widziałem na temat podziału na strony w CouchDB sugeruje, że musisz wziąć pierwsze dziesięć (lub jak najwięcej) elementów z widoku, a następnie nagrać dokument docid ostatniego dokumentu i przekazać go na następnej stronie . Niestety, widzę kilka rażących problemów z tą metodą.Bezstanowe dzielenie na strony w CouchDB?

  • To najwyraźniej sprawia, że ​​niemożliwe, aby przejść wokół wewnątrz zbioru stron (jeśli ktoś przeskakuje bezpośrednio do strony 100, trzeba by uruchomić zapytań dla stronach 2-99 więc wiedziałby jak załadować strona 100) .
  • Wymaga to podania możliwie dużej ilości informacji o stanie między stronami.
  • Trudno jest poprawnie kodować.

Niestety my research wykazały, że przy użyciu skip rozwija znaczne spowolnienie dla zbiorów 5000 rekordów lub większe, i będzie pozytywnie wyniszczający po osiągnięciu czegoś naprawdę ogromny (idąc do strony 20000 z 10 rekordów na stronie zajęłoby około 20 sekund - i tak, są zestawy danych, które są duże w produkcji). Więc to naprawdę nie jest opcja.

Tak, o co pytam, czy istnieje skuteczny sposób na przeglądanie stron w wynikach w CouchDB, dzięki czemu można uzyskać wszystkie pozycje z dowolnej strony? (Używam couchdb-python, ale mam nadzieję, że nie ma w tym nic, co byłoby zależne od klienta.)

Odpowiedz

3

Jestem nowy w CouchDB, ale myślę, że mógłbym pomóc. Czytam następujące od CouchDB: The Definitive Guide:

Jedną wadą połączonej listy stylu paginacji jest to, że ... skoki do określonej strony naprawdę nie działa ... Jeśli naprawdę potrzebujesz przejdź na stronę w pełnym zakresie dokumentów ... nadal możesz zachować indeks wartości całkowitych jako indeks widoku i mieć podejście hybrydowe do rozwiązywania stronicowania.
      — http://books.couchdb.org/relax/receipts/pagination

Jeśli czytam tego prawa, podejście w Twoim przypadku będzie:

  1. osadzić sekwencji numerycznej w swoim zbiorze dokumentów.
  2. Wyodrębnij sekwencję numeryczną do indeksu widoku numerycznego.
  3. Użyj arytmetycznych do obliczenia poprawnych klawiszy początku/końca dla dowolnej strony.

Dla kroku 1 trzeba faktycznie dodać coś w rodzaju "page_seq" jako pole do dokumentu. Nie mam konkretnego zalecenia, jak zdobyć ten numer i jestem ciekawa, co ludzie myślą. Aby ten schemat zadziałał, musi on zwiększyć się dokładnie o 1 dla każdego nowego rekordu, więc sekwencje RDBMS są prawdopodobnie wyłączone (te, które znam, mogą pomijać liczby).

Na etapie 2, można by napisać widok z funkcją mapy, że jest coś takiego (w JavaScript):

function(doc): 
    emit(doc.page_seq, doc) 

Na etapie 3, można napisać coś takiego zapytania (zakładając, że page_seq i numeracja strona sekwencje zaczynają się od 1):

results = db.view("name_of_view") 
page_size = ... # say, 20 
page_no = ... # 1 = page 1, 2 = page 2, etc. 
begin = ((page_no - 1) * page_size) + 1 
end = begin + page_size 
my_page = results[begin:end] 

a następnie można wykonać iterację my_page.

Oczywistym mankamentem tego jest to, że parametr page_seq zakłada, że ​​nie filtrujesz zestawu danych dla widoku, i szybko wpadniesz w kłopoty, jeśli próbujesz sprawić, by działało z arbitralnym zapytaniem.

Komentarze/usprawnienia mile widziane.