Próbuję wymyślić najlepszy sposób na wykonanie następujących czynności:
Mam listę zadań zapisanych w bazie danych. Zadanie ma przypisany priorytet. Możesz zmienić priorytet zadania, aby zmienić kolejność wykonywania.
Mam na myśli coś bardzo podobnego do Pivotal Tracker.
Wyobraź sobie, że mieliśmy:
1 Task A
2 Task B
3 Task C
4 Task D
5 Task E
Uznajemy, że E jest teraz najważniejszym zadaniem
1 Task E
2 Task A
3 Task B
4 Task C
5 Task D
Muszę zaktualizować wszystkie 5 zadań, aby nadać im nowy priorytet.
Jeśli zadanie B stanie się wtedy ważniejsze niż AI, zrobiłbym to
1 Task E
2 Task B
3 Task A
4 Task C
5 Task D
Muszę zaktualizować tylko zadanie B i A.
Jakie byłyby sposoby ustrukturyzowania tego w bazie danych? Wyobrażam sobie, że w tej samej tabeli przechowywane byłyby różne projekty o takiej samej wadze.
Czy lepiej byłoby wskazać Zadanie, które ma miejsce po nim (trochę jak lista linków).
To naprawdę zrzut mózgu. Zastanawiałem się tylko, jak byś wdrożył coś takiego.
Zrobiliśmy to, o czym mówisz. Zrobiliśmy to za pomocą jednej procedury składowanej, która zmieniła kolejność listy elementów. Każda pozycja na liście miała unikalny identyfikator i numer porządkowy sortowania.
Na przykład:
Procedura składowana, która zmienia kolejność elementów, przyjmuje dwa parametry wejściowe:
Użyliśmy tabeli tymczasowej do przechowywania produktów w nowym zamówieniu:
Użyliśmy trzech instrukcji select, aby wprowadzić je do nowej kolejności:
Następnie zaktualizowaliśmy tabelę podstawową (tblTasks) o nową kolejność sortowania, która w rzeczywistości jest kolumną tożsamości RowId tabeli tymczasowej:
To działa jak mistrz za każdym razem.
źródło
Jeszcze się nad tym nie zastanawiałem ... Ale dlaczego po prostu nie zezwolić na ułamki dziesiętne, aby można było układać rzeczy między innymi bez aktualizacji wszystkiego?
Możesz wycisnąć coś między 1 a 2 o wartości 1,5.
Unikałbym również wartości minimalnych i maksymalnych. Zezwalaj liczbom na przestawianie się na negatywy, jeśli ich priorytet jest wcześniejszy niż to, co obecnie wynosi 0.
Możesz rozważyć oddzielenie priorytetu „wyświetlania od ludzi” od wewnętrznych priorytetów „porządkowania”, aby uniknąć wyświetlania dziwnych miejsc po przecinku i wartości ujemnych.
źródło
Bardzo rozsądne jest wdrożenie Listy połączonej i jej operacji w RDBMS. Wystarczy zastąpić manipulacje tablicami i referencjami zapytaniami SQL. Nie jestem jednak pewien, czy jest to naprawdę najbardziej wydajny sposób, ponieważ niektóre proste operacje wymagają wielu zapytań SQL
Do tabeli zadań dodajesz kolumny „next_task” i „prev_task”, które są kluczami obcymi, do kolumny identyfikatora tej samej tabeli (zakładając, że „-1” jest równoważne NULL)
Zwróć zadanie za pomocą najwyższego priorytetu () : zapytanie SQL, które zwraca zadanie o wartości prev_task = -1
E jest najważniejszym zadaniem : zapytanie SQL, które zmienia następną_zadanie E na identyfikator zadania o najwyższym priorytecie. I zmienia poprzednią czynność E na -1 ...
Ta i inne operacje, takie jak umieszczenie E przed A lub wydrukowanie uporządkowanej listy zadań, będą wymagały o wiele więcej zapytań SQL, które powinny być całkowicie atomowe (chyba że jesteś w stanie zoptymalizować). Jest to dobre ćwiczenie, ale może nie najskuteczniejsze.
źródło
Innym podejściem do problemu pierwszeństwa byłoby określenie, który przedmiot jest ważniejszy niż przedmiot. W aplikacji HR byłoby to jak powiedzenie, kto jest kierownikiem pracownika.
Następnie przeczytaj ten http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/, aby utworzyć zapytanie, które daje pierwszeństwo poziomy.
Myślę, że jest to prostsze doświadczenie użytkownika w ustalaniu priorytetów, ale pozwala na wiele priorytetów na tym samym poziomie.
źródło
Jednym prostym sposobem byłoby zacząć od czegoś takiego:
Następnie, aby przenieść „Zadanie E” między Zadaniem A i Zadaniem B, powiedzmy, że po prostu ustawiłeś „Zadanie E” na coś w połowie drogi między Zadaniem A i Zadaniem B (tj. „150” w tym przypadku).
Oczywiście, jeśli ciągle zmieniasz priorytety, w końcu napotkasz problem polegający na tym, że dwa sąsiednie zadania nie mają „przerwy” na wstawianie nowych wpisów. Ale kiedy to się stanie, możesz po prostu „zresetować” wszystkie priorytety za jednym razem, powrócić do 100, 200, 300 itd.
źródło
Nie jestem guru bazy danych, więc rozwiązałem ten najbardziej logiczny sposób w programie Access 2010. Mam pole „Priorytet”, które jest polem numerycznym. Potem mam wydarzenie dla tego pola.
Zdarzenie jest zdarzeniem po aktualizacji dla pola „Priorytet”, które wyzwala Zapytanie o aktualizację „qryPriority” w celu dodania 1 do numeru priorytetu wszystkich innych rekordów, które mają priorytet większy lub równy właśnie wprowadzonemu numerowi priorytetu.
Oto kod zdarzenia VB i aktualizacja zapytania SQL:
Kod VB zdarzenia „Priorytet”:
Aktualizacja zapytania „qryPriority” SQL:
źródło