Pergunta

Say I oferta usuário verificar off idiomas que ela fala e armazená-lo em um db. nota lateral importante, não vou procurar db para qualquer um desses valores, como vou ter algum mecanismo de pesquisa separada para pesquisa. Agora, a maneira mais óbvia de armazenar estes valores é criar uma tabela como

UserLanguages
(
 UserID nvarchar(50),
 LookupLanguageID int
)

mas o site será elevada carga e estamos tentando eliminar qualquer sobrecarga sempre que possível, de modo a fim de evitar junta-se com mesa de membro principal quando mostrando resultados em UI, eu estava pensando em línguas armazenamento para um usuário na tabela principal , tê-los separado por vírgulas, como "12,34,65"

Mais uma vez, eu não procurá-los por isso não se preocupe em ter de fazer índice de texto completo nessa coluna.

Eu realmente não vejo qualquer problema com esta solução, mas estou com vista para alguma coisa?

Obrigado, Andrey

Foi útil?

Solução

Você pode não estar faltando alguma coisa agora, mas quando você está requisitos mudam você pode lamentar essa decisão. Você deve armazená-lo normalizado como o seu primeiro instinto sugeriu. Essa é a abordagem correta.

O que você está sugerindo é uma otimização prematura clássico. Você não sabe ainda se isso se juntar vai ser um gargalo, e assim você não sabe se você está realmente comprando qualquer melhoria de desempenho. Espere até que você pode perfil a coisa, e então você saberá se que as necessidades peça a ser otimizado.

Se isso acontecer, eu consideraria uma visão materializada, ou alguma outra abordagem que a pré-calcula a resposta usando os dados normalizados para um cache que não é considerado o livro de registro.

De modo mais geral, há um grande número de possíveis otimizações que poderia ser feito, se necessário, sem comprometer seu projeto na forma como você sugere.

Outras dicas

Do not.

  • Você não procurá-los agora
  • Os dados é inútil para qualquer coisa, mas esta situação
  • No integridade dos dados (por exemplo, não FK)
  • Você ainda tem que mudar para "Inglês, Alemão" etc para exibição
  • "Dá-me a todos os usuários que falam x" = FALHA
  • A lista é realmente uma questão de apresentação

É o seu sistema, embora, e estou ansioso para responder às inevitáveis ??perguntas "ajudar" mais tarde ...

Este tipo de armazenamento chegou quase sempre volta para me assombrar. Por um lado, você não está mesmo na primeira forma normal. Por outro lado, algum gerente ou o outro vai certamente voltar e dizer .. "hey, agora que nós armazenamos isso, você pode me escrever um relatório sobre ..."

Eu sugiro ir com um design normalizado. Coloque-o em uma tabela separada.

Problemas:

  1. você perde se juntar a capacidade (obviamente).
  2. Você tem que reanalisar a lista em cada carregamento da página / back post. O que resulta em mais lado cliente código.
  3. Você perde todas as pretensões de tentar manter a integridade de dados. Imagine se você decidir remover uma linguagem mais tarde ... O que está a sql vai ser para corrigir todos os seus perfis de usuário?
  4. Assumindo suas várias opções de perfil são armazenados em uma tabela de pesquisa na DB, você ainda tem que correr "30 consultas" por página de perfil. Se eles não são, então, você tem que implantar código para cada pequena mudança. ruim, muito ruim.
  5. Baseando uma decisão de projeto em algo que "não vai acontecer" é uma receita absoluta para o fracasso. Claro, os empresários disseram que nunca vai fazer isso ... Até que pensar em uma razão que absolutamente deve fazê-lo. Hoje. Que será imediatamente após você terminar de codificação isso.
  6. Como eu disse em um comentário, 30 consultas para uma página de utilização baixo não é nada. Não se preocupe, e definitivamente não fazer optimize se você não sabe para danado certeza de que é necessário. Adivinhe quantas consultas SO faz para a sua página de perfil?

Eu geralmente ficar longe da solução que você descreveu, você pedindo problemas quando você armazenar dados relacionais em tal moda.

Como solução alternativa: Você poderia armazenar como um bitmasked inteiro, por exemplo: 0 - Nenhuma seleção 1 - Inglês 2 - Espanhol 4 - German 8 - Francês 16 - Russian --e assim por diante potências de 2

Então, se alguém selecionados Inglês e Russo o valor seria 17, e poderá facilmente consultar os valores com operadores bit a bit.

otimização prematura é a raiz de todo o mal.

EDIT: Aparentemente, o contexto da minha observação foi mal interpretado por alguns - e, portanto, os downvotes. Então eu vou esclarecer.

desnormalizar seu modelo para facilitar as coisas e / ou 'mais performance' - como a criação de colunas concatenadas para representar informações de negócios (como no caso OP) - é o que eu chamo de uma "otimização prematura".

Embora possa haver alguns casos extremos extremos em que não há outra forma de obter o desempenho necessário necessária para um domínio de problema particular - deve-se raramente assumem este é o caso. Em geral, tais otimizações prematuras causar dor a longo prazo, porque eles são difíceis de desfazer -. mudando seu modelo de dados, uma vez que está em produção preciso muito mais esforço do que quando inicialmente implantado

Ao projetar um banco de dados, os desenvolvedores (e DBAs) deve aplicar práticas padrão como a normalização para garantir que seu modelo de dados expressa a informações de negócios a ser recolhida e gerida. Eu não acredito que o uso adequado de normalização de dados é uma "otimização" - é uma prática necessária. Na minha opinião, modeladores de dados deve estar sempre à procura de modelos que poderiam ser reestruturada para (pelo menos) a terceira forma normal (3NF).

Se você não está consultando contra eles, de fazer qualquer coisa não perder armazenando-os em uma forma como o seu plano inicial. Se você está, então armazená-los no formato delimitado por vírgulas vai voltar para assombrá-lo, e eu duvido que qualquer economia de velocidade seria significativo, especialmente quando você fator no trabalho necessário para traduzi-los de volta.

Você parece estar extremamente preocupado com a adição de alguns tabela de pesquisa adicional junta. Na minha experiência, o tempo que leva para realmente transmitir a resposta HTML e ter o navegador torná-lo excedem em muito poucos tabela extra junta. Especialmente se você estiver usando índices para suas chaves primárias e estrangeiras (como deve ser). É como se você está planejando uma viagem cross-country multi-dia e você está preocupado com 1 stop casa de banho extra de 10 minutos.

A falta de flexibilidade a longo prazo e integridade dos dados não valem a pena para uma pequena otimização tal (que pode não ser necessário ou mesmo perceptível).

Nooooooooooooooooo !!!!!!!!

Como dito muito bem no acima alguns posts.

Se você quer uma opinião contrária a este debate, olhada wordpress. As tabelas são calçadas cheias de dados delimitados, e é uma grande plataforma, simples.

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