ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

今日は、ジャンク ディメンションと呼ばれるデータ モデリングの概念について話したいと思います。その名前からすると、軽蔑的で避けたくなるテクニックだと思われるかもしれませんが、実際には便利なアプローチです。

実際、私はからの質問に取り組んだのですが、ジャンク ディメンションがそれに対する完璧な解決策でした。一度見て理解すると、自分の仕事に応用できることがたくさん見つかるでしょう。このチュートリアルの完全なビデオは、このブログの下部でご覧いただけます。

目次

ジャンクディメンションとは何ですか?

Kimball と Ross のThe Data Warehouse Toolkit はディメンション モデリングのバイブルの 1 つであり、これを一般にカーディナリティの低いフラグとインジケーターのグループとして定義しています。カーディナリティが低いということは、特定のフィールド内の固有の観測値の数が少ないことを意味します。

この例では、カスタム PC を構築するビジネス用のデータ モデルがあります。データ モデルは注文と請求書に関するものです。また、プロセッサのタイプ、タワー構成のタイプ (コンパクトまたはフル)、および目的(ゲームまたはワークステーション)をキャプチャできるフラグも多数あります。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

キッチンのジャンク引き出しの例えを使用してジャンクの寸法を定義する

これらの各フィールドを確認すると、各フィールドに固有の観測値は 2 つだけあります。これは、Kimball が低カーディナリティ フラグと呼ぶものです。彼は、抽象ディメンションを作成することで、ファクト テーブルからフラグを削除し、フラグを有用なディメンション フレームワークに配置できると述べています。

ジャンクの次元をキッチンのジャンク引き出しにたとえるのは適切です。輪ゴム、ホチキスの針、電池、誕生日のろうそくなどが詰まった引き出しを誰もが持っています。これらのアイテムのいずれも、専用の引き出しを持つことを保証することは重要ではありませんが、それらを置く場所を確保する必要があります。

これらを保持すると、ファクト テーブルのサイズが肥大化する可能性があります。100 万件のレコードを含むファクト テーブルがあるとします。私たちはたくさんのコンピューターを構築しましたが、構築するコンピューターごとに、プロセッサー、タワー、および目的にフラグを付ける必要があります。これは、注文された 100 万行の PC に対して、ファクト テーブルに 300 万のフラグがあることを意味します。

ファクトテーブルのサイズの削減

これらをディメンション テーブルに移動し、モデル ID のみにリンクして、ファクト テーブルから 300 万のフラグを削除できます。これを行うには、これらのフラグごとに個別のテーブルを作成すれば機能します。ただし、このプロセスではデータ モデルが複雑になるため、通常は単一列テーブルの使用は避けたいと考えられます。

理想的な解決策は、一般的な方法で関連付けられたカーディナリティの低いフラグが多数あるジャンク ディメンションを使用することです。これらはすべて、構築しているコンピューターの属性に関連していますが、特定のディメンション テーブルに対して通常行うような直接的な方法ではありません。

フォーラムのメンバーの問題を検討する

フォーラムに投稿された具体的なアプリケーションを見てみましょう。メンバーは、Stalled用とActive用の 2 つの異なるフィールドを作成したいと考えていました。クライアントが過去 45 日間にトランザクションを行った場合、アクティブとしてフラグが立てられます。それ以外の場合は、停止しているとフラグが立てられます。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

メンバーは、クライアント タイプ (複数注文または単一注文) 用の別のディメンション テーブルも必要でした。アカウントに単一のアカウント番号を使用した履歴の任意の時点で 2 つ以上のトランザクションがあった場合、そのアカウントは複数注文のクライアントとみなされます。また、特定の口座番号に対して注文が 1 つしかない場合、それは単一注文の顧客になります。

したがって、これらが私たちが開発したい 2 つのフラグです。LuckyTemplates に飛び込んで、その方法を考えてみましょう。

ジャンク ディメンションのデータ モデリング

