Uma necessidade comum ao usar um banco de dados é acessar os registros em ordem. Por exemplo, se eu tiver um blog, quero poder reordenar minhas postagens em ordem arbitrária. Essas entradas geralmente têm muitos relacionamentos, portanto, um banco de dados relacional parece fazer sentido.
A solução comum que vi é adicionar uma coluna inteira 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);
Em seguida, podemos classificar as linhas order
para colocá-las na ordem correta.
No entanto, isso parece desajeitado:
- Se eu quiser mover o registro 0 para o início, tenho que reordenar todos os registros
- Se eu quiser inserir um novo registro no meio, tenho que reordenar todos os registros depois dele
- Se eu quiser remover um registro, tenho que reordenar todos os registros depois dele
É fácil imaginar situações como:
- Dois registros têm o mesmo
order
- Existem lacunas
order
entre os registros
Isso pode acontecer facilmente por vários motivos.
Esta é a abordagem adotada por aplicativos como o Joomla:
Você poderia argumentar que a interface aqui é ruim e que, em vez de humanos editarem números diretamente, eles deveriam usar setas ou arrastar e soltar - e provavelmente você estaria certo. Mas nos bastidores, a mesma coisa está acontecendo.
Algumas pessoas propuseram o uso de um decimal para armazenar a ordem, para que você possa usar "2,5" para inserir um registro entre os registros nas ordens 2 e 3. E embora isso ajude um pouco, é sem dúvida ainda mais confuso porque você pode acabar com decimais estranhos (onde você para? 2,75? 2,875? 2,8125?)
Existe uma maneira melhor de armazenar pedidos em uma tabela?