Uma necessidade comum ao usar um banco de dados é acessar os registros em ordem. Por exemplo, se eu tiver um blog, desejo reorganizar minhas postagens em ordem arbitrária. Essas entradas costumam ter muitos relacionamentos, portanto, um banco de dados relacional parece fazer sentido.
A solução comum que eu 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 obtê-las na ordem correta.
No entanto, isso parece desajeitado:
- Se eu quiser mover o registro 0 para o início, preciso reordenar todos os registros
- Se eu quiser inserir um novo registro no meio, preciso 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 nos
order
registros entre
Isso pode acontecer com bastante facilidade por vários motivos.
Esta é a abordagem que aplicativos como o Joomla adotam:
Você pode argumentar que a interface aqui é ruim e que, em vez de os humanos editarem números diretamente, eles devem usar setas ou arrastar e soltar - e você provavelmente estaria certo. Mas nos bastidores, a mesma coisa está acontecendo.
Algumas pessoas propuseram usar 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 enquanto isso ajuda 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?
orders
e o ddl.