

Dinamik Siralama Ve Efektif Sekilde Veritabanina Kaydetme
-
unbalanced bunu yazdı
tek güncelleme ile olmasi güzel hocam buradaki sikinti su olur. bir eleman listeden silindiginde onun indexini de db'de silinmesi gerek ya da yeni eleman eklendiginde onun da listeye eklenmesi gerek. Ancak yine de cözülür bir sey. Cünkü kolonun icindeki degerlerle ilgilenmeden direk tüm field'i güncelleyecegim icin id varmis yokmus önem arzetmiyor.
Mantikli bu cözüm sagol hocam :)
baska alternatifler var mi? Belki daha efektif yollar olabilir? :) Ve üstteki sistemin hangi olasi sorunlari olabilir?
Eğer DB deki girdilerin de bu array e göre update edilmesi gerekiyorsa;
"Levenshtein Distance": Bir string den başka bir string elde edebilmek için en az yapılacak değişimi ifade eder.
Levenshtein algoritmasını uyguladığında olan step lere göre index ler değiştirilebilir. Eğer son durumda boşluklar olursa db ye dummy girdiler eklenebilir (db ye dummy girdi eklenmesi ile diğer elemanların indexlerinin otomatik olarak değişmesi ile teker teker elemanların indexlerini değiştirmek arasında SQL seviyesinde bir performans farkı olur mu bilmiyorum. seçim senin)
-
Fatih54 bunu yazdıunbalanced bunu yazdı
tek güncelleme ile olmasi güzel hocam buradaki sikinti su olur. bir eleman listeden silindiginde onun indexini de db'de silinmesi gerek ya da yeni eleman eklendiginde onun da listeye eklenmesi gerek. Ancak yine de cözülür bir sey. Cünkü kolonun icindeki degerlerle ilgilenmeden direk tüm field'i güncelleyecegim icin id varmis yokmus önem arzetmiyor.
Mantikli bu cözüm sagol hocam :)
baska alternatifler var mi? Belki daha efektif yollar olabilir? :) Ve üstteki sistemin hangi olasi sorunlari olabilir?
Eğer DB deki girdilerin de bu array e göre update edilmesi gerekiyorsa;
"Levenshtein Distance": Bir string den başka bir string elde edebilmek için en az yapılacak değişimi ifade eder.
Levenshtein algoritmasını uyguladığında olan step lere göre index ler değiştirilebilir. Eğer son durumda boşluklar olursa db ye dummy girdiler eklenebilir (db ye dummy girdi eklenmesi ile diğer elemanların indexlerinin otomatik olarak değişmesi ile teker teker elemanların indexlerini değiştirmek arasında SQL seviyesinde bir performans farkı olur mu bilmiyorum. seçim senin)
hocam bu kadar neden karistirmaya gerek var yoksa ben mi kaciriyorum bir seyleri... Ben clienta listeyi yollayacagim + string seklinde siralamasini (1,2,3,4,5,6,7)
user bu listeyle oynasin ve güncelle butonuna bastiginda ben client tarafinda yeni siralamayi alacagim bakacagim ki 1,2,3,4,5,6,7 degil artik demek ki degismis.. O halde yeni siralamayi direk 1,2,3,4,5,6,7 nin oldugu field ile degisecegim.. Tablo söyle olacak. (iki tablo olacak)
1- tablo
Id Name CustomerId
1 Item1 1
2 Item2 1
2- tablo
Id CustomerId Order
1 1 1,2,3,4,5,6,7
eger customer1 siralamasini degistirdiye
update -> order='6,5,4,3' where customerID=1
gibi..
clientta göstermek istedigimde
select * from tablo1 where customerID = 1
ve ikinci sorgu
select order from tablo2 where customerId=1
daha sonra for döngüsüyle
var orders = tablo2Columnstr.split(',');
for(i=0; i< orders.length;i++)
yaz (tablo1Items[order[i]]);
bu sekilde bir sorun gözükmüyor
-
Normalde yaptığım yöntem;
table_positions diye bir tablo açıp, sıralama bittikten sonra o tabloyu komple temizleyip, tüm veriyi tekrar insert etmek.
Bendeki veri sıralaması 100'ler 1000'leri bulmadığı için pek de sorun olmuyordu.
Diğer önerim; tabloda ayrı ayrı pozisyonları row şeklinde tutmak yerine json formatında tek row'da saklayabilirsin. Sadece o row'u update edersin. mysql 5.7'de gelmişti sanırım json data tipi.
Yani veriyi array object şeklinde (id, pos) store edeceksin mysql'de. Bunun da en iyi yolu bildiğim kadarıyla json.
-
manyaki bunu yazdı
Normalde yaptığım yöntem;
table_positions diye bir tablo açıp, sıralama bittikten sonra o tabloyu komple temizleyip, tüm veriyi tekrar insert etmek.
Bendeki veri sıralaması 100'ler 1000'leri bulmadığı için pek de sorun olmuyordu.
Diğer önerim; tabloda ayrı ayrı pozisyonları row şeklinde tutmak yerine json formatında tek row'da saklayabilirsin. Sadece o row'u update edersin. mysql 5.7'de gelmişti sanırım json data tipi.
Yani veriyi array object şeklinde (id, pos) store edeceksin mysql'de. Bunun da en iyi yolu bildiğim kadarıyla json.
hocam her kullanicinin birden fazla listesi olacak ve her listede 100 e yakin eleman olacak. O yüzden ekle-sil mantikli degil.. Evet json sekilde tutacagim ama mysql degil de nosql'de yapacagim. Cünkü bir sürü verinin sürekli gidip gelmesi olacak (kullanicinin müsterileri vs de oradan veriyi cekecek). O yüzden nosql mantikli. Siralamalayi tek bir kolonda indexleri yanyana yazarak cözebilecegim gibi görünüyor. Tek bir kolon güncellenecek..
-
sıra gibi ayrı bir tablo olsa
sonra kaydet dediğinde mevcuttakileri silip yeni listeyi sırayla yeniden kaydetsen olmazmı
Büdüt: dediğim konuşulmuş zaten
wert tarafından 04/May/20 04:37 tarihinde düzenlenmiştir -
wert bunu yazdı
sıra gibi ayrı bir tablo olsa
sonra kaydet dediğinde mevcuttakileri silip yeni listeyi sırayla yeniden kaydetsen olmazmı
Evet hocam onu konuştuk zaten ve bu sıra olayı tek Field de olacak. Virgülle ayrılmış şekilde. Yaklaşık 250-300 karakterlik bir string veri türü olacak. Sıralama buradan gelecek ve o indeksler de aslında diğer tablodaki idler olacak biraz düşündüğümde
benim tablom daha karışık aslında parent child olayı var ama o kısma girmiyorum, onu hallettim. sadece en efektif nasıl bu sıralamayı tutarım diye düşünüyordum. Sağolsun @bonanzi güzel fikir verdi :)
-
edit:
herlocksholmes tarafından 04/May/20 05:13 tarihinde düzenlenmiştir -
Benim de projemde bu tür bir şey var. Siparişlerin sırasını operasyon belirliyor.
Bunun için şu yöntemi izliyorum.
Siparişler
SiparisId KuryeNumarasi
11 5
12 5
13 5
14 5
SiparisSiraTablo diyelim
Sira SiparisId KuryeNumarasi
1 13 5
2 12 5
3 14 5
4 11 5
Şeklinde. Sıra değişince değil de benim başka bir tetikleyicim var. Adam sırayı kople değiştirip tamam yeni sıra bu dediğinde başka kuryenin üstüne muhakkak tıklıyor. Tam o arada bende güncelliyorum.
Sıra tablosuna delete atıp (Kurye Numarasıyla) daha sonra yeni sırayı insert ediyorum.
Select sorgusu atarken de bunu joinleyip Sıraya göre OrderBy çekiyorum.
Bunun avantajı şu oluyor. Update sorgusundan daha performanslı oluyor. 1 Delete 1 de Insert methodu çalıştırıyorum. Bunu da Transaction ile yaptığım için bir problem olsa bile sıkıntı eski halini alıyor hemde hızlı oluyor.
1,2,3,4,5,6,7 bu olay kafama yatmıyor DB katmanında bunu sıralamak için garip gurup sorgular yazman gerekecek.
Evet Client da bunu sıralarsın ve sıralama yükünü Client'a taşırsın ama yarın öbürgün DB için de böyle bir şeye ihtiyaç duyar mısın bilemiyorum.
MhmdAlmz tarafından 04/May/20 09:46 tarihinde düzenlenmiştir -
jquery ile ilgili tablonun listenin neyse boksa işte elemanlarına select attığında zaten sana yukarıdan aşşağıya doğru sıralı son halini verecektir abi neden bu kadar kasıyorsun ki?
-
@MhmdAlmz hocam nasil 1 delete 1 insert oluyor onu anlamadim? Birden fazla elemanin varsa sira degistiginde hepsini silip sonra tekrar eklemen gerekiyor. Tek delete ve insert ile olacak is degil. Benim düsündügüm her ne kadar tehlikeli görünse de (benim hosuma gitmiyor) suan en efektif yol bu görünüyor. Tek bir update ile is cözülecek. siralama string seklinde gelecek client'a, client bu stringi array yapip yeni siralamayi ayarlayacak
@sLeymN hocam olay belli bir düzene göre siralama degil, kullanici kafasina göre siralayabilir bu listeyi. Siraladiginda da ben o sekilde kaydedip, tekrar kullanici actiginda o sekilde göstermem gerek. Yani jquery ile yapilacak bir siralama yok, bu siralama kullaniciya bagli. Ister 1. ögeyi ortaya alir, ister 2. ögeyi en sona alir.. Buradaki siralama da önem arzediyor.