표 열에서 데이터를 나타내려면 NULL 또는 빈 문자열을 사용해야합니까?

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

  •  03-07-2019
  •  | 
  •  

문제

NULL 또는 빈 문자열 - 테이블 열에서 데이터를 나타내지 않는 것이 하나보다 낫습니까? (나는 구체적으로 MySQL을 사용하지만 이것이 시스템 독립적이라고 생각합니다.) 다른 하나보다 사용하는 데 큰 장점/단점이 있습니까, 아니면 단순히 프로그래머 선호도입니까?

도움이 되었습니까?

해결책

나는 무조건 NULL을 사용한다고 말하는 모든 사람에게 강력하게 동의하지 않습니다. 열을 null로 허용하면 열을 null이 아닌 것으로 설정하는 경우 가질 수없는 추가 상태가 소개됩니다. 추가 상태가 필요하지 않으면 이렇게하지 마십시오. 즉, 빈 문자열의 의미와 NULL의 의미 사이의 차이를 제시 할 수 없다면 열을 NULL이 아닌 것으로 설정하고 빈 문자열을 사용하여 비어 있습니다. 두 가지 다른 방식으로 같은 것을 대표하는 것은 나쁜 생각입니다.

NULL을 사용하라고 말한 대부분의 사람들은 NULL이 빈 끈과 다른 것을 의미하는 예를 제시했습니다. 그리고 그 예에서 그들은 옳습니다.

그러나 대부분 NULL은 프로그래머에게 더 많은 사례를 처리 해야하는 불필요한 추가 상태입니다. 다른 사람들이 언급했듯이, Oracle 은이 추가 상태를 허용하지 않습니다. 널과 빈 문자열을 동일한 것으로 취급하기 때문에 (Oracle에서 NULL을 허용하지 않는 열에 빈 문자열을 저장하는 것은 불가능합니다).

다른 팁

없는. 빈 문자열은 "데이터 없음"이 아니며 비어있는 데이터입니다.

NULL은 더 나은 "" "실제로 데이터를 나타내고 코드에 동일하게 등록하지 않습니다.

관계형 데이터베이스 모델의 맥락에서 NULL은 "값 없음"또는 "알 수없는 값"을 나타냅니다. 그것은 당신이 묘사하는 목적을 위해 존재합니다.

업데이트 : 죄송합니다. 대부분의 (모두?) RDMBS는 NULL에 대해 동일한 정의를 사용하지만 NULL이 처리되는 방식에 미묘한 차이가 있다고 덧붙였습니다. 예를 들어, MySQL과 Oracle은 고유 한 열 (또는 열 세트)에서 여러 널을 허용합니다. NULL은 값이 아니며 고유 한 것으로 간주 될 수 없기 때문입니다 (NULL! = NULL). 그러나 마지막으로 MS SQL Server를 사용했을 때 단일 널 만 허용했습니다. 따라서 RDBMS 동작을 고려해야 할 수도 있고 해당 열이 제한되거나 인덱싱 될지 여부를 고려해야합니다.

어느 것도 아니다. 관계에서 튜플이없는 것으로 데이터의 부재를 나타냅니다.

성능의 이유로 일부 rdbms에서 조인을 피하기를 원하지만 누락 될 수있는 정보가 별도의 관계에 있도록 모델을 설계하려고 시도하십시오.

다음은 MySQL 사이트의 몇 가지 링크입니다.

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

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

나는 한 번 읽었다 NULL 값은 2 비트이며, 빈 문자열은 1 비트에 불과합니다. 시간의 99%는 아무런 차이가 없지만 매우 큰 테이블에서 중요하지 않은 경우 NULL 또는 '', 그러면 사용하는 것이 좋습니다 '' 이것이 사실이라면.

항상 null을 사용하십시오. "이 사람의 전화 번호가 무엇인지 모르겠다"(NULL)과 "이 사람이 공백을 남겼습니다"(빈)의 차이점을 고려하십시오.

작업에 적합한 도구를 사용하십시오. NULL은 값이 제공되지 않았 음을 나타내거나 (아직) 값이 없음을 의미 할 수 있습니다.

그러나 빈 문자열도 정보입니다. 그것은 값이 적용 가능하고 주어 졌음을 의미 할 수 있지만 빈 문자열입니다.

열에 null과`` '를 모두 포함하도록 허용하면 이러한 경우를 구별 할 수 있습니다. 어쨌든, 하나를 사용하여 다른 하나를 의미하는 것은 좋지 않습니다.

문자열 연결에서 Null과 결합 된 것은 NULL을 산출합니다. 예를 들면 다음과 같습니다. concat (null, 'foo')는 null을 생성합니다. SQL 표현식에서 NULL을 일부 기본값으로 변환하려면 Coalesce () 함수 사용을 배우십시오.

대부분의 시간은 Null이 더 좋습니다. 거의 차이가 거의없는 상황이있을 수 있지만 적은 상황이있을 수 있습니다. 당신이 그것을 쿼리 할 때를 기억하십시오 field = '' 동일하지 않습니다 field is null (적어도 MySQL에서).

내가 알 수있는 한, Oracle은 차이를 구별하지 않습니다.

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

열에 데이터가없는 이유를 고려하십시오. 테이블 디자인이 조잡하다는 것을 의미합니까? Nulls를 좋아하지는 않지만 Nulls가 적절한 경우 (또는 충분히 적절한 경우) 시스템은 일반적으로 죽지 않습니다. 후보 키 (기본 또는 대체 키) 인 모든 것에서는 널을 허용하지 않습니다.

