Sou responsável por criar um banco de dados em um projeto. Temos campos que raramente terão um valor (1 em cada 10.000 registros) e estou tentando descobrir a melhor maneira de armazenar isso no banco de dados.
Pelo que vejo, tenho 3 opções:
- Adicione uma coluna na tabela para cada valor extra
- Adicione uma tabela vinculada que faça referência à tabela original e tenha registros apenas onde precisamos armazenar um valor
- Use o tipo de dados XML na tabela original e armazene todos os valores nela.
Existem outras opções que eu não considerei?
Estou tentando descobrir os prós e os contras de cada método. Tanto quanto eu posso dizer, 1 seria o mais fácil e 2 ocuparia menos espaço, mas estou lutando para encontrar muitos recursos para 3.
Parece que você precisa de colunas esparsas e índices filtrados e ir com a opção 1. Esses são recursos totalmente suportados e documentados exatamente para este cenário.
Não consigo imaginar uma solução XML com bom desempenho nesse cenário, ela terá uma enorme sobrecarga de metadados redundantes e será lenta para consultar.
Uma coluna anulável não ocupa espaço se for de comprimento variável no SQL Server. O fato de ser NULL é armazenado no bitmap NULL . Você pode indexá-lo, se necessário, com índices filtrados para ignorar as colunas NULL.
Adiciona complexidade quando você considera o ponto 1.
Não. Difícil de pesquisar, analisar, etc.: você se arrependerá disso mais tarde
Também depende do tamanho: será char(1000) para alguns bilhões de linhas? Ou tinyint para 100k linhas? Se este último considerar a complexidade adicional do ponto 2: não vale a pena.
Com o SQL Server 2008 você tem a opção adicional de usar colunas esparsas, que são projetadas especificamente para a situação que você mencionou.
Eles têm o benefício adicional de que você pode visualizá-los como um objeto XML combinado usando XML COLUMN_SET ou referenciá-los individualmente e eles fornecem uma enorme economia de espaço.
Confira o seguinte artigo do blog para obter mais detalhes: http://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx
Uma quarta opção: não use tabelas. As tabelas são muito mal adaptadas a esse tipo de dados (na verdade, a qualquer tipo de dado que não tenha sido ajustado à força na forma tabular). Basta usar XML.