
ThoughtSpotのデータモデル結合ルールについて解説します。
こんにちは!ShintaroInomataです。
本記事では、データモデルエディターの設定タブにある、データモデル結合ルールについて解説します。
「結合を段階的に適用」には「(ほとんどの場合に推奨)」と記載されているため、「よく分からないけど、とりあえずこっちを選んでおこう」と設定している方も多いのではないでしょうか?
もちろん「結合を段階的に適用」で問題はありませんが、その仕組みや意味を理解しておくことで、より適切な検索が可能になります。
最初に結論を言うと、
結合を段階的に適用:検索に含まれる列を持つテーブルに対してのみ、結合が適用
全ての結合を適用:検索に含まれるかどうかにかかわらず、全てのテーブルに対して結合が適用
となります。
ただ、これだけではイメージしにくい部分もあるかと思いますので、それぞれの設定が実際にどのような挙動をするのかご紹介します。
検証データの説明
まず、今回の検証に使うデータについて説明します。
売上明細はファクトテーブル、製品マスタはディメンションテーブルとして扱い、両者は「product_id」をキーに結合されます。
このデータの特徴として、製品マスタの「product_id=106」は売上明細に含まれておらず、一度も売れた実績がないことが分かります。
結合を段階的に適用
モデルの作成
「結合を段階的に適用」に設定したモデルを作成していきます。
まず、テーブルタブで結合の設定を行います。左側を売上明細(ファクトテーブル)、右側を製品マスタ(ディメンションテーブル)を選択し、Join Typeは「内側(Inner Join)」、カーディナリティは「多対一」に設定します。
次に列タブの設定です。
「Product Id」と「Product Name」をディメンションテーブルから、「Revenue」をファクトテーブルから選択します。
最後に、設定タブで「結合を段階的に適用」が選択されていることを確認したら、モデルの作成は完了です。
挙動の確認
次に作成したモデルを使って検索を行います。
まず、「Product id」と「Product Name」を検索バーに入力し、テーブル形式で表示します。
ディメンションテーブルにのみ存在する「product_id=106」が含まれており、全体で6行が表示されています。
次にクエリビジュアライザーを確認してみます。
ディメンションテーブルの列が選択されているだけで、他のテーブルとの結合は行われていないことが分かります。
次に「Revenue」を検索バーに追加します。
すると、先ほどの6行から5行に減り、「product_id=106」が表示されなくなったことが分かります。
クエリビジュアライザーを確認します。
「Revenue」はファクトテーブルに存在する列のため、検索に追加すると、モデルで設定したとおりにディメンションテーブルとの結合が実行されます。
「product_id=106」はファクトテーブルに存在しないため、結合が成立せず、表示されません。これが「結合を段階的に適用」の挙動になります。
すべての結合を適用
モデルの作成
「すべての結合を適用」に設定したモデルを作成していきます。
モデルの設定タブで「すべての結合を適用」を選択し、それ以外の設定(テーブルの結合条件や列の選択など)は先ほどと同様にしてモデルを作成します。
挙動の確認
検索を行っていきます。先ほどと同様に、「Product id」と「Product Name」を検索バーに入力します。
先ほどは、ディメンションテーブルの「Product Id」と「Product Name」を検索バーに入力した際、ディメンションテーブルにのみ存在する「product_id=106」も含まれ、全体で6行表示されていました。
しかし今回は、同じ条件で検索しているにもかかわらず、表示されたのは5行のみで、「product_id=106」は含まれていません。
クエリビジュアライザーを確認します。
ファクトテーブルの項目を検索バーに入力していないにもかかわらず、結合が強制的に適用されています。
そのため、ディメンションテーブルにのみ存在する「product_id=106」はファクトテーブルと結合されず、表示されません。結果として表示件数は5行となりました。
これが、「結合を段階的に適用」と「すべての結合を適用」の大きな違いになります。
当然ながら、「Revenue」を選択しても、表示結果は変わりません。
まとめ
基本的には、推奨されている「結合を段階的に適用」を使用して問題ありません。この設定では、検索で使用された列に関連するテーブルのみが結合対象となるため、不要な結合が行われず、柔軟な検索が可能です。
一方で、「すべての結合を適用」は、検索で使用された列にかかわらず、あらかじめモデルで設定された結合が常に適用されるため、結合条件に一致しないデータは検索結果から除外されます。特定の条件に一致するレコードのみを厳密に抽出したい場合などに有効です。
ちなみに「すべての結合を適用」を設定していても、件数の多い方(今回の例ではディメンションテーブル)に対してOuter Joinを設定すれば、「結合を段階的に適用」と同様に全件表示されます。
一見すると些細な違いに思えますが、検索結果の件数や内容に影響を及ぼす部分ですので、それぞれの動作を正しく理解しておくことが重要です。
参考URL
ThoughtSpotドキュメント:https://docs.thoughtspot.com/cloud/10.9.0.cl/worksheet-progressive-joins
※2025/05/30時点の情報です(バージョン10.9.0.cl-65)