見出し画像

作って役立ったデータマート

データマートと言えば「何か特定の目的のために作ったテーブル」だということは多くの人が知っているだろう。

しかし具体的にどういったテーブルなのかというとその例はあまり見かけない。

そこで具体的に過去自分で作って役に立ったなと思うデータマートについて書いてみる。

1.クライアントやサービス個別の事情を排除したデータマート(POS・行動ログなど)

1つのテーブルの中に、複数のクライアントの売上データが入っていることがある。

クライアントに限らず自社の複数のサービスや様々な行動ログといったこともある。くどいので以下「クライアント」で話を進める。

どのクライアントかはコードのカラムがあるのでレコードの判別はできるが、クライアントごとに売上や利用状況を集計して比較しようとするとそれぞれ違う条件を指定する必要がある。しかもその違いが微妙なので間違えてもエラーにならなかったする。

面倒な上にクエリがすさまじく複雑化して事故まっしぐらになるので出来るだけ簡単に使えるように事前にマート化している。ルールとしては

・カラムのルールを統一する
・統一ルールに含められないカラムは別にしておく
・利用の多いクライアントを優先する

あたり。以下もう少し詳しく紹介。

カラムのルールを統一する

これが主要な目的。売上なら税込み税抜きとか、属性なら名称などクライアントによって同じ表記でも内容が違うカラムは統一して使えるようにする。

統一ルールに含められないカラムは別にしておく

無理やり1つのテーブルに入れようとして細かい調整に時間を使うことにメリットはあまりないので、早めに見切りを付けている。このときはマートに直接JOINできるようになっていることだけは気を付けている。

内容が全然違うなら最初からテーブルそのものを分けることもある。

利用の多いクライアントを優先する

作っても滅多に使われないならどこかにメモしておけば十分間に合うので、クライアント数が多い時は利用の多いクライアントを優先して無理に全部をマートに入れない。


クライアントのデータを例に話を進めたが「1つのテーブルに複数の種類のデータが入っている」のであればどれでも同じ考えでいけるはず。

考え方そのものは複雑ではないが実際に作ると結構大変なことも多い。

2.その日はどんな日かデータマート

名前は今ふと思いついただけなので呼び方はどうでもよいのだが、その都度作っていると面倒+人によって表記がぶれるのを避けられるのがメリットなデータマート。

結合キーは日付。例えばこんなのを入れている。

年・月

YYYY、YYYYMMとかあとで集計キーに使うもの。

月末月初の日付

その日が属する月の月初と月末の日付。

翌月の開始日終了日、翌々月の開始日終了日で1年分とかも作ったことあるけどほとんど使わなかった気がする。

週開始日終了日

その日が属する週の開始日と終了日。週単位での集計に使う。週が日曜開始と月曜開始が混ざると混乱するのでみんなで決めて統一する必要あり。

曜日

日本語で日月火・・・と書いておく。

土日祝フラグ

1が土日祝で0がそれ以外。これは日本語で「平日」「土曜」とかのが良いかも。

日番号

基準日を設けてそこを第1日として通算で作る。引き算で経過日数がすぐ取れるようになるので便利

週番号

関数で作ると年単位でリセットされてしまうので、日と同じで基準日を設けてその日を含む週を第1週して通算で作る。週初めが日曜日ならば1月1日が日曜日になっているとややこしくない。これも引き算で経過週がすぐ取れるので便利

月や年は作ったことないけれども多分あったら使える。


主要なテーブルには先にJOINしておいても良いが、これも全部だとカラムが多いのでよく使うカラムを優先する。

他にもあった気がするけど思い出したら追記しよう。

3.BI/ダッシュボード用データマート

メリットは動作がとても軽くなる。デメリットはテーブルが増えて管理が面倒になる。

長いクエリを書くと数十秒から1分以上かかっているのがデータマートにしておくと1・2秒になることもざら。使えるデータは同じなので気にならない人は必要ないかもしれないけど自分はすごく気になるので良く作る。

みんなどうやってるのだろう

このデータマートを作っておきさえすれば大丈夫、とあらゆる企業に通じる方法は無いとはいえ、今回紹介したデータマートはいくつかのところで作ってみて実際に役に立った。

同じようなデータマートは実際に作っているとことも多いのではないかと思うが調べたことは無いのでこの記事を読んだ人が「うちも作ってる」とか「こういうデータマートも便利」とか反応してくれると嬉しい。

この記事が気に入ったらサポートをしてみませんか?