Pergunta

Sim, outro NULL vs questão string vazia.

Eu concordo com a ideia de que NULL significa não definido, enquanto meios string vazia "um valor que está vazio". Aqui está o meu problema:. Se o valor padrão para uma coluna é NULL, como faço para permitir que o usuário digite que NULL

Vamos dizer que um novo usuário é criado em um sistema. Há um campo primeiro e último nome; sobrenome é necessária durante o primeiro nome não é. Ao criar o usuário, a pessoa vai ver 2 entradas de texto, uma para o primeiro e um para o último. A pessoa escolhe para entrar apenas o último nome. O primeiro nome tecnicamente não está definido. Durante a inserção I verificar o comprimento de cada campo, definindo todos os campos que estão vazias para NULL.

Ao olhar para o banco de dados, vejo que o primeiro nome não está definido. A pergunta que imediatamente vem à mente é que talvez eles nunca viram o primeiro campo de nome (ou seja, por causa de um erro). Mas este não é o caso; eles deixaram se em branco.

Então, minha pergunta é, como você decide quando um campo deve ser definido como NULL ou uma cadeia vazia quando receber entrada do usuário? Como você sabe que o usuário deseja o campo para não ser definido sem foco detectar ou se apagou um valor ... ou ... ou ...?

questão relacionada: Devo usar NULL ou uma string vazia para representar nenhum dado na coluna da tabela?

Foi útil?

Solução

Eu quase nunca usar NULL quando se refere a dados reais. Quando usado para chaves estrangeiras, eu diria que NULL é válido, mas quase nunca é válido para os dados introduzidos pelo utilizador. A única exceção que provavelmente viria acima com bastante regularidade é para datas que não existem, como um banco de dados empregado com um campo "termination_date". Nesse caso, todos os atuais funcionários devem ter um valor de NULL nesse campo. Como para obter-los para realmente inserir um valor nulo, para os valores que realmente necessitam de um valor nulo, gostaria de colocar uma caixa de seleção ao lado do campo de entrada para que o usuário pode verificá-lo dentro e fora para ver o valor correspondente a nula (ou de uma forma mais user maneira amigável, nenhum). Ao ativar a caixa de seleção para definir o campo como nulo, caixa de texto correspondente deve ser desativado, e se um valor nulo já está associado, deve começar como desativado, e só se tornam ativados quando o usuário desmarca a caixa de seleção nulo.

Outras dicas

Eu vou quebrar o padrão, e dizer que eu sempre usar NULL para cadeias de comprimento zero, pelas seguintes razões.

  1. Se você começar bem-cortar as implicações de espaços em branco, em seguida, você deve garantir de alguma forma que qualquer outro desenvolvedor lê e escreve-lo da mesma forma.

  2. Como você se alfabetizar-lo?

  3. Você pode inequivocamente determinar quando um usuário omitido inserir um valor, em comparação com intencionalmente deixando-o em branco?

  4. Como você inequivocamente consulta para a diferença? Um usuário pode tela de consulta indicam NULL vs. branco usando padrão sintaxe formulário de entrada?

  5. Na prática, eu nunca foram proibidos de leitura e escrita de dados utilizando padrão, o comportamento surpreendente usando essa regra. Se eu precisava saber a diferença, eu usei um campo booleano (o que é mais fácil para mapear a dispositivos de interface do usuário inequívocas). Em um caso, eu usei um gatilho para impor verdadeiro valor => null, mas nunca vi isso invocado porque a camada BR filtrados a condição de forma eficaz.

Se o usuário fornece uma cadeia vazia, eu sempre tratá-lo como nulo a partir da perspectiva do banco de dados. Além disso, eu normalmente aparar as entradas de string para remover espaços à esquerda / à direita e, em seguida, verificar se há vazio. É uma pequena vitória na base de dados com varchar tipos () e também reduz os casos de pesquisa desde que eu só precisa verificar se há name is null vez de name is null or name = '' Você também pode ir por outro caminho, convertendo nulo para ''. De qualquer maneira, escolher um caminho e ser consistente.

O que você precisa fazer é descobrir o que comportamento que você deseja. Não há ninguém álgebra fixa de como seqüências de nome são interpretados.

Pense sobre a máquina de estado aqui: você tem campos que têm vários estados: ele slounds como você está pensando em um estado de "não inicializado", outro dos "propositalmente vazio" e um terceiro com algum valor definido. Qualquer coisa que você faz para que essa atribuição e é consistente com o resto do seu programa será encontrar; parece que o mapeamento é fácil

NULL ? não inicializado
"" ? propositadamente unset
um nome ? inicializado.

Eu tento manter as coisas simples. Neste caso, eu faria a coluna primeiro nome não-nulo e permitir espaços em branco. Caso contrário, você terá três casos para lidar com qualquer lugar que você se referir a este campo:

  1. Nome em branco
  2. Null primeiro nome
  3. Não-branco primeiro nome

Se você vai com 'em branco é nulo' ou 'nulo está em branco', então você está para baixo a dois casos. Dois casos são melhores do que três.

Para mais responder a sua pergunta: o usuário inserir dados provavelmente não (e não deve) saber nada sobre o que um "nulo" é e como ele se compara a um "vazio". Esta questão deve ser resolvida de forma limpa e consistente no sistema -. Não a interface do usuário

Enquanto o seu exemplo é principalmente para cordas, eu gostaria de dizer que eu uso nulo para campos numéricos e booleanos. Um accountbalance de 0 é muito diferente para mim como aquele que é nulo. Mesmo para booleans, se as pessoas tomam um teste de múltipla escolha com respostas verdadeiras e falsas, é muito importante saber se alguém respondeu verdadeiro ou falso ou não responderam a todos. Não usar nulo nesses casos exigiria-me para ter uma tabela extra ou uma configuração diferente para ver se alguém respondeu a uma pergunta. Você pode usar, por exemplo, -1 para não preenchidos 0 para falso e 1 para verdadeiro, mas depois que você está usando um campo numérico para algo que é essencialmente um boolean.

Eu nunca, já teve um uso para um valor NULL no código de produção. Uma cadeia vazia é o valor de uma fina sentinela para um campo em branco nome, número de telefone ou renda anual para qualquer aplicação. Dito isto, eu tenho certeza que você poderia encontrar algum uso para isso, mas eu só acho que é usado em demasia. Se eu foram para usar um valor NULL, no entanto, imagino eu usá-lo em qualquer lugar que eu quero para representar um valor vazio.

Eu tenho NULL sempre usado para valores não inicializadas, empty para valores propositadamente vazios e 0 para fora indicadores.

Ao fazer isso o tempo todo, é lá mesmo que eu não estou usando ele, mas eu não tenho que fazer nada diferente se eu precisar essa distinção.

Estou geralmente testar para empty(), mas às vezes eu verificar isset() que avalia false em NULL. Isso é útil para lembretes para responder a certas perguntas. Se é empty, false ou 0 então a pergunta for respondida.

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