データモデルを見てみましょう。とてもシンプルなデータモデルです。拡張されたDates テーブルTransactions テーブルがあります。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

トランザクション テーブルには、口座番号請求日販売数量の3 つのフィールドしかありません。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

一般に、変換をソースに近づけることができる場合は、そうします。これはレポート セッション中に動的ではないため、DAXで行う必要はありません。

オプションがある場合は、パワー クエリ、またはデータ ウェアハウス/SQL のいずれかで実行する必要があります。しかし今のところは、そうではなく、単にpower queryで実行していると仮定しましょう。

ジャンク ディメンションのクライアント タイプの特定

最初に行うことは、単一注文トランザクションであるか複数注文トランザクションであるかなど、クライアントのタイプを把握することです。Group ByCount、およびCount Rowsを使用します。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

次に、すべてのデータを追加し、それを「すべての行」操作にして、集計されたテーブルではなく、各行の行数を含む最初のテーブルを返すようにします。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

結果を見て展開してみましょう。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

カスタム列を追加し、それにClient Type という名前を付けて、IF ステートメントを作成できます。ステートメントは、Count が 1 に等しい場合、それは単一の注文であるということです。それ以外の場合は、複数の順序になります。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

列をテキスト型に変更するだけです。これで、2 つのディメンションのうちの 1 つがファクト テーブルに設定されました。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

2 番目の次元テーブルを完成させましょう。この場合、最新の注文が今日の日付から 45 日以内である場合、クライアントはアクティブであると見なされます。今日から 45 日以内に注文がない場合、クライアントは非アクティブになります。

カスタム列を追加し、その列にTodayという名前を付けます。次に、DateTime.LocalNowを追加して現在の日付と時刻を取得し、次にDate.From を追加して日付部分のみを取得します。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

これを日付データ型に変更し、列を先頭に移動しましょう。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

2 つの日付列の間で減算を作成する簡単な方法があります。これら 2 つの日付を強調表示し、リボンの[日付]をクリックし、 [日数を減算]をクリックするだけです。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

これにより、これら 2 つの日付の差が日数で表示されます。この新しい列に「Days Before Today」という名前を付けます。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

次のステップは、今日からの最小日数、つまり各口座番号の最新の注文を見つけることです。その数値が 45 以下の場合、アクティブになります。

もう一度Group By、次にAdvanced、次にAccount Numberを実行しましょう。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

繰り返しますが、新しい列名には「すべてのデータ」を使用し、操作には「すべての行」を使用します。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

今回は、操作として「 Minimum」を使用して「 Minimum Days Between 」を追加し、その列として「Days Before Today」を追加します。これにより、最新の注文が得られます。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

次に、 「すべてのデータ」を展開し、「口座番号」を削除します。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

これを展開すると、口座番号の最小間隔が表示されます。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

最後に、別のカスタム列を追加し、それをClient Timingという名前にします。Min Days Between が45 以下の場合はActive 、そうでない場合はStalled というWhat-if パラメーターを入力します。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

不要な列を削除する

サポートする列がたくさんあるので、[列の選択]をクリックして不要な列を削除しましょう。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

CountTodayDays Before Today、およびMin Days Between列を削除します。これで、元のファクト テーブルと、[Client Type] 列[Client Timing]列だけが得られました。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

これらをファクト テーブルに保持する代わりに、このテーブルを複製しましょう。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

重複テーブルをAccount Flagsと呼びます。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

[トランザクション] テーブルに戻り、 [クライアント タイプ] フィールド[クライアント タイミング]フィールドを取り出してみましょう。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

これで、元のファクト テーブルとアカウント フラグ テーブルが完成しました。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

Account Flags テーブルの場合、 Client Type フィールドClient Timingフィールドは必要ないので、これらを削除します。これらすべてのフィールドを強調表示し、行を削除し、重複を削除するだけです。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

これでジャンク寸法表が完成しました。残っているのは、「Close & Apply」をクリックすることだけです。次のステップは、口座フラグ テーブルの口座番号をトランザクション テーブルの口座番号に接続することです。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

