Paginasiya nədir, növləri və iş prinsipi

Müəllif: IT Sectr Dərc olunub: 2026-03-11 Oxuma vaxtı: 9 dəq

Paginasiya — mobil tətbiqlərdə və veb xidmətlərdə böyük məlumat dəstləri ilə işləmək üçün istifadə olunan səhifə-səhifə məlumat yükləmə texnikası. Android Developers Documentation (2025)-a görə, paginasiyanın düzgün tətbiqi API yükünü azaldır, trafikə qənaət edir və istifadəçi təcrübəsini yaxşılaşdırır. Səhifə-səhifə yükləmə tətbiqə məzmunu tədricən, bütün məlumatların tam yüklənməsini gözləmədən göstərməyə imkan verir.

Əsas məqamlar

  • Paginasiya — performansı və trafiki optimallaşdırmaq üçün böyük məlumat dəstlərini hissə-hissə yükləmə üsulu.
  • Offset paginasiyası naviqasiya üçün sürüşdürmə (page/offset) istifadə edir — sadə, lakin tez-tez əlavələr zamanı qeyri-sabit üsul.
  • Cursor paginasiyası son qeydin unikal kursorundan istifadə edir — sorğular arasında məlumat dəyişikliyində sabitdir.
  • Keyset paginasiyası unikal indeksli sütun üzrə filtrləyir — dublikatsız böyük cədvəllər üçün səmərəlidir.
  • Time-based paginasiyası qeydləri zaman damğalarına görə qruplaşdırır — xəbər lentləri və sosial şəbəkələr üçün əlverişlidir.

Paginasiya nədir?

Paginasiya (ing. pagination — səhifə bölgüsü) — böyük məlumat dəstini ardıcıl hissələrə (səhifələrə) bölmə texnikasıdır. Mobil tətbiqlərdə paginasiya mesaj siyahılarının, xəbər lentinin, məhsul kataloqlarının, sifariş tarixçəsinin və potensial olaraq limitsiz sayda qeydləri olan digər kolleksiyaların yüklənməsi zamanı istifadə olunur.

Paginasiya olmadan tətbiq bütün məlumatları birdən yükləməli olur ki, bu da uzun gözləməyə, böyük trafik sərfinə və zəif cihazlarda qeyri-sabit işə səbəb olur. Paginasiyalı API sorğusu yalnız bir hissə məlumat və növbəti hissəni yükləmək üçün meta-məlumat qaytarır — beləliklə, tətbiq alınan məlumatın həcminə nəzarət edir.

Paginasiyanın əsas göstəriciləri: səhifə ölçüsü (page size) — bir səhifədəki qeydlərin sayı (adətən 10-50), və səhifə nömrəsi və ya kursor — dəstdəki cari mövqeyi göstərən işarə. Səhifə ölçüsünün seçimi məlumat növündən asılıdır: yığcam elementlər (adlar) üçün 20-30, şəkilli kartlar üçün 10-15 kifayətdir.

Mobil tətbiqlərdə paginasiya nə üçün lazımdır

Mobil cihazların məhdud resursları var: operativ yaddaşın həcmi, prosessor sürəti və trafik limitləri. Paginasiya üç əsas problemi həll edir: yaddaş istehlakının azaldılması (yaddaşda yalnız görünən elementlər saxlanılır), ilk göstərilmənin sürətləndirilməsi (birinci hissə bütün dəstdən daha tez yüklənir) və trafikə qənaət (məlumatlar yalnız istifadəçi siyahını sürüşdürdükdə yüklənir).

Paginasiyanın əsas növləri

Hər biri spesifik vəzifələri həll edən dörd əsas paginasiya növü mövcuddur. Metodun seçimi məlumatların ardıcıllığı tələblərindən, API arxitekturasından, saxlama növündən və müştəri və server tərəfində icazə verilən tətbiq mürəkkəbliyindən asılıdır.

