Pagination Tasarımı: Sayfalama Ne Zaman İşe Yarar
Sayfalama, uzun bir listeyi bölmenin en bilinen yolu. En iyi yolu olduğu ise duruma bağlı: ürün kataloğunda işe yarar, bir yazıyı üç parçaya kesmekte çoğunlukla yaramaz. Aradaki farkı belirleyen şey tasarım zevki değil, kullanıcının o listeyle ne yapmaya çalıştığı ve listenin arkasındaki sorgunun neye mal olduğu.
Sayfalamanın gerçekten çözdüğü şey
Gerekçe genelde üç başlıkta toplanır: gezinme kolaylığı, performans, SEO. Üçü de doğru olabilir ama üçü aynı anda ve her listede doğru değil.
En sağlamı gezinme tarafı. Kullanıcı listede bir yeri arıyorsa, üçüncü sayfadaydı diye hatırlayabildiği bir çıpa işine yarar. Sonsuz kaydırmada böyle bir çıpa yok; geri dönen kullanıcı listenin başına düşer ve aynı yolu tekrar kaydırır. Performans gerekçesi ise koşullu: sayfa başına 20 kayıt çekmek 2000 kayıt çekmekten ucuzdur, doğru. Ama bu ucuzluk ilk sayfalarda geçerli, aşağıda anlatacağım nedenle sayfa numarası büyüdükçe eriyor.
Bir de kimsenin gerekçe diye saymadığı ama pratikte en çok işe yarayan taraf var: sayfalanmış bir liste paylaşılabilir. Kullanıcı bir bağlantı gönderdiğinde karşı taraf aynı ekranı görür.
Derin sayfalar sandığınızdan pahalı
Klasik kurulum LIMIT 20 OFFSET 10000 biçiminde çalışır. Veritabanı bu sorgu için 10.020 satır üretir, ilk 10.000'ini atar, kalan 20'sini döner. Yani 500. sayfa 1. sayfadan pahalıdır ve maliyet sayfa numarasıyla birlikte doğrusal büyür. Kullanıcı oraya kadar gitmez diye rahatlamayın, tarayıcı botları gider.
Alternatifi anahtar tabanlı ilerleme: son görülen kaydın sıralama anahtarını taşıyıp WHERE (tarih, id) < (:son_tarih, :son_id) ile devam etmek. Burada index doğrudan kullanılır, atılan satır yoktur, 500. sayfa da 1. sayfa kadar ucuzdur. Şartı şu: sıralama anahtarı benzersiz olmalı. Sadece tarihe göre sıralarsanız aynı saniyeye düşen kayıtlar arasında satır atlanır ya da iki kez görünür; tarihe ikinci anahtar olarak id eklemek bu deliği kapatır.
Bedeli de açık: anahtar tabanlı ilerlemede 37. sayfaya git diyemezsiniz, çünkü 37. sayfanın nerede başladığını ancak oraya kadar yürüyerek bilirsiniz. Bu yüzden ikisi rakip değil, farklı iş için: numaralı sayfa filtrelenip taranan kataloglarda, imleçli ilerleme akışlarda ve API'lerde.
Yönetim panelindeki bir tabloyu OFFSET ile kurup öyle bırakırım, orada sayfa sayısı da trafik de sınırlı. Dışarıya açık ve botların gezdiği bir listede aynısını yapmam.
Kontroller kullanıcıya konumunu söylemeli
İyi bir sayfalama çubuğunda dört bilgi var: neredeyim, kaç sayfa var, bir ileri ve bir geri nerede, sona nasıl giderim. Tüm sayfa numaralarını dizmek gerekmez; bulunduğunuz noktanın etrafında beş yedi numara ile ilk ve son yeterli.
Toplam sayı meselesi ayrı bir tuzak. 412 sonuç bulundu yazmak için tam bir COUNT çalıştırmanız gerekir ve bu sorgu, listeyi çeken sorgudan pahalı olabilir. Milyonlarca satırlı tablolarda tam sayıyı göstermeyi bırakıp yaklaşık değer vermek ya da sadece bir sonraki sayfanın var olup olmadığını kontrol etmek (istediğinizden bir fazla satır çekip fazlasını atarak) hem ucuz hem yeterli.
Küçük ama sürekli görülen hatalar: aktif sayfanın diğerlerinden ayırt edilmemesi, dokunma hedeflerinin yan yana sıkışması, ilk sayfadayken geri düğmesinin tıklanabilir görünmesi.
SEO tarafında ne değişti
Sayfalamayı SEO için yaptığınızı düşünüyorsanız, bu gerekçe eskisi kadar sağlam değil. Google 2019'da rel=next ve rel=prev işaretlemelerini indeksleme sinyali olarak kullanmadığını, üstelik bunu yıllardır yapmadığını açıkladı. Kalan iş çok daha sıradan: sayfalar arası geçiş normal bağlantı etiketiyle verilmeli. Sadece JavaScript ile yüklenen ikinci sayfanın taranacağının garantisi yok.
Bir de yaygın bir kanonik hatası var: ikinci, üçüncü sayfaların kanonik adresini birinci sayfaya vermek. Bu sayfalar birbirinin kopyası değil, her biri kendi kanoniğidir. Birinciye toplarsanız derindeki içeriğin indekslenme ihtimalini kendi elinizle düşürürsünüz.
Sonsuz kaydırma nerede yerini alır
Kaydırma keşif için, sayfa arama için. Kullanıcı belirli bir şeyi arıyorsa konumunu koruyan bir yapıya ihtiyacı var; hedefi olmadan geziniyorsa kesintisiz akış daha iyi çalışır. Sonsuz kaydırmanın iki bilinen bedeli de burada: alt bilgiye ulaşamamak ve geri dönünce yeri kaybetmek.
Arada iyi bir orta yol var: daha fazla göster düğmesi. Kullanıcı akışı kendi kontrol eder, footer erişilebilir kalır, her yüklemede adres çubuğundaki sayfa parametresini güncellerseniz paylaşılabilirlik ve tarayıcı geçmişi de bozulmaz.