Runner in the High

技術のことをかくこころみ

Datastoreでは将来の変更を見越してフラグ系もStringで格納するのがいいんじゃないか

たとえば以下みたいなデータ構造がDatastoreにあるとする

type UserSetting struct {
  UseNotification Bool `datastore:"useNotification"`
}

これはユーザーの設定として「通知をするか/しないか」を表現しているものだが、もしも仕様変更でTrue/False以外の値を設定したくなった場合には問答無用でマイグレーションを行わねばならない。マイグレーションを行うということは、アプリケーションを停止したり不整合を防ぐなどの処置をせなばならず、そこそこ負荷が大きい。

このような将来の変更を見越すのならば、以下のようにStringとするのがよい。

type UserSetting struct {
  Notification Notification `datastore:"notification"`
}

type Notification = String

const (
  On  Notification = "on"
  Off Notification = "off"
)

文字列の列挙型のような形で表現すれば真偽値と同等の表現は問題なくできる上、もし真偽値以上のデータを取りたくなった場合にも容易に対応できる。

また、文字列ではなく数値で表現(1=on, 2=off)するのはどうなんだ、という話もある。

これは実際にプロダクトで使った経験から言うと、非常にデバッグがしづらい。もちろん、文字列を使っている場合でもその文字列が正しい表現になっていなければそれまでだが、数値だと今度は「その数値がなにを表しているのか?」を知るためにコードを読んだり、別のドキュメントにマスターデータ的な対照表を用意しておく必要が出る。

「コードを読むのが一番正しい」というのは間違いないが、たとえば新人が入ってきた際にフラグが表すものを知るために1からコードを読ませるというのは相当工数の無駄だろう。もちろん、新人じゃなくたって大変だ。

RDB技術者のためのNoSQLガイド

RDB技術者のためのNoSQLガイド