Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como permitir que um usuário insira em qualquer lugar em uma lista?


O método mais simples do ponto de vista do código é usar um estilo de lista vinculada, onde você tem um próximo id de elemento, em vez de um valor de pedido. Isso é menos útil em listas pequenas, mas quando você começa a aumentar o tamanho da lista, torna as atualizações/movimentações/remoções muito mais limpas e evita a possível atualização de milhares de tuplas para fazer uma alteração de ordem.

++ Não tenho um exemplo de código exato em mãos, mas você faria uma chamada para todas as listas de um usuário
SELECT Posts.id, Posts.next, Posts.content, User.firstPost FROM db.posts AS Posts 
JOIN db.user as User ON Posts.ownerid = User.id 
WHERE User.id='123' AND Posts.active = 1;

Isso obteria todas as postagens de um único usuário e, em seguida, você teria um campo que contém o id da próxima postagem. Para começar, você precisaria de uma chave para identificar o primeiro post (armazenar o id do primeiro post nas informações do usuário). Depois de puxar o primeiro post, você pega o valor 'próximo' e o usa para identificar o próximo post.

Isso parece um pouco louco para uma lista curta, mas pense em um usuário com 1000 posts. Se eles precisam adicionar 1 post na 2ª posição. Em um sistema de ordenação numérica tradicional, agora você precisa atualizar 999 outras linhas com uma atualização de +1. Com esta solução, se você precisar inserir uma postagem na segunda posição, basta consultar a primeira postagem para obter o próximo valor. Depois de tê-lo, você o altera para o valor do novo segundo poste e define o próximo valor do segundo post como o originalmente mantido pelo primeiro.
[1st Post] --Next---> [2nd Post] --Next---> [3rd Post]

Após inserir:
[1st Post] -.                          .--> [2nd Post] --Next---> [3rd Post]
            `--Next--> [New 2nd Post]--`