2012-08-14 158 views
10

我需要創建一個帶有分頁的HTML表格。數據來自2個不同的來源(可能是來自2個不同數據庫的2個表,如一個Oracle,另一個是MySQL),您無法使用聯合選擇語句。爲了使它更復雜,我需要按升序排列按時間戳排序的數據(其中一個屬性是時間戳)。從多個來源創建分頁

例如,源A有45條記錄,源B有55條記錄。所以表格會顯示100條記錄,但是一次只顯示15條記錄。因此,必須有7頁(6頁15個記錄和1頁10個記錄)。

上面的例子總共只有100條記錄,可能很容易讓內存加載它們。但在實際生產中,它可能會有數千或數百萬條記錄。有誰知道我可以使用的任何算法?我可以提供的參數是頁碼和每頁記錄數。

+2

表A和B按時間戳排序嗎? – 2012-08-14 15:36:41

+0

每個表格源都有時間戳列,我可以在查詢時對它們排序 – Wins 2012-08-15 00:06:38

回答

3

據我所知,你的擔心是記憶。

如果單個表(A和B)沒有按時間戳排序,那麼您需要將其所有記錄合併到一個文件中,然後使用一些基於文件的排序算法(如MergeSort,記錄,在第二階段你會得到排序4秒等)。當您按照時間戳升序排列所有記錄的文件時,可以將其分解爲多個頁面。

如果表已經被排序比你需要合併 N排序的序列爲一個。我建議你組織某種Heap來跟蹤N個來源中哪個具有最小時間戳的項目。在僞代碼將是這樣的:

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 
    } 
} 

的複雜度爲O(M * logN)的,其中M是記錄表中的總數,N是表的數量。如果N足夠大(我的猜測是〜100),這整個堆的東西是值得的麻煩。否則,我會走線性搜索和O(N * M)。

+0

感謝您的回答。我已經重新提出了我的問題,以更準確地說明問題。你能詳細說明基於文件的排序嗎?這意味着每次來自瀏覽器的請求都必須將它們存儲在文件中,那麼需要查詢兩個表並創建基於文件的排序的臨時文件? – Wins 2012-08-15 01:22:16