2012-08-14 10 views
10

Tôi cần tạo bảng HTML có phân trang. Dữ liệu đến từ 2 nguồn khác nhau (có thể là 2 bảng từ 2 cơ sở dữ liệu khác nhau như một Oracle và một cơ sở dữ liệu khác là MySQL) mà bạn không thể sử dụng câu lệnh được chọn tham gia. Để làm cho nó phức tạp hơn, tôi cần hiển thị dữ liệu được sắp xếp theo dấu thời gian (một trong các thuộc tính là dấu thời gian) theo thứ tự tăng dần.Tạo phân trang từ nhiều nguồn

Ví dụ: nguồn A có 45 bản ghi, nguồn B có 55 bản ghi. Vì vậy, bảng sẽ hiển thị tổng số bản ghi là 100, nhưng chỉ hiển thị, hãy nói 15 bản ghi cùng một lúc. Vì vậy, phải có 7 trang (6 trang với 15 hồ sơ và 1 trang với 10 hồ sơ).

Ví dụ trên chỉ là tổng số 100 bản ghi có thể dễ dàng cho bộ nhớ tải tất cả. Nhưng trong sản xuất thực tế, nó có thể là hàng ngàn hoặc hàng triệu bản ghi. Có ai biết bất kỳ thuật toán mà tôi có thể sử dụng? Các thông số mà tôi có thể cung cấp là số trang và số lượng bản ghi trên mỗi trang.

+2

Bảng A và B có được sắp xếp theo dấu thời gian không? –

+0

Có cột dấu thời gian trong mỗi nguồn bảng, tôi có thể sắp xếp chúng khi truy vấn – Wins

Trả lời

3

Như tôi đã hiểu, mối quan tâm của bạn là bộ nhớ.

Nếu bảng riêng lẻ (A và B) không được sắp xếp theo dấu thời gian thì bạn cần hợp nhất tất cả các bản ghi vào một tệp và sau đó sử dụng một số thuật toán phân loại dựa trên tệp (chẳng hạn như MergeSort, trong một lần bạn nhận được cặp sắp xếp hồ sơ, trong đèo 2 bạn nhận được sắp xếp 4s vv). Khi bạn có một tệp với tất cả các bản ghi theo thứ tự dấu thời gian tăng dần, bạn có thể chia nó thành các trang.

Nếu bảng đã được sắp xếp, bạn cần phải hợp nhất N sắp xếp chuỗi thành một. Tôi đề nghị bạn tổ chức một số loại Heap để theo dõi trong số các nguồn N có mục có dấu thời gian nhỏ nhất. Trong mã giả nó sẽ trông như thế này:

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

Sự phức tạp là O (M * logN) trong đó M là tổng số bản ghi trong bảng và N là số lượng bảng. Điều này toàn bộ đống chỉ là giá trị rắc rối nếu N là đủ lớn (tôi đoán là ~ 100). Nếu không, tôi sẽ đi với tìm kiếm tuyến tính và O (N * M).

+0

Cảm ơn câu trả lời của bạn. Tôi đã lặp lại câu hỏi của mình để đưa ra bức tranh chính xác hơn về vấn đề này. Bạn có thể xây dựng thêm chi tiết về phân loại dựa trên tệp không? Nó có nghĩa là tôi phải lưu trữ chúng trong tập tin mỗi khi một yêu cầu đến từ trình duyệt, nó sẽ cần phải truy vấn cả hai bảng và tạo tập tin tạm thời để phân loại dựa trên tập tin? – Wins