Wpis z mikrobloga

Jeśli mamy tabele "album" w bazie danych, a rekordy to linki do zdjęć i chciałbym sobie ręcznie sortować kolejność zdjęć. To jakie rozwiązanie jest najefektywniejsze? Jak tak prostolinijnie myśląc, dodam kolumnę (int) "kolejność", to jak mam kilka tysięcy rekordów i zmienię kolejność z 2 na 4 to wszystkie rekordy po 4 muszę zwiększyć o jeden a to dosyć słaba opcja robić kilka tysięcy razy update bazy.

Jak najlepiej rozwiązać problem sortowania i zmiany kolejności?

#python #programowanie
  • 17
  • Odpowiedz
@kao3991: ok, to już lepszy pomysł niż robienie update na kilku tysiącach rekordów ;) Ale to też takie obejście tematu. A znasz może jakieś "zalecane" rozwiązanie? Jakieś dobre praktyki programowania definiują taki przypadek?
  • Odpowiedz
@Specter00: nic lepszego mi nie przyszło nigdy do głowy. Trzymałem się tego, że jeśli działa, jest czytelne w kodzie i SQLka wykonuje się szybko, to nie ma co drążyć tematu. Warto jeszcze oczywiście mieć indeks na tym polu, skoro będziesz po nim sortował.
  • Odpowiedz
@Specter00: Rozwiązanie podane przez @kao3991 jest całkiem niezłe łatwo zrobić insert jak i nie przebudowywać całego indeksu jak i nie robić update na prawie całej tabeli (przy założeniu aktualizacji rekordów z początku zakresu).
W przypadku "klasycznego" rozwiązania, należałoby sprawdzić może plan wykonania takiego zapytania, może w rzeczywistości silnik jest gotowy na takie przesunięcie?
Trzecia opcja to nadawanie kolejnych indeksów z dużym przeskokiem np co 10. Dzięki temu masz zapas 9 przeniesień,
  • Odpowiedz
@Specter00: Przyszedł mi jeszcze jeden pomysł do głowy. Dwie kolumny sortujące. Pierwsza jest grupą, druga indeksem. Najpierw przerzucasz pomiędzy grupami, a następnie pomiędzy "małymi indeksami". Plus jest taki, że mógłbyś nawet teoretycznie sortować grupy, zachowując kolejność indeksów. Przy zmianie małego indeksu aktualizujesz tylko rekordy z danej grupy. Chociaż tutaj trzeba by sensownie zastosować dzielenie zbyt dużych rekordów na mniejsze kawałki (np maks. 100 elementów w grupie).
Paradoksanie może być problem z
  • Odpowiedz
@Arveit: nie ma chyba lepszego rozwiązania. Tak samo działa np. ocenianie w AIMPie. Możesz sobie playliste posortować po ilości przyznanych rpzez siebie gwiazdek, ale gwiazdki możesz zmieniać sam w dowolnym momencie.
  • Odpowiedz
@Specter00: nowa osobna tabela w ktorej masz nazwy sortowan i kolejna tabela bedaca intersekcja sortowania i albumu, definiująca kolejnosc piosemki w wybranym sortowaniu. Dzięki temu w dowolnej chwili możesz mieć dowolna liczbę sposobów sortowania dowolnego albumu
  • Odpowiedz
@Specter00:


@ghost1511:
Indeks nawet na kilku kolumnach jest wystarczająco wydajny, nawet przy dużych tabelach. Nie wiem, czemu chcesz to robić ręcznie, ale nawet wtedy warto skorzystać z jakiejś struktury pozwalającej w sensowny sposób tym operować (np. B-drzewo, nawet zwykłe hashowanie będzie bardziej wydajne a przede wszystkim bardziej przejrzyste od jakiejś kombinacji z numerkami oznaczającymi kolejność).
  • Odpowiedz
@piotrb: Kolego... chodziło mi o indeks na kolumnie po której OP będzie sortował. W drugim przypadku, który mu zaproponowałem zastanawiałem się czy szybszy będzie indeks złożony na kolumnach (grupa, mały index) czy dwa osobne na (grupa) oraz (index). Nigdzie nie powiedziałem że indeksy są "be" i trzeba je wyłączyć :D
@Specter00 chce oprócz identyfikatora posiadać kolumnę po której będzie mógł ustalać kolejność. W jaki sposób tablica haszująca miałaby w tym przypadku
  • Odpowiedz
Danych w tabeli nie trzyma się posortowanych na potrzeby wyświetlania. Trzymaj dane jakkolwiek, a sortuj przy odczycie. Możesz dodać indeks.
  • Odpowiedz
@wytrzzeszcz: no dobrze (tez mi to przyszlo do glowy), ale pozniej cos takiego, to by mozna chyba tylko jakas procedura posortowac? nie udalo mi sie zrobic selecta...
  • Odpowiedz