Pergunta

Eu preciso armazenar cadeias longas em um banco de dados. o texto poderá ser 5 ou 6 frases longas. você acha que isso é uma estratégia de design bom. ou devo guardar um ID para essa seqüência e, em seguida, criar um relacionamento com outra tabela que contém o local do arquivo armazenar a string. você poderia por favor dê vantagens e desvantagens de ambos.

as cordas foram pré-processados ??e armazenados no banco de dados. qualquer modificação leria toda a cadeia e substituí-lo completamente. assim você pode assumir que a cadeia é indivisível.

Foi útil?

Solução

Ele deve estar bem para armazenar a seqüência no banco de dados. Se você armazenar um ponteiro de arquivo em vez disso, isso significa que você precisa fazer File I / O cada vez que você quiser ler a string. Algumas frases não é muito longa e você sempre pode usar um campo de dados longtext se você precisa. Obviamente seu banco de dados será um pouco maior, porque você tem o texto, mas isso é ok. É sem dúvida uma alternativa melhor do que ter que armazenar os arquivos.

Outras dicas

As cordas que você menciona não são de todo tempo.

Quando você refered "longas" cordas, eu estava pensando sobre 32kB e acima - algumas frases são <1kb -. Que não é nada hoje

Seu truque, armazenar um Id torna as coisas mais lento desde que você tem que fazer um acesso indirecto.

A única coisa que eu recomendaria, quando o desempenho máximo é necessário, você deve selecionar apenas as colunas que você precisa (omitir SELECT *) - para omitir a coluna de texto, quando não é necessário, uma vez que o transporte da cadeia a partir do servidor a aplicação custa mais tempo. É uma boa prática, não para colunas de toque não necessários (especialmente quando eles podem conter muito mais dados).

A única razão que eu iria criar uma tabela separada é se essas longas seqüências será o mesmo para muitos registros. Caso contrário, é apenas uma complicação extra que não é susceptível de proporcionar qualquer retorno.

Cinco ou seis frases não é nada para um SGBD modernos! Armazenar o texto diretamente no banco de dados.

(A outra técnica que você mencionou - o armazenamento de um ref para outra mesa que em si tem um ref para um arquivo externo segurando o texto -. Seria muito mais complicado de usar e ter um desempenho muito mais pobre)

A resposta realmente depende do volume de cordas você pretende armazenar, e o DB que você pretende usar para armazená-lo. Se você não está armazenando muitas cordas, você pode querer considerar armazená-los em um arquivo XML ou de recursos e de carregamento que em sua aplicação na frente. Se você tem um monte de dados de cadeia, porém, você provavelmente vai ser melhor memorywise lendo a string como e quando você precisar dele, ao invés de tomar a chance de ler uma string em memória que você não acabam usando.

O banco de dados em si não tem nenhum problema real com o armazenamento de cadeias longas. Algumas restrições se aplicam (como o limite de tamanho 8k registro em SQL Server), mas mesmo assim você pode armazenar texto de comprimento arbitrário em um banco de dados, porque todas aquelas adequadas suporta tipos de dados BLOB / TEXT com limite praticamente nenhum superior.

Cinco a seis frases não é muito longo. Se eles pertencem juntos e são destinadas a ser recuperado e manipulado como um todo, você pode ir em frente e armazená-los em um campo CHAR tipo de dados de dimensões adequadas.

A questão de saber se a separá-los e anexar um ID para eles surge apenas se os seus benefícios modelo application / dados directamente a partir desta abordagem, ou seja, na realidade, são coisas separadas. No seu caso, parece haver nenhuma razão para ir por esse caminho.

Todo mundo tem mencionado o desempenho, mas ninguém levantou a outra grande razão pela qual armazenar ponteiros para arquivos do sistema operacional é uma má idéia: backup e recuperação. Se tudo estiver no banco de dados, em seguida, temos um único mecanismo para fazer backup de dados e um único mecanismo para recuperação. Considerando que, com arquivos no OS temos dois mecanismos de backup diferentes, provavelmente em dois granularities diferentes, e recuperação torna-se um pesadelo de sincronização.

Existem alguns casos em que isto não se aplica, como armazéns de dados, que têm transações muito pouco frequentes e assim pode sobreviver sem refazer ou transação logs.

exceto em casos especiais, gostaria de deixar o campo onde ele está.

A única outra opção seria a de colocar as cordas em uma tabela diferente (colocando as cordas reais lá) ... colocá-los em arquivos separados vai matar o seu desempenho.

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