Proje: Okul Database · Hub: Okul Database — Tables

school_filters — Denormalize Cache Tablosu

Data scientist için birincil analiz tablosu. ~100 kolon, join gerektirmez.


Neden Var?

schools tablosu normalize edilmiş — 20+ tabloya FK. Arama ve browse sorguları için çok yavaş. school_filters tüm metadata’yı async olarak önceden hesaplayıp tutar. API, okul verisi değiştiğinde bu tabloyu günceller.

Önemli: school_filters ile schools arasında kısa bir async güncelleme lag’ı olabilir (saniyeler). Finansal kesinlik gereken sorgularda doğrudan kaynak tabloya bak.


Kolon Grupları

Kimlik & İlişkiler

KolonTipAçıklama
idbigIncrementsPK
school_idunsignedIntschools.id (UNIQUE)
school_type_idintschools_types.id
sector_idintsectors.id
college_idint nullablecolleges.id
customer_idint nullablecustomers.id
campus_idint nullablecampuses.id

Kimlik & Adres (Denormalize)

KolonTipAçıklama
namevarcharOkul adı (schools.name kopyası)
slugvarcharURL slug
city_idintlocations.id (il)
county_idintlocations.id (ilçe)
city_namevarcharİl adı (join gerekmez)
county_namevarcharİlçe adı (join gerekmez)
sector_namevarcharSektör adı (join gerekmez)
school_type_namevarcharOkul tipi adı (join gerekmez)

Ürün & Müşteri Durumu

KolonTipAçıklama
is_customertinyInt1 = B2B müşteri, 0 = müşteri değil
product_idint nullableAktif ürün ID
product_price_idint nullableAktif fiyat planı ID
product_namevarchar nullableAktif ürün adı (denormalize)
agreement_end_datedate nullableSözleşme bitiş tarihi

Engagement Metrikleri

KolonTipAçıklama
lead_countintToplam lead (tüm zamanlar)
comment_countintOnaylanmış yorum sayısı
view_countintProfil sayfa görüntüleme
phone_view_countintTelefon numarası tıklama
monthly_lead_countintSon 30 gündeki lead

Profil Kalite Puanları (Py Sistemi)

KolonTipAçıklama
py_profile_pointintToplam profil tamamlanma puanı
py_about_qualitytinyIntHakkında bölümü kalite skoru
py_gallery_qualitytinyIntGaleri kalite skoru
py_fee_qualitytinyIntÜcret bilgisi doluluğu
py_contact_qualitytinyIntİletişim bilgisi doluluğu

Ücret Bilgileri

KolonTipAçıklama
fee_mindecimalEn düşük yıllık ücret (TL)
fee_maxdecimalEn yüksek yıllık ücret (TL)
scholarship_availabletinyInt1 = burs imkânı var
discount_availabletinyInt1 = indirim var

Filtre Bayrakları

KolonTipDeğerlerAçıklama
is_boardingtinyInt0/1Yatılı okul mu
is_foreigntinyInt0/1Yabancı uyruklu okul mu
has_kindergartentinyInt0/1Bünyesinde anaokul var mı
is_activetinyInt0/1Aktif mi
is_deletedtinyInt0/1Silinmiş mi (schools.deleted_at senkronik)

School Annoucement & Badges

KolonTipAçıklama
has_most_commented_badgetinyIntİlçede en çok yorum badge
has_most_contacted_badgetinyIntİlçede en çok lead badge
has_most_viewed_badgetinyIntİlçede en çok görüntülenen badge

Kritik Composite Index

-- En önemli index (sırayı WHERE'de koru)
INDEX (sector_id, is_customer, deleted_at, school_id)

Bu index sector_id → is_customer → deleted_at sırasıyla çalışır. WHERE koşullarında bu sırayı koru.


Örnek Sorgular

-- Özel okul müşteri dağılımı, şehir bazlı
SELECT city_name, COUNT(*) as okul_sayisi,
       AVG(lead_count) as ort_lead,
       AVG(py_profile_point) as ort_profil_puani
FROM school_filters
WHERE sector_id = 2        -- Özel
  AND is_customer = 1
  AND deleted_at IS NULL
GROUP BY city_id, city_name
ORDER BY okul_sayisi DESC;
 
-- Profil kalitesi düşük aktif müşteriler
SELECT school_id, name, city_name, py_profile_point, lead_count
FROM school_filters
WHERE is_customer = 1
  AND deleted_at IS NULL
  AND py_profile_point < 50
ORDER BY lead_count DESC;
 
-- Ücret aralığı analizi, okul tipi bazlı
SELECT school_type_name,
       COUNT(*) as n,
       AVG(fee_min) as ort_min_ucret,
       AVG(fee_max) as ort_max_ucret,
       MIN(fee_min) as en_ucuz,
       MAX(fee_max) as en_pahali
FROM school_filters
WHERE deleted_at IS NULL
  AND fee_min > 0
GROUP BY school_type_id, school_type_name;