Növİş prinsipiSabitlikBöyük həcmlərdə sürət
OffsetSQL-də LIMIT + OFFSETaşağıOFFSET artdıqca azalır
CursorWHERE id > last_idyüksəksabit (O(log n))
KeysetWHERE key > last_keyyüksəksabit (O(log n))
Time-basedWHERE created_at < last_timeortaindekslə sabit

Hansı növü nə vaxt istifadə etməli

Offset paginasiyası sadə tətbiqin vacib olduğu statik və ya nadir hallarda yenilənən məlumat dəstləri üçün uyğundur. Cursor və Keyset — tez-tez əlavələr olan dinamik məlumatlar üçün. Time-based — qeydlərin yaradılma vaxtına görə sıralandığı xronoloji lentlər üçün. GraphQL standartı Relay yeganə tövsiyə olunan metod kimi cursor paginasiyasını istifadə edir.

Offset paginasiyası: üstünlüklər və çatışmazlıqlar

Offset paginasiyası — səhifə-səhifə yükləmənin ən sadə növüdür. Müştəri page və limit (və ya offset və limit) parametrlərini ötürür, server SQL OFFSET və LIMIT tətbiq edir. Məsələn, page=2, limit=20 21-dən 40-a qədər qeydləri qaytarır. Bu metod intuitiv olaraq başa düşüləndir və istənilən texnoloji yığında asanlıqla tətbiq olunur.

python
from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items")
async def get_items(
    page: int = Query(default=1, ge=1),
    limit: int = Query(default=20, le=100)
):
    offset = (page - 1) * limit
    items = await fetch_items(offset, limit)
    total = await count_items()
    return {
        "items": items,
        "total": total,
        "page": page,
        "pages": (total + limit - 1) // limit
    }

Məlumatların uyğunsuzluğu problemi

Offset paginasiyasının əsas çatışmazlığı — buraxılmış və təkrarlanan qeydlər problemi. İki sorğu arasında cədvələ yeni qeydlər əlavə edilərsə, OFFSET dəyişir: istifadəçi eyni qeydi iki dəfə görə bilər və ya yenisini qaçıra bilər. Bu, ardıcıllığın vacib olduğu xəbər lentləri və çatlar üçün kritikdir.

Digər problem — böyük OFFSET-lərdə performansın azalması. Məlumat bazası nəticəni qaytarmazdan əvvəl ilk offset qeydləri skan edib keçməlidir. offset=100000 olduqda hətta LIMIT 20 ilə belə server skan etməyə nəzərəçarpacaq vaxt sərf edir. PostgreSQL və MySQL OFFSET artdıqca xətti sürət azalması göstərir.

Offset nə vaxt hələ də yaxşıdır

Offset paginasiyası aşağıdakılar üçün ən yaxşı seçim olaraq qalır: inzibati panellər (məlumatlar nadir hallarda dəyişir, səhifələr üzrə naviqasiya lazımdır), hesabatlar və tarixi jurnallar (sabit məlumat kəsimi), filtrləmə ilə kataloqlar (istənilən səhifəyə keçmək olar). Offset həmçinin müştəri tərəfində tətbiq etmək üçün ən asandır — RecyclerView Paging 3 ilə onu qutudan çıxan kimi dəstəkləyir.

Keyset və Time-based paginasiyası

Keyset paginasiyası qeydləri filtrləmək üçün unikal açar (adətən əsas açar) istifadə edir. OFFSET əvəzinə sorğu WHERE id > last_seen_id istifadə edir. Bu, qeydlərin sayından asılı olmayaraq sabit performans və əlavələr zamanı dublikatların olmamasını təmin edir, çünki yeni qeydlər həmişə daha böyük id-yə malikdir.

sql
-- Offset səhifələmə (problematik)
SELECT * FROM posts
ORDER BY id
LIMIT 20 OFFSET 100;

-- Keyset səhifələmə (sabit)
SELECT * FROM posts
WHERE id > 100
ORDER BY id
LIMIT 20;

Time-based paginasiyası

