Devo usar NULL ou uma cadeia vazia para representar nenhum dado na coluna da tabela?

StackOverflow https://stackoverflow.com/questions/167952

  •  03-07-2019
  •  | 
  •  

Pergunta

nulo ou string vazia - é um melhor que o outro para representar nenhum dados em uma coluna da tabela? (Eu especificamente usar o MySQL, mas estou pensando que esta é independente do sistema.) Existem grandes vantagens / desvantagens de usar um sobre o outro, ou é simplesmente programador preferência?

Foi útil?

Solução

Eu discordo fortemente com todo aquele que diz a NULL uso incondicionalmente. Permitindo uma coluna para ser introduz NULL um estado adicional que você não teria que se você definir a coluna como NOT NULL. Não faça isso se você não precisa do estado adicional. Isto é, se você não pode chegar a uma diferença entre o significado da cadeia vazia eo significado de null, em seguida, definir a coluna como NOT NULL e usar string vazia para representar vazio. Representando a mesma coisa de duas maneiras diferentes é uma má idéia.

A maioria das pessoas que você disse para usar NULL também deu um exemplo onde NULL significaria diferente algo que string vazia. E nesses exemplos, eles estão certos.

Na maioria das vezes, no entanto, NULL é um estado adicional desnecessário que apenas força os programadores de ter de lidar com mais casos. Como já foi mencionado, a Oracle não permite que esse estado extra para existir porque trata NULL e string vazia como a mesma coisa (é impossível armazenar uma string vazia em uma coluna que não permite nulo em Oracle).

Outras dicas

Null. Uma cadeia vazia não é "sem dados", é de dados que passa a ser vazia.

Null é melhor "" realmente representa dados e não vai registrar o mesmo em seu código

No contexto do modelo de banco de dados relacional, null indica "sem valor" ou "valor desconhecido". Ela existe para exatamente o objetivo que você descreve.

UPDATE: Desculpe, eu esqueci de acrescentar que enquanto a maioria (todos?) RDMBSs usar esta mesma definição para null, existem diferenças nuances na forma como nulo é tratado. Por exemplo, MySQL e Oracle permitir que várias nulos em uma coluna exclusiva (ou conjunto de colunas), porque nulo não é um valor, e não pode ser considerado único (null! = Null). Mas a última vez que eu usei MS SQL Server, ele só é permitido um único nulo. Então você pode precisar de considerar o comportamento RDBMS, e se a coluna em questão serão constrangidos ou indexados.

Nem. Representam ausência de dados como ausência de tuplas em uma relação.

Por motivos de desempenho que você pode querer evitar junta-se, de alguma RDBMS', mas tentar projetar o modelo para que as informações que podem estar faltando é numa relação separada.

Aqui estão algumas ligações a partir do site do MySQL:

http://dev.mysql.com /doc/refman/5.0/en/problems-with-null.html

http://dev.mysql.com /doc/refman/5.0/en/working-with-null.html

Eu li uma vez, que um valor NULL é de 2 bits, onde como uma cadeia vazia é de apenas 1 bit. 99% das vezes, isso não fará nenhuma diferença, mas em uma tabela muito grande quando não importa se NULL ou '', então talvez seja melhor usar '' se isso é verdade.

Use sempre NULL. Considere a diferença entre "eu não sei o número de telefone dessa pessoa é" (NULL) e "essa pessoa deixou blank" (em branco).

Use a ferramenta certa para o trabalho. NULL pode significar que nenhum valor foi fornecido (ainda) ou pode significar que nenhum valor é aplicável.

Mas uma cadeia vazia é a informação também. Pode significar que um valor é aplicável, e foi dado, mas ele passa a ser uma string vazia.

Permitindo uma coluna para conter tanto NULL e '' dá-lhe a oportunidade de distinguir entre estes casos. Em qualquer caso, não é bom usar um para significar o outro.

Esteja ciente de que na concatenação, tudo combinado com rendimentos NULL NULL. Por exemplo: CONCAT (NULL, 'foo') for nula. Aprenda a usar a função COALESCE () se você deseja converter NULL para algum valor padrão em uma expressão SQL.

A maioria do nulo tempo é melhor. Há provavelmente algumas situações em que faz pouca diferença, mas eles são poucos. Basta lembrar quando você consulta que field = '' não é o mesmo que field is null (em MySQL, pelo menos).

Tanto quanto eu posso dizer, a Oracle não distingue a diferença.

select 1 from (select '' as col  from dual) where col is null;

Considere por que não há dados na coluna. Será que isso significa o design da tabela é desleixado? Apesar de não gostar nulos, há ocasiões em que eles são apropriados (ou, bastante apropriado), eo sistema não costumam morrer. Apenas nunca permitir nulos em qualquer coisa que é uma chave candidata (primária ou chave alternativa).

