2015-10-24 13 views
5

Mam listę zadań projektu przy użyciu kodu JavaScript i biblioteki jQuery Sortable, aby umożliwić łatwe sortowanie elementów listy zadań metodą przeciągania i upuszczania.Alternatywne metody przechowywania porządku sortowania listy w JavaScript i MySQL

Po zmianie kolejności sortowania zamówienie zostaje zapisane w bazie danych MySQL. Obecnie, jeśli istnieje 100 pozycji listy zadań, a numer 2 zostaje przeniesiony na pozycję 3. Dzięki temu wszystkie rekordy 2-100 będą aktualizowane w bazie danych za pomocą kolumny sort_order w tabeli DB rekordów zadań.

To oczywiście nie jest najskuteczniejsze rozwiązanie, ponieważ może spowodować aktualizację ogromnej ilości rekordów DB jednocześnie.

Inną kwestią jest to, że kolumna date_modified, którą mam w swoich rekordach zadań, będzie aktualizowana, gdy nic w zadaniu się nie zmieni, z wyjątkiem numeru zamówienia sortowania, który może być spowodowany przez inne pozycje zmieniające pozycję. Oczywiście istnieją sposoby obejścia tego problemu i obecnie kodowałem je w ogromnej złożonej kwerendzie SQL, która nie aktualizuje mojej kolumny date_modified, chyba że inne kolumny w tabeli są zmodyfikowane.

Tak więc powodem tego posta jest zbadanie innych alternatywnych metod przechowywania mojego porządku sortowania na dużej ilości rekordów.

Jednym z pomysłów jest utworzenie nowej tabeli DB task_sort_order, która może zawierać kolumny task_id i sort_order. Ta tabela będzie zawierać rekord dla każdego rekordu zadania. Zaletą tej metody jest to, że mój SQL byłby uproszczony, ponieważ nie musiałbym się martwić o aktualizowanie pól daty rekordu zadania, gdy zmieniła się tylko kolejność sortowania. Wymagałoby to jednak jednoczesnej aktualizacji tej samej liczby rekordów. W moim oryginalnym przykładzie nadal byłoby masowe aktualizowanie 99 rekordów z zapytania 100 w 1. Wydaje się, że ma on jednak zalety w stosunku do mojego obecnego.

Czy istnieją inne sposoby na ulepszenie przechowywania dużej liczby zamówień sortowania do bazy danych?

Widziałem kilka osób, które będą również zapisywać każdy numer zamówienia sortowania w przyrostach 10 lub inny numer tak, że jeśli na przykład jest 5 rekordów 1=10, 2=20, 3=30, 4=40, 5=50 i rekord 2 przeniesiony na pozycję 4. Byłby to nowy porządek sortowania z 1=10, 3=30, 4=40, 2=44, 5=50, więc w tym przykładzie tylko rekord numer 2 miałby zmienioną wartość sort_order i zapisaną w bazie danych.

Wydaje się to dość skomplikowane, ponieważ wiele rekordów zaczyna się poruszać, a kończy się na dziwnych liczbach nieparzystych, a także musiałby w jakiś sposób obliczyć prawidłową liczbę, aby upewnić się, że nowo przeniesiony element nie jest w konflikcie z poprzednimi. przeniesiony przedmiot.

Jak się wydaje, jestem otwarty na wszelkie pomysły dotyczące innych metod lub nawet sposobów poprawy mojej obecnej metody?

Odpowiedz

2

Myślę, że twój problem leży w wadach tego, jak przechowujesz zamówienie w DB. Dwie idee:

  1. Można spróbować wdrożyć koncepcję połączonej listy w relacyjnej schematu DB, to znaczy za sztukę zapisaniu „odniesienie” do następnego elementu. W ten sposób będziesz musiał zaktualizować tylko kilka rekordów na rearanżację.

  2. Można użyć baz danych grafów, takich jak Neo4j lub OrientDB, gdzie lista połączona byłaby jednym z możliwych połączeń wprowadzania danych, które bazy danych obsługują natywnie.

+0

# 1 ciekawy pomysł.Więc każdy zapis powie Ci, który rekord powinien nadejść po nim, jeśli dobrze zrozumiem. Nie wiem, jak najlepiej zapytać/uzyskać listę wyświetlaną w kolejności za pomocą tej metody. Być może w pętli z rekordu odczyta numer w celu wyświetlenia następnego rekordu i wyświetli go. – JasonDavis

+0

Musisz dokonywać wyborów. Napisałeś, że jesteś niezadowolony z ogromnych i powolnych aktualizacji, a implementacja listy linków pozwoli Ci to rozwiązać. Będzie to miało swoją cenę, gdy trzeba odtworzyć zamówienie (tj. Zapytanie), należy pobrać cały zestaw danych i programowo go przetworzyć, przeskakując zawsze do następnego elementu. Oto, czym są powiązane listy. Z GraphDB jest to o wiele łatwiejsze, ponieważ właśnie wydajesz instrukcję "przechodzącą" do DB, a rekordy wracają we właściwej kolejności! Jest to naprawdę zadanie dla baz danych Graph, które również byłyby niesamowicie szybkie. –

+0

Dzięki temu będę musiał badać bazy danych Graph, tak jak dotąd nie słyszałem ani nie widziałem ich w żadnych artykułach ani w Internecie. Jeśli jednak będą wymagać innego oprogramowania oprócz MySQL, to nie będę mógł go użyć, ponieważ mój projekt jest częścią modułu rozprowadzanego do tysięcy działających PHP i MySQL, więc muszę mieć możliwość korzystania z istniejącego serwera, na którym uruchamiane jest oprogramowanie rodzica. moduł. Twój pomysł na zapisanie następnego rekordu na każdym recoirdzie jest tym, co mnie interesuje z powodu tych ograniczeń, które mam – JasonDavis

Powiązane problemy