Digamos que você tenha um aplicativo que tenha um campo booleano em sua User
tabela chamado Inactive
.
Existe algo inerentemente errado em apenas armazenar falso como nulo? Em caso afirmativo, você pode explicar qual deve ser o lado negativo? Eu discuti isso com alguém há alguns meses e nós dois concordamos que não deveria importar, desde que você faça isso de forma consistente em todo o aplicativo / banco de dados. Recentemente, alguém que eu conheço enfatizou que "verdadeiro" true
ou false
deveria ser usado, mas na verdade não explicava o porquê.
database-design
null
Ominus
fonte
fonte
Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the database
esta é a sabedoria aceita e você não deve redefinir o que Null significa em seu aplicativo. Será confuso para todos os outros que trabalham com seu código.SELECT * FROM foo WHERE bar = FALSE
não dá os resultados que você espera.Respostas:
Sim.
NULL não é o mesmo que False.
Por definição, comparações (e lógicas) que envolvem NULL devem retornar valores de NULL (não False). No entanto, as implementações de SQL podem variar.
True and NULL
é NULL (não falso).True and NULL or False
é NULL (não falso).http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29
http://technet.microsoft.com/en-us/library/cc966426.aspx
fonte
null
for irrelevante para a lógica (como é o caso emwhatever OR TRUE
ouwhatever AND FALSE
onde nenhum valor dewhatever
pode alterar a condição), a expressão retornará um valor. Não é uma otimização; é assim que a lógica de 3 valores funciona . Qualquer DBMS que insista em retornarUNKNOWN
/NULL
para essas expressões é fundamentalmente quebrado.Ao permitir nulos em um campo booleano, você está transformando uma representação binária pretendida (verdadeiro / falso) em uma representação em três estados (verdadeiro, falso, nulo) em que suas entradas 'nulas' são indeterminadas. O valor 'nulo' não é apropriadamente 'verdadeiro' nem 'falso'. Que razão você teria para aumentar sua representação para ser imprecisa?
Mesmo se você optar por um padrão como esse e fazê-lo de forma consistente em todo o aplicativo, isso não o fará bem. Você acabará em uma situação em que não está claro para os olhos novos por que esse padrão está no lugar ou, mais provavelmente, acabará em uma situação em que esse padrão foi inadvertidamente quebrado.
fonte
O que os outros disseram. 3 valores possíveis não são booleanos.
Mas você pode ter uma necessidade legítima de 3 valores. Tais como (verdadeiro, falso, desconhecido). Mesmo se esse for o caso, se você estiver em ultra-normalização, não permitirá nenhum valor nulo. Em vez disso, você armazenará um verdadeiro booleano em outra tabela com uma relação de 1 para 1. Um valor nulo pode ser produzido em uma consulta por uma associação externa "com falha", não por um valor nulo armazenado fisicamente.
fonte
false
), eles terão seu lugar. Se não, eles não existiriam. A alternativa, como mencionado, é basicamente ter uma tabela inteira com apenas a chave primária da sua linha e um único booleano (ou int, ou varchar, ou o que você tem). Para cada campo que você tornaria anulável. Embora seja relacionalmente puro, é complicado demais para a maioria dos propósitos.É
bool?
um tipo booleano? Não. É do tipoNullable<T>
ondeT
é booleano. Um booleano anulável pode ter 3 valores: verdadeiro, falso e nulo. Para usarbool
oubool?
depende de sua exigência. Pode haver uma razão legítima na qual você pode precisar usar nulo, mas um tipo que cheira a binário, mas você não sabe a resposta. No exemplo acima,User.IsActive
parece bem claro. O usuário está ativo ou não. Como sistema, talvez você queira saber se um usuário está ativo ou não. Não deve haver 'talvez'. Mas pense em algo como um sinalizador de recurso. O recurso está ativado? As respostas podem ser sim, não ou não tenho certeza. Você pode ter uma regra comercial que soletre apenas o botão quando o sinalizador estiver definido como verdadeiro. Alguém pode argumentar que bool é por padrão false, então por que criar bool anulável? Inverta o requisito: você definirá todos os valores na fonte de dados como true?fonte