|
10.02.2007 | 15:51
| #1
Bir alış-verişi yapmak istiyorum. Deneme amaçlı fakat ileriye hazırlık olsun diye. Kategorilendirme de takıldım. Hem de fena çuvalladım. Kategorileri veritabanında tutmayı düşünüyorum. Fakat aralarında nasıl ilişki kuracağımı bilmiyorum
Örneğin; bilgisayar -> Donanım -> Taşınabilirler -> Dizüstü bilgisayarlar -> HP modelleri -> Pavilion serisi -> DV6103EU Gördüğünüz gibi kategoriler oldukça içiçe Veritabanında buna nasıl bir çare bulunabilir? Yoksa Array'lar ile mi yapılsa iyi olur? Lütfen kafayı yemeden önce bu konuda fikirlerinizi paylaşınız
|
|
| Alıntı yap |
|
10.02.2007 | 16:24
| #2
Kategoriler tablonuzda kategorinin "ana" kategorisini tutan bir alan tanımlayabilirsiniz. Tabii ki bu alan o kategorinin "numarasını" tutmalıdır.
Örnek olarak bir tablo şu şekilde olabilir: id: kategoriye otomatik verilen numara isim: kategorinin ismi ana_id: kategorinin ana kategorisi (eğer 0 ise kendisi bir ana kategoridir) örnek veri: Kod:
id isim ana_id
1 bilgisayar 0
2 elektronik 0
3 donanım 1
4 yazılım 1
5 antivirüs 4
Ruby On Rails ile nasıl yapıldığına dair bir döküman hazırlamıştım. Mantık olarak aynı yapı diğer dillere de eklenebilir. Yazdırmak için "rekürsif" bir fonksiyon oluşturabilirsiniz. |
|
|
__________________
muarifer » ruby, rails, postgresql, yazılım geliştirimi falan... |
|
| Alıntı yap |
|
10.02.2007 | 17:03
| #3
bu anlatılan zaten rekursif kategorilendirme... hiyerarşik (dallanan) sistemlerin dezavantajı, çok detaylı tanımlamalarda insanı usandıracak kadar derinlere gitmesi. bir ürün bulmak için 8 ara sayfa geçmek şart mı?
ben daha serbest tanımlanmış modellere ilgi duyuyorum. tagset sistemini kategori tanımlamak için kullanmak mümkün, ama tek başına o da yeterli kalmaz, ajax bazlı arama olursa anca güzel olur. izleyicinin rahat kullanacağı, sıkılmayacağı bir sistem için tanımlamayı abartmamak gerekir. o yüzden de hiyerarşik bir sistem kullanılacaksa, 2-3 ürün için yeni kategoriler açmaktan kaçınmak gerekir. not: rekursif sistem kullanılacaksa, aynı anda kullanacak kişi miktarı ile derinlik ve yatay genişlikler önemli bir rol oynuyor. sebebi de rekursif sistemlerin hafızadan öbek öbek ram yemesi; rekursiyona girildiğinde her derinlik için tüm değerler ayrı bir yerde tutulur, bir sonraki derinliğe inilir, yeni değerler orada da hafızaya atılır... ta ki son derinliğe gidilene kadar. ancak o noktadan sonra geriye dönüşte tüm bu ayrılan hafıza parçacıkları serbest bırakılır. böyle bir kodun 30-40 kişiye aynı anda hizmet vermesi sorun yaratmayabilir, ama aynı anda 300-500 kullanıcı varsa sistemde ve sunucunun hafızası da sınırlıysa, kısa sürede ssunucunun şişmesine, bununla paralel oalrak da kendisine gelen talepleri daha yavaş işlemesine sebep olur. |
|
| Alıntı yap |
|
11.02.2007 | 17:37
| #4
Arkadaşlar beni maruz görün. Daha önce bu konuda bir tecrübem olmadığı için söylediklerinizi anlamakta güçlük çekiyorum. Rekürsif yapıları biliyorum fakat bunları benim bahsettiğim kategori sistemine uygulamakta zorluk yaşıyorum.
Yukarıda yazdığım kategoriyi alttaki gibi soy ağacına dönüştürdüm. Konuyla iligi bir de makale buldum. http://www.sitepoint.com/article/hie...data-database/ adresinde makaleden ne yazık ki bir sonuç çıkaramadım. Öğrendiğim tek şey Rekürsif fonksiyonların yavaşlığı oldu. Makalede Rekürsif yapıların kullanılmaması gerektiği söyleniyor. |
|
| Alıntı yap |
|
11.02.2007 | 17:58
| #5
İlk mesajımda belirttiğim gibi bir yapı kurabilirsiniz. Biraz daha açıklayıcı olmak gerekir ise;
Kategorilerin hepsinin bir üst kategorisi olabileceğini düşünerek işlem yapacağız. Her kategorinin bir üst kategorisini bilmek en baştaki kategoriyi bulana kadar bize yardımcı olacaktır. Çünkü 5 nolu kategori 4 ün alt kategorisi ise 4 de 3 ün ise.. gibi. Bunu bulana kadar bahsettiğiniz gibi "rekürsif" fonksiyon kullanabiliriz. (yavaş olduğu doğrudur.) Sizin verdiğiniz örneği tabloya çevirirsek bilgisayar(1), Müzik(2), Oyuncak(3) Ana Kategori (0) Donanım(4), Yazılım(5) => bilgisayarın Alt Kategorileri (1) Dizüstü(6) => bilgisayar/Donanımın Alt Kategorisi (4) Dizüstü 4 numaralı kategoriye ait (Donanım), Donanım ise 1 numaralı kategoriye ait (bilgisayar) bilgisayar ise ana kategori (0'a ait) Örneğin bir fonksiyon düşünün; verilen kategori numarasındaki kayıtı bulup "ana_id" değeri 0 olana kadar kendi kendini çalıştırsın. Kod:
def kategori_yaz(kat) # kayıtı bul # kaydın "ana_id" değeri 0 dan farklı ise # bu fonksiyonu değer olarak "ana_id" şeklinde yeniden çalıştır # kategori_yaz(ana_id) gibi. end gibi. |
|
|
__________________
muarifer » ruby, rails, postgresql, yazılım geliştirimi falan... |
|
| Alıntı yap |
|
11.02.2007 | 18:08
| #6
bilgisayar 1
Cep Telefonu 2 Beyaz Eşya 3 Dizüstü bilgisayar 1.1 Nokia 2.1 Hp Laptop 1.1.1 Hp Pavillion 1.1.1.3 Daha sonra "." lar split ile yakalanıp bişeyler yapılabilir. |
|
| Alıntı yap |
|
11.02.2007 | 18:22
| #7
|
|
|
__________________
muarifer » ruby, rails, postgresql, yazılım geliştirimi falan... |
|
| Alıntı yap |
|
11.02.2007 | 18:34
| #8
@Muafier
Öncelikle ilgilendiğin için teşekkürler. Biraz bişi anladım ![]() - Yalnız senin dediğin yapı ileride sorun çıkarır mı? - Ben kategorilerde istediğim gibi değişiklik yapabilir miyim? - İstediğim an, istediğim bir kategoriyi başka bir kategoriye bağlayabilir miym? - Bu işlemleri yaptığımda ağaç (tree)'ın yapısı bozulmaz mı? Bir de http://www.sitepoint.com/print/hiera...-data-database adresindeki makale için ne düşünüyorsun? Örneğin adam Modified Preorder Tree Traversal isimli bir yöntem kullanmış. Rekürsif yöntemine göre daha esnek ve hızlı olduğunu söylüyor. Fakat bahsettiği yapıyı çözemedim. Adam ağaca sağlı-sollu numaralar veriyor. Fakat bunu nasıl yapıyor anlamadım
|
|
| Alıntı yap |
|
11.02.2007 | 18:57
| #9
Dediğim olay sorun çıkarmaz. Örneğin Donanım kategorisi bilgisayara bağlı ise (yani 1'e bağlı ise) Donanımı alıp bilgisayardan çıkartmak için sadece ana_id'sini değiştireceğiz. Örneğin 0 yaparsak kendisi bir ana kategori olacaktır. Dikkat ederseniz donanımın alt kategorilerine hiçbir işlem yapmadık, çünkü alt kategoriler "donanımın" "id" alanına göreydi. Ne ismiyle ne ana kategorisiyle işimiz yoktu.
Yani; bir kategoriyi başka bir kategoriye bağlamak için sadece "ana_id" değerine bağlamak istediğiniz kategoriyi yazmanız yeterli olacaktır (Eğer ana kategori olacak ise 0 yazılacak.) Verdiğiniz bağlantıdaki olaya göz ucuyla baktım sanırım sağlı sollu değer vererek aradaki değerlere sahip kayıtları almış. Yani örneğin id'de 1 ile 18 arasında bilgisayar ürünlerini, 2 ile 4 arası bilgisayarın donanım kategorileri gibi. Bunları da SQL deki BETWEEN komutu ile alıyor. Yani tüm bilgisayar kategorilerini bulmak için 1 ile 18 diyor (1 ile 18'i left ve right sütunlarından buluyor) Yeni kayıt eklenince tabii bu değerleri de genişletmek gerekiyor. Bence daha zahmetli bir yol. Oldukça fazla kategori altında örneğin 1000 tane alt kategori olunca yeni bir kategoriyi araya eklemek için 900 tane kaydı güncellemek gerekecek vs. Özetlemek Gerekirse: - Bir kategoride sadece bir üst kategorinin değeri tutulduğu için üst kategoriyi alıp bir yere taşıdığımız zaman alt kategoriler için herhangi bir işlem yapmamız gerekmeyecek. - Kategori ismi değiştiği zaman herhangi bir sorun çıkarmayacak (Çünkü bizim işimiz otomatik olarak verilen numarayla) - İstediğimiz an bir kategoriyi tüm alt kategorileriyle birlikte başka bir kategoriye aktarmak için yapacağımız tek şey "ana_id" alanının güncellemek olacak - Üstelik bunlar ağaç yapısına hiçbir zarar vermeyecek. |
|
|
__________________
muarifer » ruby, rails, postgresql, yazılım geliştirimi falan... |
|
| Alıntı yap |
|
11.02.2007 | 21:25
| #10
Recursive yapı kullanıp SQL Caching (Global değişken olarak tüm datayı application da tutarak.) kullanılarakta yapılabilir.
|
|
| Alıntı yap |
Zoque'a hoşgeldiniz!