Time-based paginasiyası (və ya zaman kursoru) naviqasiya üçün created_at zaman damğasından istifadə edir. Müştəri son yüklənmiş qeydin timestamp-ni ötürür, server bu damğadan əvvəl və ya sonra yaradılmış qeydləri qaytarır. Metod sosial şəbəkələrdə və xəbər lentlərində populyardır, burada qeydlərin sırası dərc vaxtı ilə müəyyən edilir.

Time-based paginasiyasının xüsusiyyəti — iki qeyd eyni millisaniyədə yaradıldıqda dublikatlar mümkündür. Bu problemi aradan qaldırmaq üçün time-based açar unikal id ilə birləşdirilir: WHERE (created_at, id) < (last_time, last_id). Belə mürəkkəb kursor hər bir qeydin unikallığını və dəqiq sırasını təmin edir.

Keyset və Time-based müqayisəsi

Keyset paginasiyası unikal və monoton artan dəyəri olan sütun tələb edir (auto-increment id, UUID v7). Time-based created_at olan istənilən cədvəl üçün uyğundur, lakin dublikatların əlavə işlənməsini tələb edir. Əsas fərq: Keyset istənilən əlavə əməliyyatlarında sabit işləyir, Time-based isə eyni zaman damğalarına həssasdır.

Layihə üçün paginasiya növünü necə seçmək

Paginasiya növünün seçimi məlumatların xarakterindən və istifadəçi təcrübəsi tələblərindən asılıdır. Aşağıda mobil inkişafda tipik ssenarilər üçün tövsiyələr verilmişdir. Universal həll yoxdur — hər bir metodun optimal olduğu tətbiq sahəsi var.

  • Çat / messencer — Cursor paginasiyası (mesaj id-si ilə). Yeni mesajlar yuxarıdan əlavə olunur, kursor sürüşmür.
  • Xəbər lenti — Time-based paginasiyası (created_at ilə). Qeydlər vaxta görə sıralanır, xronologiya vacibdir.
  • Məhsul kataloqu — Offset paginasiyası. İstifadəçi konkret səhifəyə keçə bilər, məlumatlar nadir hallarda dəyişir.
  • Sifariş tarixçəsi — Cursor paginasiyası. Sabitlik vacibdir, çünki yeni sifarişlər yükləmələr arasında əlavə olunur.
  • Şərhlər — Keyset paginasiyası. Hər şərhin unikal id-si var, dublikatsız böyük həcmlər.

Android-də Paging 3 ilə tətbiq

Android Paging 3 kitabxanası PagingSource vasitəsilə bütün paginasiya növlərini dəstəkləyir. Offset üçün — Int açarı (page) ilə PagingSource, Cursor üçün — String və ya Long açarı (cursor) ilə. PagingSource avtomatik olaraq yükləməni, keşləməni və xətalarda təkrar cəhdləri idarə edir.

kotlin
class PostPagingSource(
    private val api: PostApi
) : PagingSource<Long, Post>() {

    override suspend fun load(
        params: LoadParams<Long>
    ): LoadResult<Long, Post> {
        val cursor = params.key ?: Long.MAX_VALUE
        return try {
            val response = api.getPosts(cursor, params.loadSize)
            LoadResult.Page(
                data = response.items,
                prevKey = null,
                nextKey = response.items.lastOrNull()?.id
            )
        } catch (e: Exception) {
            LoadResult.Error(e)
        }
    }

    override fun getRefreshKey(state: PagingState<Long, Post>): Long? {
        return state.anchorPosition?.let {
            state.closestItemToPosition(it)?.id
        }
    }
}

Səhifə ölçüsü ilə bağlı tövsiyələr

Səhifə ölçüsü yükləmə sürətinə və performans qavrayışına təsir edir. Mobil tətbiqlər üçün optimal diapazon səhifədə 10-25 elementdir. 10-dan az — API-yə çox tez-tez sorğular və sıçrayışlı skroll. 25-dən çox — yavaş şəbəkələrdə ilk hissənin uzun yüklənməsi.

