ネオキャリアグループ エンジニアブログ

ネオキャリアグループのエンジニアによるブログです

DB設計攻略!SQLアンチパターンを読んで

こんにちは!ぐっちです!

今回は、新卒時の研修で読んだ本について紹介します。

f:id:kabutomusi8:20170612111559j:plain

「SQLアンチパターン」という本です。
この本では、DBを扱うにあたって、

「カラムに複数の値を持つリストを格納したらダメ!」
「外部キー制約をつけていない??いずれ参照の整合性がとれなくなるよ!」

といったようなやってはいけない行為いわゆる「アンチパターン」を紹介し、 そして、それに対してどう解決するのか?といったところを解説してくれます。

今回のブログでは、僕が印象に残ったアンチパターンの 軽い紹介とそれについての感想を書きたいと思います! 初心者の方はぜひ見ていってください(^^)

1、ラウンディングエラー(丸め誤差)

これは、「FLOATデータ型で小数をDBに保存」してしまうと 起こってしまうアンチパターンです。

起こりうる問題

そもそもFLOAT型って何なの?
ということから説明します。

SQLのFLOAT型とは、 「IEEE標準754に従って実数を2進数形式でエンコードしたもの」です。

IEEE標準754とは、多くのCPUやソフトウェアで実装されている 浮動小数点数の計算の標準規格で、実数がDBに保存される際に、浮動小数点数に直された後、 それを2進数に変換して保存されるということです。

ここで問題なのが、 「10進数で記述できるすべての値を、2進数として格納できるわけではない」 ことです。

2進数に変換した際に、無限精度が必要な値が出てきてしまいます。
無限精度が必要な値とは、1/3 = 0.333....のように小数に終わりがない値のことです。

具体例でいくと、59.95という値を、2進数に変換すると、 その値は無限精度が必要な値になります。

しかし、FLOAT型では無限精度を保存することはできないので、 2進数形式で格納できる近似値を利用します。

その近似値を10進数で表すと、59.950000762939となります。

DBの中で、値が変わるんですね。

正直な所、あまり重要視しなくていいんじゃないか?と思っていました。

しかし、ある先輩に

先輩 「金融系のシステムでそれが原因で計算ミスが起きたらどうするの?(^^)」

僕  「。。。(^^)ニコ」

問題が起きたときには時すでに遅し
地獄の始まり(^^)
様々な対応にあなたは追われるでしょう(^^)

お金が関わるDBは、恐ろしいほど神経を使うのだろうなと感じました。笑

そしてDBに関わらず、アンチパターンを幅広く知ることは本当に重要です。
僕も含め、初心者の皆さんは、さまざまな状況におけるアンチパターンを 熟知しましょう。

解決策

NUMERICもしくは、DECIMAL型を用いましょう!

これら二つのデータ型は、列の定義に指定した精度で数値を格納します。
これを利用することにより数値の長さと小数点からの数字の数は限定されますが、正確に小数の値を保存できます。

正確な数値計算が要求される場合には、FLOAT型は使わずに、NUMERIC型を 利用するようにしましょう!

2 フィア・オブ・ジ・アンノウン

これは名前がすごくかっこよかったからすごい印象的でした。笑
そして、名前だけでなく、内容も興味深い内容だったので、紹介します。

これは、「NULLを一般値として使うもしくは、一般値をNULLとして使う」ときに 起こりうるアンチパターンです。

起こりうる問題

SQLでは、NULLを0,false,空文字列とは異なる特殊な値として扱います。

しかし、プログラミング言語の中には、NULLを上記の値と等しいように 扱う場合もあります。

そうなると、アプリケーション側とDB側でNULLの定義は違うので、 エラーなどか起きるのです。

実際、僕も、NULLはfalseとして扱えるというような認識を持っていました。笑
なので、プログラミング初心者の方はその認識を間違えないようにしましょう!笑

解決策

三値理論を把握し、NULLの存在意義を理解しましょう。

三値理論を簡単に説明しますと、通常の真偽値のほかにもう一つの真理値をとる論理体系で、 「未定義」や「不明」なものを表す値が追加されたものです。

正しい!や間違ってる!とは言えない「分からない」を表してるものです。

SQLでNULLを扱うのは、その値が分からない場合なのです。
たとえば、自分のプロフィールを登録するようなwebサイトがあったとします。

その中で、仮に身長・体重を登録する場所がありました。
しかし、そのサイトでA子さんは、

自分の体重は知られたくない!!!!!

と思い、登録しませんでした。

そんな時、DBには、NULLが登録されます。
実際に「分からない」値ですよね?
0ではないですよね?

間違ってもNULLのときに、0を使うなんてことはやめましょう。
しっかりとNULLを理解することが重要です。

まとめ

今回僕が紹介したアンチパターンはほんの少し。
この本には、25のアンチパターンが乗っています。

ある程度SQL文を理解していないと非常に読みづらいので、 初心者の方が買う場合は、SQLをしっかり理解した上で購入しましょう!

アンチパターンを多く知っているということは、それだけ質の高い設計ができると言うことです。
僕もより多くのアンチパターンを知り、素晴らしいプロダクトを作れるエンジニアになろうと思います!!