Transactions テーブル (ファクト テーブル) と Account Flags テーブル (ジャンク ディメンション テーブル) の間には 1 対多の関係があります。


LuckyTemplates でデータ モデルの関係を構築する
LuckyTemplates でのデータ モデリング: ヒントとベスト プラクティス

結論

Client Timing ディメンションClient Typeディメンションをキャンバスにドロップし、スライサーに変えてみましょう。これで、メンバーが最初に実行したかったこと、つまりこれらの属性に基づいてスライスすることを正確に実行できるようになりました。

[Multi-Order] をクリックすると、複数の注文があるものだけが残り、[Single-Order] をクリックすると、1 回の購入があるものだけが残ります。

ジャンク ディメンション: それが何であり、なぜジャンク以外のものなのか

要約すると、これは基本的にジャンク ディメンションとは何か、そしてそれを作成する方法は次のとおりです。これは、効率的な方法でデータ モデルに組み込みたい、カーディナリティの低いさまざまなフラグが多数ある場合に非常に便利な手法です。

すべての行によるグループ化手法は、このようなジャンク ディメンションを作成する場合に非常に役立ちます。いつものように、これがお役に立てば幸いです。


Python における Self とは: 実際の例

Python における Self とは: 実際の例

Python における Self とは: 実際の例

RでRDSファイルを保存してロードする方法

RでRDSファイルを保存してロードする方法

R の .rds ファイルからオブジェクトを保存および読み込む方法を学習します。このブログでは、R から LuckyTemplates にオブジェクトをインポートする方法についても説明します。

最初の N 営業日の再考 – DAX コーディング言語ソリューション

最初の N 営業日の再考 – DAX コーディング言語ソリューション

この DAX コーディング言語チュートリアルでは、GENERATE 関数の使用方法とメジャー タイトルを動的に変更する方法を学びます。

LuckyTemplates のマルチスレッド動的ビジュアル手法を使用したインサイトのショーケース

LuckyTemplates のマルチスレッド動的ビジュアル手法を使用したインサイトのショーケース

このチュートリアルでは、マルチスレッド動的ビジュアル手法を使用して、レポート内の動的データ視覚化から洞察を作成する方法について説明します。

LuckyTemplates のフィルター コンテキストの概要

LuckyTemplates のフィルター コンテキストの概要

この記事では、フィルター コンテキストについて説明します。フィルター コンテキストは、LuckyTemplates ユーザーが最初に学習する必要がある主要なトピックの 1 つです。

LuckyTemplates Online Service でアプリを使用する際の最良のヒント

LuckyTemplates Online Service でアプリを使用する際の最良のヒント

LuckyTemplates Apps オンライン サービスが、さまざまなソースから生成されたさまざまなレポートや分析情報の管理にどのように役立つかを示したいと思います。

時間の経過に伴う利益率の変化を分析する – LuckyTemplates と DAX を使用した分析

時間の経過に伴う利益率の変化を分析する – LuckyTemplates と DAX を使用した分析

LuckyTemplates でのメジャー分岐や DAX 数式の結合などの手法を使用して、利益率の変化を計算する方法を学びます。

DAX Studio でのデータ キャッシュのマテリアライゼーションのアイデア

DAX Studio でのデータ キャッシュのマテリアライゼーションのアイデア

このチュートリアルでは、データ キャッシュの具体化のアイデアと、それが結果を提供する際の DAX のパフォーマンスにどのように影響するかについて説明します。

LuckyTemplates を使用したビジネス レポート

LuckyTemplates を使用したビジネス レポート

これまで Excel を使用している場合は、ビジネス レポートのニーズに合わせて LuckyTemplates の使用を開始するのに最適な時期です。

LuckyTemplates ゲートウェイとは何ですか? 知っておくべきことすべて

LuckyTemplates ゲートウェイとは何ですか? 知っておくべきことすべて

LuckyTemplates ゲートウェイとは何ですか? 知っておくべきことすべて