널리 잡을 수있는 열에 대한 별도의 테이블과 메인 테이블의 외국 키를 만듭니다. 레코드에 해당 열에 대한 데이터가 없으면 두 번째 테이블에 레코드가 없습니다. 이것은 가장 깨끗한 솔루션이며 널을 처리하거나 빈 줄에 특별한 의미를 부여하는 것에 대해 걱정할 필요가 없습니다.

NULL은 비 가득한 곳으로 튀어 나온 곳에서 어두운 시대로 강등되어야합니다. 나는 기본값으로 쉽게 처리 할 수있는 특수 널 케이스를 처리하는 데 필요한 사소한 양의 프로그래밍이 있음을 발견했습니다.

열의 기본값을 빈 문자열로 설정하십시오. 기본 값을 할당 한 후에는 절대 발생하지 않을 가능성이 높습니다. 열 값이 null 인 경우를 무시하는 것에 대해 코드를 행복하게 쓰십시오.

내가 항상 NULL과 함께했던 큰 문제 중 하나는 "column = null"에서 "select *에서 column = null"이 항상 빈 결과 세트를 반환한다는 것입니다. Null은 Null을 포함하여 어떤 것과 동일 할 수 없습니다. Speical 키워드 "열은 NULL"이 NULL인지 확인하는 유일한 방법입니다. Null에서 돌아 오면 비교가 성공합니다 : "column = ''"7 행이 반환되었습니다.

나는 결국 NULL을 사용하여 후회하는 두 가지 주요 DB 구현을 처음부터 수행했습니다. 다음에, 나에게는 널이 없습니다!

한 가지 중요한 예외가 있습니다. Bill Karwin은 "Concat (Null, 'foo')는 대부분의 RDBMS에 해당하지만 Oracle에는 그렇지 않습니다.

위의 제임스 커란 (James Curran)이 제안한 바와 같이, 오라클은 널과 빈 줄을 정확히 동일하게 처리함으로써 표준 SQL에서 출발하는이 중요한 시점을 선택했습니다. 그러나 그것들을 동일하게 취급하는 것보다 더 나쁘지만, 실제로 연결할 때 널 이외의 다른 것을 반환함으로써 널 값의 의미를 손상시킬 수 있습니다.

구체적으로, Oracle Accat (null, 'foo')에서 'foo'를 생성합니다. 감사합니다. Oracle, 나는 이제 당신에게 중요하지 않을 수있는 널을 잃어 버렸지 만 더 많은 처리를 위해 데이터가 다른 RDBMS에 전달 될 때 차이를 만듭니다.

열의 "데이터 없음"값은 기본값으로 표시되어야합니다. NULL은 알려지지 않은 값, 즉 열에 값을 가질 수 있지만이시기에 그것을 알지 못한다는 것을 기억하십시오.

예를 들어 대출 신청 시스템에서 운전 면허 번호 필드의 NULL 값은 신청자 또는 대출 프로세서가 운전 면허 번호를 입력하지 않았 음을 의미합니다. NULL 값은 신청자가 라이센스가 없다는 것을 자동으로 의미하지 않습니다. 그는 라이센스가 있거나 없을 수도 있습니다.

모호성은 문자열 열에 대한 것입니다. 값이없는 경우 숫자 열에는 분명히 0이 포함되어 있습니다. 값 없음 문자열을 어떻게 표현할 수 있습니까? 위의 예에서 운전 면허증이없는 신청자의 경우 "없음"또는 더 나은 빈 문자열과 같은 임의의 기본값을 할당 할 수 있습니다. 일관성을 위해 다른 테이블의 기본 빈 값을 사용해야합니다.

Nulls를 원칙으로 사용하지 않는 문제에는 실제로 필수적 인 경우가 있습니다. 통계를 광범위하게 작업하는 사람으로서 데이터 제공 업체는 불완전한 데이터를 가진 데이터 세트를 제공하는 것이 일반적입니다. 예를 들어, 국가 당 GDP의 데이터 세트에서는 이전 및 후기에 누락 된 GDP 수치를 찾을 수 있습니다. 한 가지 이유는 그 해에 국가 정부의 공식 데이터가 없기 때문입니다. GDP가 0 (duh!)이라고 결론을 내리고 추출 된 데이터 또는 그래프에서 값이 0이라는 결론을 내릴 수 있습니다. 올바른 값은 NULL이므로 아직 데이터가 없습니다. 최종 사용자는 추출 된 데이터와 그래프에서 누락 된 데이터 포인트를 0이 아닌 것으로 올바르게 해석합니다. 또한, 특히 평균을 할 때 계산에 오류가 발생하지 않습니다.

이론적으로 의미가있는 일부 "규칙"은 실제로 귀하의 경우에 가난하거나 잘못된 해결책이 될 것입니다.

나는 참조 무결성에 도움이 될 null 값을 발견했습니다. MySQL의 경우 필드가 null로 설정된 경우 삽입물에 데이터를 설정해야합니다. 그렇지 않으면 NULL은 가능한 값이며 외국의 주요 제약 조건이 시행되지 않습니다.

  1. ID : 기본 키
  2. product_id : 외국 키가 null이 아닙니다
  3. ref_id : (nullable)

ID 및 Product_ID 영역은 항상 필요합니다. ref_id는 null로 설정할 수 있습니다. 그러나 다른 값이 사용되면 외국 키 제약 조건을 충족해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top