どんなデータマートをどういう組み合わせで作ればいいのかの選択肢を考えてみる

データマートは情報が少ないので増やそう

毎回巨大なデータベースから取得しようとすると時間もかかるし環境次第ではコストもかかる。そこで必要に応じてデータマートを作るわけだが、前回のデータマートの作り方でも書いたように、データマートという言葉は有名でも具体的に何をどうしたらいいのかという情報が皆無。

なのでどんな選択肢があるかや自分がどうしているかについて書いておくと誰かの役に立つこともあるかもしれないので、書いてみようということで今回はどんなデータマートが考えられるかと、どう組み合わせるとどんなメリットデメリットがありそうかについてまとめてみる。

どんなマートが考えられるか

テーブルがあってその中で区別を付ける何かがある(店舗マスタなら開店中かどうか、会員情報なら会員かどうかなど)という状況を前提に考える。マートは作らないという選択肢もあるがそれは別の問題なので今回は作ることを前提にしておく。

また、地域の区分があってそれぞれ担当者がいるから地域別マートが欲しいとか言い出したらきりがないので区分が複数とかは考えない。

さて、どんなマートを作るとよさそうか。

整備だけしたのマート

1つ目は絞り込みなどしないで整備だけしたマートだ。マスタそのままでもいいのでは、という意見もあるだろうが、テストやダミーを抜くのと区分をidではなく文字にしたり、店舗マスタなら直近の来客数や売上などを入れておくと何かと便利なので作って損はないと思う。

必要な区分は例えばフラグで1/0を持たせておき、絞り込んだデータを使いたければwhere句を使う。

なんだかこれだけあれば済みそうだけど、そうでもない。

絞り込みしたデータ

開店中の店舗だけ、会員だけなど絞り込みした上でデータを利用することはよくある。なので絞り込みしたデータだけをもつマートが考えられる。これならWhereを忘れて集計を間違えるということは無くなる。

条件が1つだけならば考えられるマートとしてはこの2種類ぐらいだ。

どんな組み合わせで作ればいいのか

先ほどの整備しただけのマートを「整備マート」、絞り込みしたマートは「絞り込みマート」と呼ぼう。するとパターンとしては

  • 整備マートを1つ
  • 整備マートと絞り込みマートの2つ
  • 整備マートと絞り込みマート2つで合計3つ
  • 絞り込みマートを1つ
  • 絞り込みマートを2つ

といったところか。メリットデメリットはそれぞれありそうなので状況と合わせて考えてみよう

整備マートを1つ

普通に考えたらこれが素直。唯一のデメリットは毎回絞り込みする際はwhereを付けることが必要で、ということはうっかり忘れられやすい。

会員データへの絞り込みなら明らかに数値に違いがあるので気づきやすいのだが数値の感覚がない人には難しいし、現在開店中の店舗のように大きな差異が出ない時には慣れていても気づきにくい。

なので絞り込みしたマートも欲しくなる。

整備マートと絞り込みマートの2つ

絞り込みデータをよく使う場合、ましてやほぼ絞り込みマートばかり使う時は全データが入っている整備マートで毎回Whereを書くよりも別にマートを作るほうが便利なのだが、データ量が倍近くになるのは問題だ。

高々数万レコードしかない店舗マスタならともかく、会員データやトランザクションで同じことをするとコストがかさむ。言い換えればコスト面での制約があまりないのであれば両方作ってもよさそう。

何か修正が入った場合でも整備マートを先に作っておいてそこから絞り込みマートを条件で絞り込むだけにしておけば両方修正したりする必要がないので忘れることもない。

整備マートと絞り込みマート2つで合計3つ

ある条件(会員など)で絞り込んだマートと整備データには条件に合致しないレコードの差分が出来るが、それもマートにする方法も考えられる。

データ量が2倍になるのと、たぶん作ってもあまり使われない気もする。会員非会員で取れるデータが違うのでそれぞれ別な分析をするといった場合か。

今まで作ったことがないのだけれど作っている人いるのだろうか。

絞り込みマートを1つ

ここまでは整備マートを作ること前提だったが別に作らなければいけないということもない。全データが必要な場合は元データから作ればよい。

メリットはデータ量がかなり抑えられることがある。トランザクションであれば期間を絞ったマートならかなり小さくなる。また絞り込み条件を忘れなくて済む。

デメリットは全体を使いたい時にすぐ使えない。通常使うのが絞り込みマートだけで滅多に全体を使わない時にはこの方法がいいだろう。

絞り込みマートを2つ

全体は時々使うけれども整備マートを作っておくほどでもないかデータ量は抑制したい時は、絞り込みマートと別に整備マートとの差分のマートを作っておくのはどうか。全体が必要ならunionする。

整備マートを作らないので修正が発生した場合は個別にやらないといけないのはデメリット。

結局のところは状況次第

どんなマートを作るのがいいのか、と考えてみると選択肢が結構ある。どれが一番かという質問はデータ分析が特定の人の特定の問題の意思決定のためにまでならないと意味がないのと同じで状況次第だ。

その状況もデータ量、利用頻度、予算、利用者のリテラシーなど実に多くの変数があって、いくつかのやり方までは標準化したりアンチパターンをまとめることはできても、あらゆる状況に適応できる方法はないだろう。

まぁそうだよね、ぐらいの話に落ち着いてしまったがこういった簡単な話もいままでどこにもなくて自分が困っていたので、1つの参考にでもなれば幸いだ。