Pergunta

Eu tenho um projeto que envolve um sistema de votação web. Os valores actuais e os dados relacionados são armazenados em várias tabelas. Os dados históricos será um aspecto importante deste projeto então eu também criei tabelas de auditoria a que os dados atuais serão movidos em uma base regular.

I encontrar esta estratégia altamente ineficiente. Mesmo se eu só arquivar dados em uma base diária, o número de linhas se tornará enorme mesmo se apenas 1 ou 2 usuários fazer atualizações em um determinado dia.

A próxima alternativa que eu posso pensar só é armazenar entradas que foram alterados. Isto significa ter de construção lógica para criar automaticamente uma vista de um determinado dia. Isto significa linhas menos armazenado, mas considerável complexidade.

A minha ideia final é um pouco menos convencional. Uma vez que os dados históricos será para fins de relatório, não há nenhuma necessidade para os usuários da Internet para ter acesso rápido. Eu estou pensando que meu db não poderia ter dados históricos nele. DB só representa o estado atual. Em seguida, diariamente, todo o banco de dados poderia ser carregado para objectos (número de utilizadores / dados é relativamente baixa) e, em seguida, em série a algo como XML ou JSON. Esses arquivos podem ser diffed com o dia anterior e armazenado. Na verdade, SVN poderia fazer isso por mim. Quando eu quero os dados para um determinado dia passado, o sistema tem de recuperar a versão para esse dia e deserialize em objetos. Esta é obviamente uma operação dispendiosa, mas o desempenho não é tanto uma preocupação aqui. Estou pensando em usar LINQ para isso que eu acho que seria simplificar as coisas. O procedimento de serialização teria que ser muito organizado para o diff para funcionar bem.

Que abordagem você tomaria?

Graças

Foi útil?

Solução

Tudo que você nos contou sobre o seu sistema é que ele envolve votos. Contanto que você armazenar timestamps para quando os votos foram lançados você deve ser capaz de gerar um relatório que descreve a contagem estado voto em qualquer ponto no tempo ... não?

Por exemplo, digamos que eu tenho um sistema que registra recursos favoritos (olhos, sorriso, bunda, ...). Se eu quero saber quantos votos foram para um determinado recurso a partir de uma determinada data, então eu simplesmente contagem todos os votos para o recurso com um timestamp menor ou igual a essa data.

Se você quer ter uma história de outras coisas, então você deve seguir uma abordagem similar.

Eu acho que esta é a forma como é feito.

text alt

Outras dicas

Se você está se perguntando, basicamente, como revisões de dados são armazenados em bancos de dados relacionais, então gostaria de analisar a forma como wikis fazê-lo.

Wikis são tudo sobre como manter o histórico de revisão detalhada. Eles usam bancos de dados relacionais simples para armazenamento.

Considere banco de dados da Wikipedia esquema .

Você considerou usando um sistema de controle de versão real ao invés de tentar encaixar um banco de dados em seu lugar? Eu mesmo sou muito parcial para git, mas há muitas opções. Todos eles têm um bom suporte para as diferenças entre as versões, e eles tendem a ser bem otimizado para este tipo de carga de trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top