Pergunta

Eu vi algumas perguntas aqui sobre o armazenamento de preferências do usuário, mas eles parecem estar se referindo principalmente a um conjunto bastante mínimo de preferências. Atualmente estou trabalhando em um aplicativo web altamente personalizável, que será necessário armazenar um grande número de preferências, e eu estou lutando com a forma de armazená-los.

O tipo de preferências que estará armazenando incluem booleans para a exibição de dicas de ferramentas específicas, arranjo de vários painéis de conteúdo em uma página, que página para exibição após o login, os valores padrão para os campos do formulário específicos, etc. All-in-tudo, estou esperando haverá 50+ preferências deste tipo para cada usuário, sendo a maioria booleanos e inteiros os dados.

Eu não sou um grande fã de serialização, mas estou preocupado com a escalabilidade de armazenar cada preferência como uma linha individual. Pensamentos?

Foi útil?

Solução

Serializando uma bolha de dados é o caminho a percorrer aqui, mas não por motivos de desempenho - sim porque este é um aspecto do sistema que é provável que assistamos a um grande número de mudanças. Você não quer ter que mudar seu esquema DB só porque agora você precisa para permitir uma preferência para ativar o modo avançado em alguma página ou algo assim.

O modelo entidade-atributo-valor que HLGEM menciona se encaixa nesse partir de um "fácil de evoluir" perspectiva, mas como ele diz que teria um desempenho muito pobre.

O que você iria desistir com objetos serializados seria a capacidade de consultar diretamente o banco de dados para usuários que correspondem a um determinado padrão (talvez você está rastreando um bug que poderia ocorrer somente com uma combinação de configurações e você quer ver se você tiver quaisquer usuários que têm essa combinação).

Outras dicas

faça o que fizer, evite usar a estrutura de entidade-attrivute-valor para este ( http: //en.wikipedia.org/wiki/Entity-Attribute-Value_model ) a menos que você quer um sistema muito mal desempenho. Uma chamada para uma tabela com 50 colunas vai ser muito mais rápido do que uma chamada para uma tabela que você tem que juntar 50 vezes para obter todas as informações que você precisa.

Eu faria uma tabela relacionada para cada grupo geral de preferências (as preferências de login, preferências geral do site, página específica ou funções preferências) baseando-se em como você pretende consulta para preferências (se você quer puxar tudo de volta no início da sessão vice-puxar aqueles necessários para todo o site no login e aqueles necessários somente para áreas especializadas quando o usuário atinge aqueles, portanto, alguns combinação dos mesmos) e têm as colunas booleanas para o tipo de preferências definido em que. Dessa forma, todas as preferências que você vai precisar para cada área do site vai estar na mesma mesa ou no máximo dois ou três mesas tornando-se relativamente fácil de obter a volta informações. Este é um lugar onde o design é fundamental para o desempenho (você vai estar olhando para cima preferências todo o tempo assim mesmo milissegundos contagem), então você realmente deve considerar o desempenho pela primeira vez em seu design. É muito mais importante aqui do que qualquer desejo de fazer isso parece ser orientada a objeto ou para criar menos trabalho para o desenvolvedor na criação.

Eu não sei se eu iria mesmo armazenar informações como preferências do usuário em um banco de dados. Parece que você vai querer olhar para muitos (se não todas) as preferências do usuário assim que o usuário fizer login; se você acabar fazendo um monte de consultas db, seu sistema vai acabar bastante lento. Em vez disso, eu recomendaria persistindo todas as configurações do usuário em um único arquivo (ou um único registro em algum lugar), e engolindo-o atacado e cache-lo assim que o usuário fizer login.

Presumindo os dados do usuário já está armazenado em um banco de dados, então eu não vejo nenhum problema real armazenar tudo em uma linha, especialmente se você pode precisar de fazer consultas com base em relação aos dados do IE. selecionar todos os usuários com preferência A OU B etc.

Gostaria, porém, carregá-lo em uma classe e persistir essa classe através de algum tipo de mecanismo de cache.

Se você não precisa procurar nas preferências você pode sempre armazenar as preferências como XML e salvá-lo para uma coluna "Preferências". Deve fazer a adição de novas preferências no futuro um pouco mais fácil;)

Outra opção que você poderia fazer (se você não precisa de seus itens armazenados em um DB, por exemplo, para verificar as estatísticas para o material (quem faz o quê, etc)), você pode simplesmente colocar todas as suas configurações em um cookie e armazenar -lo em sua máquina.

é claro, com biscoitos vem todas as dicas de uso de cookies. mas apenas uma outra ideia ...

Existem certas preferências que o usuário prefere mais (todos os animais são iguais, mas alguns são mais iguais do que outros). Estes devem ser especificamente optimizado para recuperação e aplicação sobre a interface no início da sessão. À medida que a profundidade de preferência vai para baixo, eles podem ser agregados usando qualquer critério e guardado como colunas separadas, possivelmente, como matrizes (por exemplo. De fonte preferência coluna inclui tipo de fonte, tamanho e cor e refere-se a uma tabela de fonte). Também indexar as colunas muito utilizadas usando db ferramental e redesenhar para dividir colunas agregadas para que você possa identificar qual elemento na agregação está sob forte demanda.

Ao todo usuário preferências tendem a ser muito estático (ou seja, são como um hábito), não confunda os dados do usuário que é mais altamente mutável com as preferências.

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