Yorum Cevaplandırma
Merhaba arkadaşlar.
Bir makalemiz var.
Ona yorum yapılıyor. Ama yorum sisteminde kişiler, bir yorum altında bir birine cevap verebiliyor.
Aşağıdaki resimde olduğu gibi.
Şimdi bunu yapabilmem için şunlar olması gerekiyor.
makaleler tablosu
makale_id | makale_icerik
uyeler tablosu
uye_id | uye_adi
yorumlar tablosu
yorum_id | makale_id | uye_id | yorum_icerik
Şimdi takıldığım nokta şu.
Bir yorum altında kişileri nasıl birbirine cevap verdirebilirim.
Tablo yapısı nasıl olmalı?
Tamamen örnek bir senaryo üzerinden yazıyorum:
1) yorum_id | makale_id | uye_id | yorum_icerik | ust_yorum_id
diye bir sütun daha eklenebilir.
Ahmet bir yorum yazdı. yorum_id=1, ust_yorum_id=null
Mehmet, Ahmet'e cevap yazdı. yorum_id=2, ust_yorum_id=1
Ahmet, Mehmet'e cevap yazdı. yorum_id=3, ust_yorum_id=2
Hüseyin de Mehmet'e cevap yazdı. yorum_id=4, ust_yorum_id=2
Mehmet, Hüseyin'e cevap yazdı. yorum_id=5, ust_yorum_id=4
2) Sayfaya sadece makale basılır ve makale en hızlı şekilde kullanıcıya iletilir.
Sayfa yüklendikten sonra yorumları almak için sunucuya makale_id ile birlikte GET isteği atılır.
Not: Yorumlar sayfaya direkt PHP ile basılmaz.
Kullanıcı bu makaleyi görüntülemek istediğinde asıl amacı makaleyi görmektir.
Makale kullanıcıya en hızlı şekilde gösterilmelidir.
O yüzden yorumların da veritabanından çekilmesi, hizaya sokulması vs. ek işlemler için kullanıcı bekletilmez.
Not: Mümkünse yorumlar, sayfa yüklendikten sonra hemen istenmez.
Kullanıcı belki de makalede yorumları okuyacak kadar kalmayacak.
Sunucuya ne kadar az yük bindirirsek o kadar rahat ederiz.
O yüzden, kullanıcı scroll yapıp makalenin sonuna gelip yorumların bulunacağı kısma yaklaşırsa o zaman yorumlar için istek atılır.
Böylece belki sadece 3-5 cümle okuyup sayfadan çıkacak kullanıcılar için gereksiz yere veritabanına iş bindirmemiş oluruz.
Not: Sayfanın kendisi bile php olmamalıdır.
Makale metni oluşturulduktan sonra bir html dosyası olarak kaydedilmelidir.
Kullanıcılar bu makaleyi görüntülemek istediğinde makale verisi her istek atan kullanıcı için veritabanından sorgulanmamalıdır.
Makale bir kez html dosyası olarak kaydedilip (cache'lenip) kullanıcılara doğrudan bu html dosyası iletilmelidir.
3) Sunucu, yorumları makale_id ile veritabanından çektikten sonra yorumlar üzerinde -güvenlik tedbirleri hariç- ek bir işlem yapmadan front-end'e json formatında iletir.
Not: Bu yorumların sıralanması, hiyerarşik olarak hangi yorumun hangi yoruma cevap olarak verildiği vs. gibi işlemler için sunucu yorulmamalıdır.
Bir işlemi sunucu tarafında yapmamız gerekiyorsa muhtemelen güvenlik gerekçesiyle olur. Ama yorumların sıralanması bir güvenlik sorunu değil.
Bu tür işlemleri kullanıcının tarayıcısına, yani kullanıcının bilgisayarının işlemcisine yıkarak sunucumuzu gereksiz iş yükünden koruruz.
4) Front-end'de JavaScript ile yorumlar belli bir hiyerarşi içinde organize edilir ve DOM'a basılır.
Son Not: Araya girdiğim bu notlar, sunucunun çok sayıda kullanıcıyı kaldırabilecek halde tutulması için. 3-5 kullanıcı için sunucu çok hızlı cevaplar verebilir ama 1000 kullanıcı aynı anda istek attığında her biri için veritabanını ayrı php'yi ayrı yorarsak kullanıcıların yanıt alma süresi çok uzar. Kullanıcılar belki hemen görebileceği bir makaleyi -iş sırasına alındığı için- 3-5 saniye beklemek zorunda kalırlar. Ama sayfa html olarak hazırda tutuluyorsa kullanıcılar istek atınca sunucu sadece html dosyasını iletip sıradaki işleme geçebilir. Ayrıca veritabanıyla iletişim minimumda tutulursa güvenlik açığı riski de azaltılmış olur.
Güvenlik demişken tabi bu aşamalarda bazı güvenlik adımları da araya sokulmalı. Çünkü kullanıcıdan alınan bir input'un ekrana basılması güvenlik açısından titiz davranılması gereken bir konu.