2012-08-14 18 views
10

Potrzebuję utworzyć tabelę HTML z paginacją. Dane pochodzą z 2 różnych źródeł (mogą to być 2 tabele z 2 różnych baz danych, takich jak jedna Oracle, a inne to MySQL), z których nie można korzystać z połączonego oświadczenia wyboru. Aby było to bardziej skomplikowane, muszę wyświetlić dane posortowane według znacznika czasu (jedną z właściwości jest znacznik czasu) w porządku rosnącym.Tworzenie stronicowania z wielu źródeł

Na przykład źródło A ma 45 rekordów, źródło B zawiera 55 rekordów. Tak więc tabela wyświetli całkowitą liczbę rekordów 100, ale tylko wyświetlajmy powiedzmy 15 rekordów na raz. Musi więc być 7 stron (6 stron z 15 rekordami i 1 strona z 10 rekordami).

Powyższy przykład zawiera tylko 100 rekordów, które mogą być dla nich łatwe do załadowania. Ale w rzeczywistej produkcji mogą to być tysiące lub miliony rekordów. Czy ktokolwiek zna algorytm, którego mogę użyć? Parametry, które mogę podać, to numer strony i numer rekordu na stronę.

+2

Czy tabele A i B są sortowane według datownika? –

+0

W każdym źródle tabeli znajduje się kolumna znacznika czasu. Mogę je posortować, wysyłając zapytanie: – Wins

Odpowiedz

3

Jak rozumiem, twoim zmartwieniem jest pamięć.

Jeśli poszczególne tabele (A i B) nie są posortowane według znacznika czasu, należy scalić wszystkie ich zapisy w jeden plik, a następnie użyć algorytmu sortowania opartego na plikach (coś w rodzaju MergeSort, w jednym przebiegu otrzymasz posortowane pary zapisy, w 2. przebiegu otrzymujesz posortowane 4s itp.). Kiedy masz plik z wszystkimi rekordami w porządku rosnącym znaczników czasu, możesz podzielić go na strony.

Jeśli tabele są już posortowane niż potrzebujesz, to scalić N posortowane sekwencje w jeden. Proponuję zorganizować coś w rodzaju Heap, aby śledzić, które z N źródeł ma przedmiot z najmniejszym znacznikiem czasu. W Pseudokod wyglądałby tak:

for i=1,N 
{ 
    Add the 1st record from each table to the Heap 
} 
while(Heap not empty) 
{ 
    x = take the smallest item from the heap, noting which table j this record belonged to 
    Add x to output 
    if (the j-th table is not completely processed) 
    { 
    take the next value from the j-th table and insert it into the heap 
    } 
} 

złożoność wynosi O (M * logN), gdzie M jest całkowitą liczbę rekordów w tabelach, a N jest liczbą stolików. Cała ta sprawa z Heapem jest warta tylko kłopotów, jeśli N jest wystarczająco duży (domyślam się ~ 100). W przeciwnym razie wybrałbym wyszukiwanie liniowe i O (N * M).

+0

Dziękuję za odpowiedź. Przeformułowałem moje pytanie, aby podać dokładniejszy obraz sytuacji. Czy możesz opracować więcej szczegółów na temat sortowania plików? Oznacza to, że muszę przechowywać je w pliku za każdym razem, gdy zapytanie pochodzi z przeglądarki, będzie konieczne zapytanie do obu tabel i utworzenie pliku tymczasowego do sortowania na podstawie plików? – Wins

Powiązane problemy