Częstą potrzebą korzystania z bazy danych jest uzyskiwanie dostępu do rekordów w kolejności. Na przykład, jeśli mam blog, chcę móc zmieniać kolejność moich postów na blogu w dowolnej kolejności. Wpisy te często mają wiele relacji, więc relacyjna baza danych wydaje się mieć sens.
Typowym rozwiązaniem, które widziałem, jest dodanie kolumny liczb całkowitych order
:
CREATE TABLE AS your_table (id, title, sort_order)
AS VALUES
(0, 'Lorem ipsum', 3),
(1, 'Dolor sit', 2),
(2, 'Amet, consect', 0),
(3, 'Elit fusce', 1);
Następnie możemy posortować wiersze, order
aby uporządkować je we właściwej kolejności.
Jednak wydaje się to niezdarne:
- Jeśli chcę przenieść rekord 0 na początek, muszę zmienić kolejność każdego rekordu
- Jeśli chcę wstawić nowy rekord na środku, muszę zmienić kolejność każdego rekordu po nim
- Jeśli chcę usunąć rekord, muszę zmienić kolejność każdego rekordu po nim
Łatwo jest wyobrazić sobie takie sytuacje, jak:
- Dwie płyty mają to samo
order
order
Pomiędzy rekordami występują luki
Może się to zdarzyć dość łatwo z wielu powodów.
Takie podejście przyjmują aplikacje takie jak Joomla:
Można argumentować, że tutaj interfejs jest zły i że zamiast ludzi bezpośrednio edytujących liczby, powinni używać strzałek lub przeciągania i upuszczania - i prawdopodobnie masz rację. Ale za kulisami dzieje się to samo.
Niektóre osoby zaproponowały użycie miejsca dziesiętnego do przechowywania zamówienia, dzięki czemu można użyć „2,5”, aby wstawić rekord między rekordami w kolejności 2 i 3. I choć to trochę pomaga, jest to prawdopodobnie jeszcze bardziej bałagan, ponieważ możesz skończyć z dziwne miejsca po przecinku (gdzie się zatrzymujesz? 2,75? 2,875? 2,8125?)
Czy istnieje lepszy sposób na przechowywanie zamówień w tabeli?
orders
i ddl.