Basit bir örnek vereyim. Hayali olarak bir market düşünelim. Market sahibi ürünleri yiyecek içecek temizlik malzemesi... gibi üst kategorilere (table 1) ayırıyor. Sonra içecekler için soğuk içecek sıcak içecek gibi alt kategoriler (table 2) oluşturuyor. Bu şekilde alt alta 2 kategori yeterli oluyor bu durumda. Fakat öyle ürünler var ki altalta 100 kategori içinde olabiliyor. Yani bir ağaç yapısı oluşturur gibi kullanıcının istediği sayıda kategori oluşturmasını sağlamak için veritabanındaki tablo yapısı nasıl olabilir?

soruldu: 24 Oca '13, 09:02

numankaraaslan's gravatar image

numankaraaslan
1.8k253749
cevap kabul oranı: 19%


Ağaç yapısı uygun olur... Kendi yaptığım bir örnekte ağaç yapısı aşağıdaki gibi

CATEGORIESTREE
----------------
id            // primary key
Text          // kategori adı
Description   // açıklama
ParentId      // ust kategori id (foreign key)
State         // menu yaparken acık ve ya kapalı olmasını isteyebilirsiniz
Attributes    // herhangibir özelligi var mı (yine menu yapımında cok faydalı)
Checked       // ilerde secilebilir dalları olmasını istiyorsanız bu alanı kullanabilirsiniz
Deep          // derinlik .arama, ekleme, cıkarma, guncelleme işlemlerinde kolaylık ve performans. 
ImageUrl      // kategori resmi
NodePath      // yine performans acısından ust kategorilerden gecerken kayıt edilen id ler
NodePathText  // ust kategori adları, Özellikle site haritası yapımında cok yararı olur. Ürünün hangi kategorilerde oldugunu hiyerarşik bir şekilde gostermenizi saglar...

Örnek veri

Id|       Text | Description | ParentId | State | Attributes | Checked | Deep | ImageUrl | NodePath | NodePathText  
-------------------------------------------------------------------------------------------------------------------------
1 | Bilgisayar |    Acıklama |        0 |  open |  attribute | checked |    1 |    image |        0 | Bilgisayar
2 | Masaustu   |    Acıklama |        1 |  open |  attribute | checked |    2 |    image |      1,2 | Bilgisayar/Masaustu
3 | Asus       |    Acıklama |        2 |  open |  attribute | checked |    3 |    image |    1,2,3 | Bilgisayar/Masaustu/Asus
....
permanent link

cevaplandı: 24 Oca '13, 09:10

AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

AliRıza Adıyahşi ♦
7.9k146288
cevap kabul oranı: 44%

değiştirildi: 25 Oca '13, 06:27

Yani tek tabloda primary key olan id "ParentId" sütunundaki değerin foreign key i oluyor gibi doğru mu anladım?

(24 Oca '13, 09:13) numankaraaslan numankaraaslan's gravatar image
2

Alt kategorinin parentId si ust kategorinin id si oluyor. Tablo kendisini referans ediyor.

(24 Oca '13, 09:23) AliRıza Adıyahşi ♦ AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

Ben yaptığım bi menü sisteminde 1.0.2.0 şeklinde kodlamayla yapmıştım. Bu sayede kaçıncı alt kategori, neyin alt kategorisi, ana kategorisi ne ? vs nesneleri rahatlıkla bulabilirsiniz.

mesela

 Anasayfa Ürünler İletişim
          Ürün1
          Ürün2

veritabanında

İsim           |  Kod
Anasayfa       |  0
Ürünler        |  1
Ürün1          |  1.0
Ürün2          |  1.1
İletişim       |  2
permanent link

cevaplandı: 25 Oca '13, 08:39

creseos's gravatar image

creseos
2.0k468187
cevap kabul oranı: 37%

 no |  kategori_adi  | ust_no
------------------------------
  1 |  Elektronik    |  0
  2 |  Televizyon    |  1
  3 |  LCD           |  2
  4 |  LCD 106 Ekran |  3
  5 |  LCD 37 Ekran  |  3
  4 |  Plazma        |  2
  5 |  Mobilya       |  0
  6 |  Koltuk        |  5
  7 |  Vitrin        |  5
  8 |  Masa          |  5
  9 |  Sehpa         |  5

-------------------------------
Çıktı şu şekilde olacaktır:

   Elektronik                |   Mobilya
      Televizyon             |      Koltuk
         LCD                 |      Vitrin
            LCD 106 Ekran    |      Masa
            LCD 37 Ekran     |      Sehpa
         Plazma              |

0 olanlar Ana Kategoridir.
Ürünün kendi no'su (no=1), altına gelecek kategori varsa o ürünün üst_no'su (ust_no=1) olur.
permanent link

cevaplandı: 24 Oca '13, 10:45

Kerim%20%C3%96lmez's gravatar image

Kerim Ölmez
465
cevap kabul oranı: 0%

permanent link

cevaplandı: 25 Oca '13, 16:23

lastarabos's gravatar image

lastarabos
1.8k122742
cevap kabul oranı: 29%

Ağaç yapısına alternatif getireceğim.

Veritabanında özyinelemeli sorgulara ya da özyinelemeli mantık kullanılmazsa sınırlı sayıda derinliğe sebebiyet verdiği için okumanın çok, yazmanın az olacağı durumlarda kategoriler için sadece üst kategorinin değerinin tutulduğu bir ağaç yapısından daha fazlasına ihtiyaç olduğunu düşünüyorum.

İç içe kümeler (nested set), her ne kadar yazması yavaş da olsa okuması tek bir düz sorguda gerçekleştiğinden pek çok zaman tercih ettiğim bir veri yapısı.

Bu veri yapısında kategorilerin sınırları başlangıç ve bitiş sayısıyla belirlenir.

Örnek veri kümesi:

[
  ['Üniversite', 0, 100],
  ['Fen Bilimleri Enstitüsü', 1, 49],
  ['Bilgisayar Mühendisliği Yüksek Lisans', 2, 24],
  ['Bilgisayar Mühendisliği Yüksek Lisans Tezli', 3, 12],
  ['Bilgisayar Mühendisliği Yüksek Lisans Tezsiz', 13, 23],
  ['Lisans', 50, 99],
  ['Bilgisayar Mühendisliği', 51, 98]
]

Burada enstitü altındaki tüm birimleri sorgulamak için tek yapmanız gereken şey, aralığı 1, 49 arasında kalan kayıtları çekmek. Lisans birimlerini listelemek içinse 50-99 arasında kalan kayıtları çekmek yeterli. Tabii derinlik değeri de olması lâzım, kolay anlaşılması için derinliği es geçtim.

Veriyapısının baris eksisi ise yeni kayıt girileceği zaman aralıkların yeni elemanı içerecek şekilde genişletilmesi gerekmesi. Yani ağaçta yeni kayıt eklemesi tek işlemden ibaret iken bu veriyapısında eklemenin yanısıra pek çok da güncelleme gerekebiliyor.

permanent link

cevaplandı: 17 Şub '13, 00:45

nurettin's gravatar image

nurettin
2.2k2441
cevap kabul oranı: 14%

değiştirildi: 17 Şub '13, 00:53

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×66

Soruldu: 24 Oca '13, 09:02

Görüntüleme: 2,704 kez

Son güncelleme: 17 Şub '13, 00:53

powered by BitNami OSQA