[]

SQL sorusu

Direk maruzatima geciyorum. Simdi cok basit bir tablom var kullaniciNumarasi, Ismi ve bi takim seyler tutuyor diyelim. Facebook gibi dusunebiliriz ama kimin kimle arkadas oldugunu tutan bir tablo yok. Sonra bana bir kullanici icin text formatinda(daha dogrusu database'den bagimsiz) arkadaslarinin listesi geliyor. Eger adamin 1000 tane arkadasi varsa ben bu arkadaslarinin bilgisini WHERE kisminda OR ile yazarsam query cigrindan cikar.

Bu asamada en randimanli nasil yapilir konusunda onerilere acigim.

Tablolarda degisiklik yapabilirim ve arkadas bilgisi tutabilirim ama o zamanda database sanki cigrindan cikar gibi geliyor. Zira facebook application'i olacak ve ortalama 300 arkadasi olsa bir kimsenin kabaca bir hesapla 1000 kullanicida 300000lik bir tablom olur. arkadas1->arkadas2 seklinde. Gerci tablo 2 kolonlu ve super indexlemeye uygun tabii.

Bir alternatifde acaba kullanici bilgisi tablosuna bi text alani acip oraya arkadaslarinin kullaniciNumaralarini yanyana yazdirip sonra metin aramasi mi yapsam dedim. Bu son oneri cok bodozlama ve database mantigina direk aykiri onun farkindayim.

Query'nin WHERE kisminda facebook'da tutulmayan bazi bilgiler koyacagim kendi tablomda olmasi lazim bu islerin.

saygilar

edit: En kolay soyle aciklim. Facebook kullanici tablosunda 2 kolon daha tutmam lazim. Bunlar diyelim adamin boyu ve kilosu. Adam application'a girdiginde ben adamin arkadas listesini facebook'dan alabiliyorum kendi database'ime bi is yaptirmam gerekmiyor ama boy ve kilo bilgisi benim tablomda tutuluyor facebook'da tutamayacagim icin.(aslinda bole onlarin bi arada data API olayi vardi noldu bilmiyorum)

Benim tablomda sadece kullanicinin facebookId'si boyu ve kilosu tutuluyor suanda diyelim.

 
Şimdi kullanıcı tablo listeni düşün. id, kullanici_adi, sifre, adsoyad, email, kolonları olsun. id auto verilsin. Şimdi diyelimki benim id'im 396. Senin id'in ise 521 olsun. judagor mesela 666 olsun. :P

İkinci tablomuz arkadaslar. Onda şu alanlar olsun. userid, arkadasid. Şimdi ben seni arkadaş listeme eklediğim zaman arkadas tablosunda userid kısmına benim id'im olan 396, arkadasid kısmına ise senin id'in 521 gelsin. Judagor'u eklersem 666 yazsın.

arkadas tablosu
----------------
userid arkadasid
-------- -----------
396 521
396 666

şeklinde.
  • pichoscosama2  (01.10.09 00:16:27) 
pichoscosama2
ortalama 300 arkadasli bir ortamda 1000 kullanicida 300000lik bi tablo olacak ki 1000 kullanici oldukca az bir deger. mysql'in randimani nasil olur diye dusunuyorum. Birde arkadas ekleme kismi facebook'da olacak, neyse bu ayri bi konu ama facebook ile ayni guncellikte tutmam gerekiyor bu listeyi.

  • badseed  (01.10.09 00:20:29) 
buradaki arkadas kişi eşleştirmesi tam bir one to many relation degil, onu gözden kacırmamak lazım. mesela kişi telefonlar eslesmesi olsa kişi id ile telefonları 2. tabloda one to many relation'la tutarsın. ama burada 2. tablo ile gelen verilerde aslında 1. tablonun parcası yani, pichoscosama2 nın verdigi ornekten gidersek, 396 521 kaydının yanında 521 396 diye de bir kayıt bulunması lazım eger bu sekilde bir relation kurulacaksa. bodoz text tuttugunu dusun (aman diyim) bu seferde gidip hem 1. kisinin arkadaslar verisinde 2. yi, hemde 2. nin arkadaslar verisine 1. yi girmiş oluyorsun. arkadaslık ilişkisi ikileniyor otomatik olarak o yuzden az biraz daha farklı bir relation mantıgı kurmak gerekli.

şu stackoverflow.com ve şu stackoverflow.com işini görebilir bilgi vermesi açısından.
  • 8 ortali harita metod defter  (01.10.09 00:36:30) 
aslına bakarsan [396 , 521] şeklinde tutmak yeterli iki kolonda çünkü biri arkadaşlığı bitirdigi zaman digeri de otomatikman bitirmiş oluyor , öyle bir durumda veriyi başka bir tabloya transfer edip bunlar eskiden arkadaşmış diye log da tutabilirsin ve arkadaş tablosundan silebilirsin.
(tabi bu aşamada diğer tabloya taşımak ardından silmek maliyetli bir işlem olabilir , onun yerine arkadaşlar tablosuna bir alan koyup statusunu güncelleyerek bunlar arkadaş degil olarak işaretleyebilirsin , sonrada system loadın düşük oldugu saatleri saptayarak o saate bir job koyarsın , batch olarak statusu silinmiş olarak işaretlenenleri silersin)

facebook idleri için bigint ideal gözüküyor ayrıca güzel de bi indexledigin zaman milyonlara kadar yolu var mysql'in pek ses edecegini sanmıyorum üzerinde çok kompleks sorgular yazmayacaksan , gayet iki tabloyu inner join ile efendi efendi birleştirip kullanabilirsin , hatta view bile kullanabilirsin.
Ama böyle bir durumda cross joinden kaçınmak iyi olabilir.

Özetle ben de mutlaka 2. bir tablonun gerekli olduğunu düşünenlerdenim , en azından normalizasyon kuralları da böyle diyor.

Son olarak bu insanların arkadaş listelerini sürekli güncelleyecegini düşünürsek sen de aynısını yapmalısın , bu durumda periyodik olarak ağır sorgular çalıştıracaksın bu tablolarda.
belki aynı dataları farklı bir tablo ile senkronize tutup , production tablosundan sadece select yapılmasını sağlayarak runtime için biraz zaman kazanabilirsin.
  • alwaysdrunk  (01.10.09 12:07:09 ~ 12:38:33) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.