부울 데이터베이스 필드에 False를 Null로 저장해야합니까?


20

User테이블에 부울 필드가있는 응용 프로그램이 있다고 가정 해 봅시다 Inactive.

false를 null로 저장하면 본질적으로 잘못된 것이 있습니까? 그렇다면 단점이 무엇인지 설명해 주시겠습니까? 몇 달 전에 누군가 와이 문제를 논의했으며 앱 / 데이터베이스 전체에서 일관되게 수행하는 한 중요하지 않다는 데 동의했습니다. 최근에 내가 아는 사람은 "참" true이거나 false사용되어야한다고 강조 했지만 실제로 그 이유에 대해 설명하지는 않았습니다.


25
Wikipedia에 따르면 Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the database 이것이 받아 들여지는 지혜이며 응용 프로그램에서 Null의 의미를 재정의해서는 안됩니다. 코드를 다루는 다른 모든 사람들에게 혼란을 줄 것입니다.
PersonalNexus

10
왜 이걸하고 싶니? 널 (null)이 아닌 비트 필드를 사용하고 문제를 3 상태 필드와 혼동하는 대신 원하는 동작 인 경우 기본값을 false로 설정하지 않는 이유는 무엇입니까?
JohnFx

5
그것이 왜 그렇게 나쁜 생각인지에 대한 실제 예 : SELECT * FROM foo WHERE bar = FALSE기대하는 결과를주지 않습니다.
Blrfl

2
부울 대신 기본값이 0 인 int 열을 사용하십시오. 이런 방식으로 새로운 조건이 발생하면 (예를 들어 '보류'상태) 데이터베이스 구조를 변경할 필요가 없습니다.
GrandmasterB

4
그러나 false를 null로 저장하면 FILE_NOT_FOUND를 어떻게 저장합니까?! ( thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx )
Ed James

답변:


50

false를 null로 저장하면 본질적으로 잘못된 것이 있습니까?

예.

그렇다면 단점이 무엇인지 설명해 주시겠습니까?

NULL은 False와 다릅니다.

정의에 따라 NULL과 관련된 비교 (및 논리)는 NULL 값 (False 아님)을 반환해야합니다. 그러나 SQL 구현은 다를 수 있습니다.

True and NULL NULL (False 아님)입니다.

True and NULL or False NULL (False 아님)입니다.

http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29

http://technet.microsoft.com/en-us/library/cc966426.aspx


3
왜 NULL이 값이 없는지를 나타내는 값인지에 대한 간결한 설명.
maple_shaft

2
처음으로 개발 작업의 첫 번째 날, 추억 +1 디버깅이 질문 / 대답처럼 오류를 수정 관련
tsundoku

1
링크 된 기사 null는 논리와 관련 이 없으면 ( whatever OR TRUE또는 의 경우와 같이 whatever AND FALSE값을 whatever변경할 수 없는 경우 ) 표현식이 값을 반환 한다고 말합니다 . 최적화가 아닙니다. 그건 논리가 작동을 값 3 방법 . 이러한 표현식에 대해 UNKNOWN/ NULL를 반환한다고 주장하는 모든 DBMS 는 근본적으로 손상되었습니다.
cHao

1
@ S.Lott, false 대신 null을 저장하지 않고 공간을 절약하십시오 ??
azerafati

2
@Bludream : 부울의 경우 DBMS에 따라 널 입력 가능 필드가 실제로 더 많은 공간을 차지할 수 있습니다 . (거의 모든 경우에 무시할만한 양입니다.) 부울은 단일 비트로 표현 될 수 있지만 nullable 부울은 세 가지 가능한 값 (true, false 및 null)을 가지므로 둘 이상의 비트가 필요합니다.
cHao

15

부울 필드에 널 (null)을 허용하면 의도 된 이진 표현 (true / false)이 '널 (null)'항목이 결정되지 않은 3 상태 표현 (true, false, null)으로 전환됩니다. '널'값은 적절하게 '참'또는 '거짓'이 아닙니다. 부정확 한 표현을 보강해야하는 이유는 무엇입니까?

이와 같은 패턴을 결정하고 애플리케이션 전체에서 일관되게 수행하더라도 괜찮지는 않습니다. 왜 그 패턴이 존재하는지 왜 신선한 눈이 분명하지 않은 상황에 처하게되거나, 아마도 그 패턴이 실수로 파손 된 상황에 처하게 될 것입니다.


5

다른 사람들이 말한 것. 3 개의 가능한 값은 부울이 아닙니다.

그러나 3 가지 가치가 합법적으로 필요할 수 있습니다. (참, 거짓, 알 수 없음) 이 경우에도 초 정규화를 수행하는 경우 null 값을 전혀 허용하지 않습니다. 대신 다른 테이블에 1 : 1 관계로 실제 부울을 저장합니다. 물리적으로 저장된 null 값이 아니라 "실패한"외부 조인을 통해 쿼리에서 null 값을 생성 할 수 있습니다.


내 부울 질문의 영역 밖에서 null을 사용하여 true false unknown을 사용하는 경우 왜 나쁜 것입니까? 내 질문 외에도 일반적으로 null을 피해야합니까? 왜?
Ominus

3
@Ominus : 순수 주의자라면 일반적으로 널을 피해야합니다. 그들이 사용되도록 의도 된대로 (가짜가 아닌 "여기에 가치가 없다" false), 그들은 자리를 차지한다. 존재하지 않으면 존재하지 않을 것입니다. 언급 한 것처럼 대안은 기본적으로 행의 기본 키와 단일 부울 (또는 int 또는 varchar 또는 무엇을 가지고 있는지)이있는 다른 모든 테이블을 갖는 것입니다. 그렇지 않으면 각 필드마다 널 입력 가능하게 만듭니다. 관계 적으로 순수하지만 대부분의 경우 너무 복잡합니다.
cHao

-3

bool?부울 유형은? 아뇨 유형 인 부울입니다. 널 입력 가능 부울 값은 true, false 및 null의 3 가지 값을 가질 수 있습니다. 사용 하거나 요구 사항에 따라 다릅니다. 널 (null)을 사용해야하지만 이진 냄새가 나지만 정답을 모르는 형식을 사용해야하는 합법적 인 이유가있을 수 있습니다. 위의 예에서Nullable<T>Tboolbool?User.IsActive분명한 것 같습니다. 사용자가 활동 중인지 아닌지. 시스템으로서, 사용자가 활동 중인지 아닌지를 알고 싶을 수도 있습니다. '아마도'없어야합니다. 그러나 기능 플래그와 같은 것을 생각하십시오. 기능이 켜져 있습니까? 대답은 예, 아니오 또는 확실하지 않을 수 있습니다. 플래그가 true로 설정된 경우에만 버튼을 표시하는 비즈니스 규칙이있을 수 있습니다. bool이 기본적으로 false라고 주장 할 수 있으므로 nullable bool을 만드는 이유는 무엇입니까? 요구 사항의 반대 : 데이터 소스의 모든 값을 true로 설정 하시겠습니까?


2
이 게시물은 읽기 어렵습니다 (텍스트의 벽). 더 나은 형태로 편집 하시겠습니까 ?
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.