Criar uma tabela separada apenas para a coluna anulável e uma chave estrangeira para a tabela principal. Se um registro não tem dados para essa coluna, então não vai ter um registro na segunda tabela. Esta é a solução mais limpa e você não precisa se preocupar sobre como lidar com valores nulos ou dando um significado especial para cadeias vazias.

NULL é um não-valor que deve ser relegado para a idade das trevas de onde surgiram. Eu descobri que há uma quantidade não trivial de programação necessária para lidar com casos NULL especiais que poderiam ser facilmente tratadas com um valor padrão.

Definir o padrão para a sua coluna para ser uma cadeia vazia. Forçar a coluna não permitir nulos, o que provavelmente nunca aconteceria uma vez que você atribuir um valor padrão. Escreva seu código alegremente ignorando o caso em que o valor da coluna é nulo.

Um grande problema que eu sempre tive com NULL é que "SELECT * FROM tbl WHERE column = NULL" sempre retornará um conjunto de resultados vazio. NULL nunca pode ser igual a qualquer coisa, incluindo NULL. A palavra-chave speical "coluna é nulo" é a única maneira de verificar se há algo sendo nula. Se você se afastar nulo, então a comparação será bem sucedida:. "Coluna = ''" 7 linhas retornadas

Eu fiz duas grandes implementações DB a partir do zero, onde no final eu me arrependi usando NULL. Da próxima vez, não nulos para mim!

Há uma exceção importante. Bill Karwin afirmou: "CONCAT (NULL, 'foo') produz NULL" o que é verdade para a maioria RDBMSs, mas não para Oracle.

Como sugerido por James Curran acima, a Oracle escolheu este momento bastante crítico afastar-SQL padrão tratando nulos e cadeias vazias exatamente o mesmo. Pior do que apenas tratá-los da mesma, no entanto, ele realmente pode corromper o significado de um valor NULL, devolvendo algo diferente de NULL quando concatenando.

Especificamente, em CONCAT Oracle (NULL, 'foo') 'foo' rendimentos. Graças Oracle, Eu já perdi meus valores nulos que podem não importa para você, mas com certeza faz a diferença quando os dados são passados ??para outros RDBMSs para processamento posterior.

A "sem dados" valor em uma coluna deve ser representado por um valor padrão. Lembre-se que significa NULL um valor desconhecido, isto é, a coluna pode ter um valor ou não, mas você não sabe que a partir deste momento.

Em um sistema de pedido de empréstimo por exemplo, um valor NULL no meio campo do número da carteira de motorista que o requerente ou o processador de empréstimo não fizeram a introdução do número da carteira de motorista. O valor NULL não significa automaticamente o requerente não tem uma licença. Ele pode ou não ter uma licença, você só não sei, isso é por isso que é NULL.

As mentiras ambigüidade em colunas de seqüências. A coluna numérica contém, obviamente, um zero se não há nenhum valor. Como você pode representar uma cadeia de valor não? No exemplo acima, para os candidatos com carteira de motorista, você pode atribuir um valor padrão arbitrário como "nenhum" ou ainda melhor uma cadeia vazia. Basta garantir que você use o valor vazio padrão em suas outras tabelas para a consistência.

Sobre a questão de não usar nulos como um princípio, há casos em que eles são, de facto, essencial. Como alguém que trabalha com estatísticas extensivamente, é comum que os provedores de dados para dar-lhe conjuntos de dados com dados incompletos. Por exemplo, em um conjunto de dados de PIB per país, você pode encontrar faltando números do PIB nos anos anteriores e posteriores. Uma razão é que não há dados oficiais para os anos de governo do país. Será incorrecto concluir que seu PIB é zero (DUH!) E mostrar um valor zero nos dados extraídos ou um gráfico. O valor correto é NULL, o que significa que você não tem os dados ainda. O usuário final interpreta corretamente os pontos de dados em falta nos dados extraídos e gráficos como NÃO zero. Além disso, ele não irá causar erros em seus cálculos, especialmente quando você faz médias.

Algumas "regras" que fazem sentido, teoricamente, seria de fato uma solução pobre ou incorreta no seu caso.

I encontrar valores nulos para ser útil para a integridade referencial. No caso da MySQL se um campo é definido como não nulo, então uma inserção requer que os dados sejam fixados; Caso contrário, NULL é um valor possível e restrição de chave externa não é aplicada.

  1. id: chave primária
  2. product_id: FOREIGN KEY NOT NULL
  3. REF_ID: (NULLABLE)

id e área de product_id sempre necessária. REF_ID pode ser definido como NULL. No entanto, se qualquer outro valor for usado, ele deve satisfazer a restrição FOREIGN KEY.

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