Database - Veritabanı
Dinamik Siralama Ve Efektif Sekilde Veritabanina Kaydetme
Dinamik Siralama Ve Efektif Sekilde Veritabanina Kaydetme
-
Selamlar
Bir problemle karsilastim, ancak düsündügüm yolun maliyeti fazla o yüzden belki bir buradan fikir gelir amaciyla sormak istiyorum.
Asagidaki sekilde bir liste düsünün..
Bu listede elemanlar 1 den 10 a kadar düzenli sekilde siralanmis ve veritabanina kaydedilmis olsun.. Ancak kullanicinin bu siralamayi degistirme sansi var. Yani 10. elemani tutup 1. elemanin yerine koymak isteyebilir ve bunu bu sekilde kaydetmek isteyebilir.
Bu durumda, 1. elemandan itibaren tüm elemanlarin siralama indexi 1 artacak.. Yani 10 tane elemanin siralama indexini database'de update etmem gerekecek.. Durum daha da karmasiklasabilir. Kullanici birden fazla ögenin yerini degistirebilir ve toplam 10 eleman degil de 100 tane eleman olabilir (kendisi de ekleyebilir cünkü listeye)
Bu durumda en efektif sekilde nasil yapilabilinir?
Ek bilgiler: normalde DB olarak mysql kullaniyorum ancak bu liste olayinda bir nosql cözümü kullanmayi düsünüyorum (mongodb)..
Aklimda söyle bir sey var, bu listeyi serilize edip json olarak tümden kaydetmek ve eskisini silmek.. 100 tane index degerini update etmekten daha iyidir diye düsünüyorum (ki bu degerler ardisik index olmayabilir eger birden fazla elemanin yeri degismisse)..
client tarafi vue (js kodu yazabilirim), server tarafi asp.net core (c#).
Siralama olayini client tarafinda cözüp server'a o sekilde göndermek daha mantikli geliyor bana.
Daha efektif bir yol ariyorum. Fikri olan?
-
hocam indexler neden artsın sadece yerlerini değiştirdiğin iki eleman indexlerini takas etmeyecek mi yoksa gece gece benim kafam almadı mı?
sonradan gelen edit: kafam almamış sanırım :)
-
hocam isim ve siralama söyle olsun
Name Index
Item1 1
Item2 2
Item3 3
Item4 4
Item5 5
Simdi ben Item5'i Item1'in yerine koyuyorum ama replace degil yani yeni siralama söyle olacak
Item5
Item1
Item2
Item3
Item4
haliyle de index siralamasi da degisiyor. Item5 in indexi 5 idi ama simdi 1 olmasi lazim. Item1'in indexi 1 idi simdi 2 olmasi lazim, item2'nin indexi 2ydi simdi 3 oldu.. Böyle devam ediyor ve gördügün gibi her index degismis oldu. Bir de coklu degisim olursa
Item5, Item3, Item1,Item4,Item2 gibi degisimler.. Bir de bunun 100 elemanli bir listede oldugunu düsün..
böyle bir problemi üniversitede görmüstük ama nasil cözdük hic aklimda degil.. Biraz arastirdim birisi söyle bir tavsiyede bulunmus
https://en.wikipedia.org/wiki/Doubly_linked_list
Bu olayi hatirlar gibiyim ama hala net degil :) Aslinda bu olay biraz daha siralama ile ilgili ama benim istedigim kaydetmek ve yeni sirali sekilde göstermek
unbalanced tarafından 04/May/20 02:29 tarihinde düzenlenmiştir -
eh madem öyle küçük bi fikir vereyim listeler ayrı bir şekilde array olarak tutulsun elemanların indexleri ya da idleri sabit kalsın liste sadece güncellensin yani tek bir array güncelleyeceksin ve arrayin index sıfırından başlayarak yazacak böylece elemanları tek tek güncellemeyeceksin abstraction layer eklemeye benzeyecek iş iki olay arasına
liste[1,2,3,4,5,6,7] den liste[2,7,3,5,6,4,1] e gibi
-
tam demek istedigini anlamadim ama söylediklerinden söyle bir sey aklima geldi (belki ayni seydir)
yeni siralamayi al string olarak tabloda bir kolona yaz.. Ve sadece bu kolondaki tüm degerler degisecek.
yani o kolonda 1,2,3,4,5,6,7,8,9,10 seklindeydi, adam siralamayi yapinca yeni siralama 10,4,3,2,1,6,5,7,8,9 seklinde oldu diyelim ve db ye aynen bu sekilde kaydedeyim. Veriyi okumaya gelince, listeyi yollayayim bir de bu siralamayi string olarak yollayayim ve virgülle split edip burdaki indexe göre elemanlari göstereyim?
Bu sekil degilse, örnek verir misin? benim icin önemli olan kisim, DB'deki güncelleme hocam.
-
Index için SQL de ayrı bir yer tutmayı düşündün mü?
Örnek: 10 eleman için bir index array i olsun:
A[10] , bu array in index i gerçek index i belirtiyor olsun.
abcdefghij
buradaki karakterleri elemanlara point eden ifadeler olarak düşün.
Kullanici j yi 3. e almak istesin:
abjcdefghi
olur. Sonra sadece bu array i değiştirebilirsin veritabanında.
Yukarıda yazılmış zaten.
-
aynen hocam dediğini kastettim on güncelleme olacağına tek güncelleme olacak. artık error handling kısmını da ona göre ayarlaman lazım tabi ama işte yok mevcut olmayan id listeye eklenmiş falan gibi
bir de delete işlemlerinde listeyi güncelleme işi de var üf gece gece taşaklarım kamaştı düşünürken. iyi ki yazılımcı falan değilim
Bonibon tarafından 04/May/20 02:45 tarihinde düzenlenmiştir -
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?
-
edit olarak eklediğim şeyler haricinde aynı itemler farklı listelerde görünecekse bir kaç problem daha görünüyor gibi ufukta.
-
order diye bir column eklesen ?
-
Bonibon bunu yazdı
edit olarak eklediğim şeyler haricinde aynı itemler farklı listelerde görünecekse bir kaç problem daha görünüyor gibi ufukta.
hocam önemi yok o isin.. mesela sira 1,2,3,4,5,6,7 diye kayitli..
adam bunu 7,5,2,1,6 yapti.. (3. elemani sildi).. beni ilgilendirmez bu, elimde benim zaten 7,5,2,1,6 verisi var.. Ben sadece 1,2,4,5,6,7 yerine 7,5,2,1,6 yazacagim.. Yani silinenle ilgilenmeyecegim.. (silinen kendi tablosunda olacak o ayri ama biz siralama ile ilgili konusuyoruz). Yani siralama bir kere degistigi anda ben her durumda o fieldi, listedeki son duruma göre güncelleyecegim.. Problem olarak görmedim bunu ya da anlamadim demek istedigini?
@yolbulucu hocam ikinci mesajimdaki Index isimli kolon zaten order column.. Iste onun siralamasi sikintili.. Tüm recordlari update etmek gerekiyor o durumda.. Ya da demek istedigin baska bir sey mi?