Używam Django i PostgreSQL, ale nie jestem absolutnie związany z ORM Django, jeśli jest lepszy sposób na zrobienie tego z surowymi operacjami SQL lub bazami danych.Struktura danych do przechowywania pola sortowania w celu wydajnego wprowadzania modyfikacji
Mam model, który wymaga porządkowania sekwencyjnego. Operacje wyszukiwania będą zazwyczaj pobierać całą listę w kolejności. Najczęstszym operacji na tych danych jest, aby przenieść wiersz do końca listy, z podzbioru interweniujących elementów propagacji się zastąpić poprzedni element takiego:
(operation on A, with subset B, C, E) A -> B B -> C C -> E D -> D E -> A Notice how D does not move.
w ogóle, podzbiór przedmiotów nie będzie więcej niż około 50 pozycji, ale lista podstawowa może wzrosnąć do dziesiątków tysięcy wpisów.
Najbardziej oczywistym sposobem realizacji tego jest użycie prostego pola liczby całkowitej. Wydaje się to nieoptymalne. Wymaga kompromisu polegającego na tym, że kolumna zamawiania pozycji jest nieunikalna, gdzie nieunikalność jest wymagana tylko podczas trwania operacji modyfikacji. Aby to zobaczyć, wyobrazić sobie pracę przy użyciu minimalnej z podzbioru B:
oldpos = B.pos
B.pos = A.pos
A.pos = oldpos
Chociaż już zapisany pozycję, w drugiej linii masz naruszył unikatowości. Dodatkowo, ta metoda powoduje, że atomowość jest problematyczna - twoja operacja odczytu musi nastąpić przed napisaniem, podczas której twoje zapisy mogą się zmienić. Domyślna dokumentacja obsługi transakcji Django nie rozwiązuje tego problemu, chociaż wiem, że powinna być możliwa w SQL przy użyciu poziomu blokowania transakcji "REPEATABLE READ".
Poszukuję alternatywnych struktur danych, które będą bardziej pasować do tego wzoru użycia. Przyjrzałem się pomysłom na this question.
Jedną z propozycji nie jest Dewey rozwiązanie styl dziesiętny, który sprawia, że operacje wstawiania wystąpić numerycznie między istniejącymi wartościami, więc wkładając między B i C powoduje:
A=1 -> B=2 B=2 -> A=2.5 C=3 -> C=3
rozwiązuje ten kolumnie wyjątkowość problemu, ale wprowadza problem polegający na tym, że kolumna musi być zmienną o określonej liczbie miejsc po przecinku. Albo przeszacowuję i przechowuję więcej danych, niż potrzebuję, albo system staje się ograniczony przez dowolną dziesiętną długość, którą narzucam. Ponadto nie spodziewam się, że użycie będzie równomierne w stosunku do bazy danych - niektóre klucze będą przenoszone znacznie częściej niż inne, dzięki czemu rozwiązanie to szybciej osiągnie granicę. Mógłbym rozwiązać ten problem, okresowo zmieniając numerację bazy danych, ale wydaje się, że dobra struktura danych powinna tego uniknąć.
Inną strukturą, którą rozważałem, jest połączona lista (i warianty). Ma to tę zaletę, że czyni modyfikację prostą, ale nie jestem pewien jej właściwości w odniesieniu do SQL - porządkowanie takiej listy w zapytaniu SQL wydaje się być bolesne, a wyodrębnianie niesekwencyjnego podzbioru listy jest okropne właściwości pobierania.
Poza tym są B-drzewa, różne drzewa binarne i tak dalej. Co zalecamy dla tej struktury danych? Czy istnieje standardowa struktura danych dla tego rozwiązania w SQL? Czy początkowy pomysł na sekwencyjne liczby całkowite rzeczywiście będzie miał problemy ze skalowaniem, czy też widzę problemy tam, gdzie ich nie ma?
Rzucanie tutaj nagrody z powodu małej liczby odpowiedzi ... –
Cześć Paul - widzę, że przyjąłeś moją odpowiedź - dzięki: D. Które z proponowanych rozwiązań zdecydowałeś się wybrać i dlaczego? – Matt