今年もやってきた
今年入社してきた新人が会社のシステムにも、社内のメンバーとの関係にも慣れ、自分の意見を積極的に言えるようになってきました。
そして、毎年のように議論されているあの話が、再びやってきました。
そう、データベースのカラムの型に NULL を許すか どうかです。
私は何回もこの話を話しているので、私の現在の意見をまとめておきます。
最初に結論
意味として NULL が正しい場合、NULL を許すことは 正しい 。
しかし SQL の世界は時の流れが遅く、まだ NULL の扱いは 危険 なままだ。
NULL を許容することは 正しい
主に新人たちが、こちらの意見を取ります。
新人たちは、TypeScript や Rust といった、いわるゆ NULL 安全 な言語を学んだ状態で入社、
あるいは会社の仕事でコードを書いています。
彼らは NULL を恐れません。人類はもう NULL を安全に扱えることを知っているからです。
新人たちは思います。なぜデータベースの世界では、 NULL を扱うべきなのに空文字などで代用しようとするのか?
アプリケーションとデータベースの持っている型の違いに彼らは苦しむのです。
なぜ、正しくコードを書かないのか?と...
NULL を許容することは 危険
主に古参メンバーが、こちらの意見をとります。
古参のメンバーは昔から SQL の扱いに慣れており、 NULL を扱った操作で苦しい思いをしてきました。
当時 NULL 安全といったアイデアはまだなく、たびたび期待通りに動かないバグに苦しみ、
その経験はやがて
NULL という値を受け入れること自体がバグを発生する要因なのだ
という考えに辿り着きました。
彼らの苦しみは並大抵のものではなく、 NULL撲滅委員会 なる恐ろしい会が立ち上がるほどでした。
...データベースを操作するための言語である SQL は、進化が非常に緩やかな言語です。
現状 、SQLはNULL安全な言語になっていません。 SQLの操作においる NULL の扱いは、 いまだに危険 なのです。
そのため、名前が入力されていない状態も、彼らは NULL ではなく空文字などで代用し、ひと時の安寧を得ているのです。
バグよ生まないでくれ!と...
弊社は今、どういう状態か
弊社は古いサービスを複数持っていることもあり、基本方針として 可能な限りNULLを許さない という方針をとっています。
私個人はどう思っているのか?
アプリケーション言語で SQL のクエリをラップし、安全なまま操作すればいいと思います。
Rust とか TypeScript などにある NULL 安全な ORM を使うなりしてクエリを扱えば良いです。
新しいプロジェクトなら NULL を許容し、安全な言語を介して正しく書く方が生産性は高いと思います。