DB 칼럼에 Null 허용을 해야 하는 이유를 알고 싶습니다
저는 모든 칼럼은 not null이어야 한다고 생각합니다. 그것이 상식적이기 때문입니다.
우리가 타입을 선언할 때 string, int, float 등으로 선언하는 이유는 경우의 수를 좁히기 때문이라 생각합니다. 예를 들어 숫자만 들어가는 타입을 string으로 선언하면 콤마같은 값이 들어갈 경우가 생깁니다.
Null을 허용하면 경우의 수가 늘어납니다. 그리고 Null을 허용함으로 생기는 경우는 전혀 상식적이지 않습니다. 그건 소숫점 단위가 생기지 않는 숫자 타입을 float로 선언하거나, 이름같이 짧은 값을 넣는데 길이가 무제한인 varchar(max), text 등을 선언하는 것과는 다른 경우입니다.
Null은 문자열도 숫자도 아닌 모든 타입의 최상위 타입인 null 타입이라 보는게 맞다고 봅니디. 이것을 허용하는 순간 null이 모든 타입 위에 군림하기 때문입니다. 즉, 기껏 문자열만 허용하려고 varchar를 선언했는 데 null 허용이면 이 칼럼에선 항상 null이란 조건을 항상 염두에 둬야 합니다.
이 칼럼이 다른 칼럼과 결합할 때는 isnull, nvl, coalesce 등의 null 여부의 체크를 해야 합니다. 예를 들어 coalesce(f1, ‘‘) || f2 같이 하지 않으면 f1이 null이면 결과가 null이 나올 수 있기 때문이죠. 빈 값을 검색하려면 공백은 물론 null 여부도 where f1 = ‘‘ or f1 is null과 같이 추가로 체크해줘야 합니다. 예외적으로 공백과 null을 같이 취급하는 oracle에선 다루는 방식이 달라지긴 합니다.
Null을 허용하지 않아야 하는 이유는 너무 많습니다. 그런데 제가 그런 수많은 이유들을 말하면 대부분의 개발자들은(10년 이상된 고인 물일 수록 더) 받아들이지 않습니다. 대부분은 이유를 말하지 않고, 이유를 말해도 메모리를 적게 차지한다든지, 초기값은 null이어야 한다든지 하는 제가 받아들일 수 없는 논리만 얘기를 합니다. 제가 보기에 대부분은 create table 문에서 명시하지 않으면 not null이 아닌 null이 기본값이라 습관적으로 null을 허용해왔고 그냥 익숙하기 때문에 바꾸지 않는 거라 생각합니다.
만약 그렇지 않다면 null 허용을 해서 더 좋은 이유를 제게 이해시킬 수 있는 분이 있을까요?