Şəkillər və videolar üçün səhifə ölçüsü 5-10-a endirilir, çünki hər bir element media yükləmək üçün əlavə vaxt tələb edir. Mətn elementləri olan siyahılar (şərhlər, jurnallar) üçün ölçü 30-50 qeydə qədər artırıla bilər. Səhifə ölçüsünün API vasitəsilə konfiqurasiya edilə bilən olması tövsiyə olunur ki, müştəri müxtəlif şəbəkə şərtlərinə uyğunlaşa bilsin.

Tez-tez verilən suallar

Paginasiya nədir sadə sözlərlə?

Paginasiya — məlumatların hamısını birdən yox, hissə-hissə yükləməkdir. Kitabda olduğu kimi: bir səhifəni oxuyursan, sonra növbəti səhifəyə keçirsən. Tətbiqdə bu o deməkdir ki, siyahını sürüşdürərkən növbəti məlumat hissəsi yüklənir, bütün siyahı birdən yox, bu da trafikə və yaddaşa qənaət edir.

Offset Cursor paginasiyasından nə ilə fərqlənir?

Offset qeydləri sayır: “20-ni keç, növbəti 10-u qaytar”. Yükləmələr arasında yeni qeyd əlavə olunarsa — nömrələmə sürüşür. Cursor son qeydin unikal identifikatorundan istifadə edir: “ID = 100-dən sonra 10 qeyd qaytar”. Yeni qeydlər mövqeyə təsir etmir.

Paginasiya səhifəsinin hansı ölçüsü optimaldır?

Mobil tətbiqlər üçün optimal 10-25 elementdir. Şəkilli siyahılar üçün — 5-10, mətn lentləri üçün — 20-30. Ölçü bir elementin orta ölçüsündən asılıdır: element nə qədər ağır olsa, sürətli göstərilmə üçün səhifə bir o qədər kiçik olmalıdır.

RecyclerView-də paginasiyanı necə tətbiq etmək olar?

Android Jetpack-dən Paging 3 kitabxanasından istifadə edin. O, yükləmə üçün PagingSource, reaktiv axın üçün PagingData və sürüşdürmə zamanı avtomatik yükləmə üçün PagingDataAdapter təqdim edir. Kitabxana Offset, Cursor və Keyset paginasiyasını fərdi PagingSource vasitəsilə dəstəkləyir.

Sonsuz skroll nədir və paginasiyadan nə ilə fərqlənir?

Sonsuz skroll — siyahının sonuna yaxınlaşdıqda yeni məlumat hissəsinin avtomatik yükləndiyi UI nümunəsidir. Paginasiya — məlumatların hissə-hissə yüklənməsi mexanizmidir, sonsuz skroll isə onun göstərilmə üsullarından biridir. Alternativ “Daha çox yüklä” düyməsidir.

Nəticə

  • Paginasiya — hər hansı siyahıları olan mobil tətbiqlər üçün zəruri olan məlumatların hissə-hissə yüklənməsi texnikası.
  • Offset paginasiyası tətbiqdə sadədir, lakin əlavələr zamanı uyğunsuzluq və böyük OFFSET-lərdə performans azalmasından əziyyət çəkir.
  • Cursor paginasiyası naviqasiya üçün unikal identifikatordan istifadə edir — istənilən həcmdə sabit və səmərəlidir.
  • Keyset paginasiyası əsas açar üzrə filtrləyir, indekslərdən istifadə etməklə maksimum performans təmin edir.
  • Time-based paginasiyası qeydləri zaman damğalarına görə qruplaşdırır — xronoloji lentlər və sosial şəbəkələr üçün idealdır.
  • Metod seçimi məlumatların xarakterindən asılıdır: dinamik üçün — Cursor/Keyset, statik üçün — Offset, lentlər üçün — Time-based.
  • Paging 3 Android-də və iOS/vebdə standart cursor həlləri istənilən paginasiya növü üçün hazır infrastruktur təqdim edir.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun