Tecrübeli Algoritma Ustalarına Bir Soru
-
Yaklaşık 250 tablo bulunan relation bir DB düşünün,
Örnek senaryo:
2015 Yılı, -YIL
O yılda ki futbol takımları, -TAKIMLAR
Futbol takımlarından herbirinin oyuncuları, -OYUNCULAR
Oyuncularının önceden oynadıkları takımlar, -ESKİTAKIM
Yukarıda yer alan her satır ayrı birer tabloya karşılık geliyor.
Bunlar yukarıdan aşağıya bağlantılı şekilde tutulmakta.
Bir servis yazıyoruz,
Adamın oynadığı eski takımlardan birini -yani en son tablodan- veri silmek veya güncellemek istiyoruz.
Servis kısmını düşünelim. Bu verilerin hepsi ekranda bağlantılı butonlara tıklayarak gösteriliyor.
Ekrandan bir veri silme veya güncelleme için gönderildiğinde 2 ihtimal var gibi görünüyor.
Ya her tablo için CRUD metodları yazılacak,
Yada tek bir metota gelen parametrele göre, tablodan tabloya erişim sağlanacak.
Ayrı metotlar yazıldığında, ortada ki bir veriyi sildiğimizde, üstünde ki ve altında ki bağlı tabloları da ayrıyeten düşünmek gerekecek. Buda bağımsız ve çok metoda yol açıyor.
Tek bir metotdan en alta kadar tablolar ayarlanarak parent dan childa inildiğinde ise kocaman bir soru meydana geliyor.
Kısaca bağlı tablolar arasında, ne tür bir yöntem veya bir tasarım metodu, CRUD işlemini etkin hale getirebilir.
zeybekustasi tarafından 24/Tem/15 19:19 tarihinde düzenlenmiştir -
tam anlamamakla beraber sorduğun şey mysql join olabilir mi hocam
-
nurulmac11 bunu yazdı
tam anlamamakla beraber sorduğun şey mysql join olabilir mi hocam
Db önemli ise Mssqgl kullanılıyor.
Konu join yapmak değil. İşlemleri ortak metottan mı yapmalı ayrı metotla mı yapmalı.
-
Hocam açık söyleyeyim soruyu tam anlayamadım anladığım şey şu. Bir birine bağlı tablolarda silme ve güncelleme yaptığınızda (tablolardan birinde) diğer tablolar nasıl otomatik olarak etkilenir bu mu?
Reletional database sistemlerinde foreign key yapısında ON UPDATE veya ON DELETE gibi kavramları var. Mesela referans alınan satır silindi, ON DELETE ile bağlı bulunan satırında silinmesini otomatik olarak RDBMS'e yaptırtabiliyorsun.
Soruyu daha iyi açıklarsan sevinirim. Zira şu an pek kafam algılayamıyor soruyu. 250 TAblo var bu tablolar biribiri ile ilişkili. Ne yapabiliyorsunuz, ne yapmak istiyorsunuz, ne yapamıyorsunuz tam anlayamadım k.surama bakma.
DrKill tarafından 24/Tem/15 23:51 tarihinde düzenlenmiştir -
yeni geldim eve sonra bakacağım soruna ama kısaca anladığım kadarıyla ilişkisel bir şeyler istiyorsun.. o yüzden nosql çözümleri sana gitmez..
onun haricinde join olayı çok fazla cost u olan bir fonksiyondur, o sebeple sorguyu düzgün yazmak önemlidir, ilk başta elde edeceğin tablo min. olmalı ondan sonra join işlemini yaptırmalısın.. iki tip sorgu planı var, mantıksal ve fiziksel, bunları gözönüne alarak cost hesaplaması yapman ve en az costu hangi tip veriyorsa onu kullanmak önemlidir.
diğer bir önemli faktörde indexing olayı.
neyse 3 tip join var ve bunların costlarına bak



tabi bu resimlerle pek anlaşılmıyor.. ancak burada tablolar var. istersen slaytları verebilirim sana.. kendin çözmeye çalışabilirsin en verimli şekilde ...
-
simdi bu oldukca fazla gordugum bir sey:
simdi bunlar yukaridan asagiya bagli demissin ama biraz tutarsiz geldi o.
onun disinda mesela diyorsun ki bir oyuncuyu silecegim o zaman onceden oynadiklari takimlari falan silsin?
- bunun icin player, team, year senin dictionary tablolarin. yani definition yapilmis gruplar.
- eski takim, bu yilki takim falan da senin fact grubun yani olusturulmus data.
- bunlari boyle dusunerek en mantiklisi foreign key verip delete on cascade yapmak.
* yani eger player table'indan biri silinirse tum bu yil ve eski yil takim oyuncunlarindan da otomatik silinir.
* sadece eski takim silinirse oyuncuya dokunmazsin.
- ha diyorsun bunlari yapma sansim yok o zaman ben genelde tek transaction acip kendi logic sirami olusturarak siliyorum. Basit bir ornek olarak verirsek:
transaction.begin(); transaction.deleteRow(DELETE_PRIV, new Object[]{userId}, dbOperationTimeout); transaction.deleteRow(DELETE_USER, new Object[]{userId}, dbOperationTimeout); transaction.end();ilk satirda user yetkileri silinmis. sonra da user'in kendisi siliniyor cunku buyuk ihtimalle yetkileri foreign key vermisler ve direkt user'i silemiyorsun. bu aslinda sakat bir yaklasim cunku tutup yetkileri sildin ama useri bir sekilde silemedi o zaman adam ortada kaliyor. bu gercek hayatta nasil olabilir? diyelim mi her user grubu kendi yarattigi userlari siliyor. sen eger priv silerken user yetkisini check etmeyip sadece user kisminda yaparsan bu durumu yasarsin.
ozet olarak alakali datalari cok iyi kontrol et acik cikmasin sonra. ama bence en temizi uygunsa yapiniz foreign key delete on cascade ver gitsin.
ayrica daha once 2-3 kere bu tablo yapisini kurdum. genelde benim tercihim season bazinda kadro olusturmak seklindeydi.
A takimi
B takimi
player1
player2
2014-2015
kadro: A takimi - 2014-2015 player1
A takimi - 2014-2015 player2
gibi kurunca hem takim kadrolari hem de oyuncunun gecmis takimlari sezonlari ile birlikte kullanmasi kolay oluyordu.
eger yanlis anlamadiysam derdin bu galiba. degilse detayli da pm'den sorabilirsin
-
Soru su aslinda buyuk bir proje var burada sorgular uzun, 5 tablo birbiriyle iliskili diyelim. 3. Tablodan bir verinin silinmesi ile 5. Tablodan veri silinmesi icin tek bir silme metodu kullaniliyor. Hani sen 3. Tablodan siliyon ama metot tek oldugu icin metodun icinde sorgunun 3. Tabloya ait oldugunu anlaman uzun satirlara if else lere yol aciyor. Merak ettigim nokta su baglantili tablolarin her birinde ekle sil yapilmasi icin tek bir metot mu yazmak lazim yoksa her tablodan veri silmek icin ayni metotlar mi yazmak lazim. Ekranin biri 5 tablo kullaniyor diyelim 5 ide ekranda listeleniyor 4. Tabloya ekleme yapilacaksa ortak olan ekle metodu kullaniliyor. Hani 4 e ekledigini icerde anliyosun. Oysa direk 4 e eklede diyebilirsin. Hangisi etkin konu bu. Umarim daha iyi aciklamisimdir.
zeybekustasi tarafından 24/Tem/15 23:10 tarihinde düzenlenmiştir
