Preciso acompanhar os itens excluídos para as necessidades de sincronização do cliente.
Em geral, é melhor adicionar uma tabela tombstone e um gatilho que rastreie quando uma linha foi excluída do banco de dados do servidor - basicamente adicionando uma nova linha à tabela tombstone com os dados do item excluído - ou manter os itens no tabela original e sinalizá -los como excluídos, normalmente com uma coluna do tipo bit, para indicar que uma linha foi excluída e outra coluna para rastrear quando ocorreu a exclusão?
Em geral, é melhor conhecer os requisitos específicos e não tomar decisões de projeto com base no que funciona melhor na maioria das situações. Qualquer um poderia ser preferível. Aqui estão alguns detalhes a serem coletados:
Talvez você deva combinar os dois métodos de propósito. Por que ???
Vamos usar essa tabela (dialeto MySQL)
Observe que, com exceção da PRIMARY KEY, todos os índices que você fizer devem ser precedidos pelo
deleted
sinalizador e terminando comid
.Vamos criar a tabela tombstone
Se sua mesa já tiver um
deleted
sinalizador, você pode preencher a tabela tommstoneOK, agora os dados e a lápide estão preparados. Como você executa exclusões?
Digamos que você esteja excluindo todas as pessoas no CEP 07305. Você executaria o seguinte:
OK, isso parece muito sobrecarga de qualquer maneira que você olhe.
Agora, você quer ver todos os dados deletados? Aqui estão duas maneiras diferentes:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Se o número de ids em mytomb for maior que 5% da contagem de linhas de mydata, será uma verificação completa da tabela. Caso contrário, uma varredura de índice com uma pesquisa para cada linha. Observe quaisquer referências a esses respeitos. Procure os planos de explicação.
Agora, você quer ver todas as pessoas no CEP 07304? Aqui estão duas maneiras diferentes:
SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'
Que tal exclusões em massa? Aqui estão duas maneiras diferentes:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
CONCLUSÃO
Agora, não estou dizendo para manter os dois métodos. Fazer isso ao longo do tempo revela qual método é mais rápido em termos de operabilidade geral. Você deve decidir quais benchmarks para consultar dados ativos, consultar dados excluídos e exclusões em massa funcionam melhor para você.