株式会社スマレジの開発部でスマレジのサーバサイドを作っています

SQLでValidation

こんにちは!株式会社スマレジ、エンジニアのmasaです。

ぐっと気温が下がってきましたねー。つい2週間くらい前までは半袖の社員さんも多かったですが、今週はブレザー姿も増えてきました。気温の差が大きい時期なので皆様も体調にはお気を付けください。 今日は仕事中に教えてもらったテクニックを一つご紹介したいと思います。

MySQLでValidation

Validationとはソフトウェア開発では入力値チェックのことを指します。 フォーム、もしくはCSVやリクエストから入力される値が想定されたフォーマットになっているかを検証する処理を指すことが多いです。 CakePHP等のフレームワークを使って開発をしていると、Validation条件を記載するファイルやPHPがあると思います。 フォームの入力内容のValidationの場合はそれほど問題にはならないのですが、CSVやWebAPI連携の場合、大量のデータの検証を行うため、Validation処理に時間がかかってしまうことがあります。 これを高速化するために、ValidationをPHPではなくDBMSを使おうというのが今回のネタです。

考え方

例えば、「符号なし整数10桁以下のユーザID(必須)」について、「1以上で10桁以内の整数が渡ってきているか」を検証します。

  1. 送られてきたリクエストを一時テーブル(ここではtmp_users)に保存する。
  2. 保存した一時テーブルに下記のようなSELECT文を発行する。
SELECT 
   id
FROM 
   tmp_users
WHERE
   id = 0 OR --// MySQLでは文字列を数値比較すると0になるので
   CHAR_LENGTH(id) = 0 OR --//空文字チェック
   id > 10000000000 --// 10桁の整数かどうか。
;

WHERE句の指定からわかるようにここでヒットしたリクエストはバリデーションエラーになります。 実際にシステムに組み込むなら、別に検証結果用の一時テーブルを用意しておいてやることになると思います。 ちょっとした発想の転換ですが、こうすることで、DBMS側で検証処理を行うことができるので、 Webサーバ側でやるよりも格段に高速化できる場合があります。