Una necessità comune quando si utilizza un database è di accedere ai record in ordine. Ad esempio, se ho un blog, voglio essere in grado di riordinare i post del mio blog in ordine arbitrario. Queste voci hanno spesso molte relazioni, quindi un database relazionale sembra avere senso.
La soluzione comune che ho visto è quella di aggiungere una colonna intera 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);
Quindi, possiamo ordinare le righe order
per farle nell'ordine corretto.
Tuttavia, questo sembra goffo:
- Se voglio spostare il record 0 all'inizio, devo riordinare ogni record
- Se voglio inserire un nuovo record nel mezzo, devo riordinare ogni record dopo di esso
- Se voglio rimuovere un record, devo riordinare ogni record dopo di esso
È facile immaginare situazioni come:
- Due record hanno lo stesso
order
- Ci sono degli spazi vuoti
order
tra i record
Questi potrebbero accadere abbastanza facilmente per una serie di motivi.
Questo è l'approccio adottato da applicazioni come Joomla:
Potresti sostenere che qui l'interfaccia non funziona e che invece di modificare direttamente i numeri dagli umani, dovrebbero usare le frecce o trascinare e rilasciare, e probabilmente avresti ragione. Ma dietro le quinte, sta succedendo la stessa cosa.
Alcune persone hanno proposto di utilizzare un decimale per archiviare l'ordine, in modo che sia possibile utilizzare "2.5" per inserire un record tra i record nell'ordine 2 e 3. E mentre ciò aiuta un po ', è probabilmente anche più disordinato perché si può finire con strani decimali (dove ti fermi? 2,75? 2,875? 2,8125?)
Esiste un modo migliore per archiviare l'ordine in un tavolo?
orders
e il ddl.