属性階層
スタースキーマの設計において、ディメンションテーブルの属性間の階層関係を定義することは非常に重要である。ディメンションテーブルは、データの冗長性を許容し、パフォーマンスと利便性を優先するために、非正規化された形で設計されることが多い。この非正規化された構造により、属性間の階層関係が明示的に表現されていない場合がある。
属性間の階層関係が明示的でない場合、エンドユーザーがデータの構造を直感的に理解することが難しくなる。特に、ビジネスユーザーにとっては、データの階層構造を把握することが困難になり、効果的な分析ができなくなる可能性が高い。
この階層関係のことを「属性階層(Attribute Hierarchies)」と呼ぶ。属性階層を適切に設計することで、エンドユーザーはディメンションの異なる粒度レベルでデータを分析できるようになる。属性階層を明示的に定義し、文書化することにより、エンドユーザーがデータを理解しやすくなり、ディメンションの異なる粒度レベルでデータを分析できるようになる。
属性階層を導入し、階層関係を文書化することには、以下のようなメリットがある。
- ドリルダウンとロールアップ: 属性階層に沿って、データをより詳細なレベル(ドリルダウン)や、より集約されたレベル(ロールアップ)で分析できる。これにより、エンドユーザーは分析目的に応じて必要な粒度のデータを柔軟 に取得できる。
- ユーザービリティの向上: 属性階層の関係を文書化することで、エンドユーザーはディメンションテーブルのデータ構造を直感的に理解しやすくなる。これにより、データ分析のためのクエリ作成やレポート作成が容易になる。
- クエリのパフォーマンス向上: ディメンションテーブルを非正規化することで、属性階層を用いたクエリでは結合の数を減らすことができる。これにより、必要なデータのみを効率的に取得でき、クエリのパフォーマンスが向上する。
本記事では、以下のような 3 つのディメンションテーブルを例にして、属性階層について解説する。設計時の留意点やサンプルを通じて、属性階層の理解を深めていただきたい。
属性階層の設計
属性階層の設計において、以下の点に留意することで、エンドユーザーにとって理解しやすく、分析に活用しやすい階層構造を構築することができる。適切に設計された属性階層は、エンドユーザーによるデータ理解を促進し、様々な粒度でのデータ分析を可能にする。
- 階層レベルの定義
- 属性の関連付け
- 階層の一貫性
階層レベルの定義
階層レベルを明確に定義することは、属性階層の設計において非常に重要である。各階層レベルは、データを異なる粒度で集約したり、詳細化したりするための基礎となる。
上位レベルは、下位レベルのデータを集約(ロールアップ)して、よりサマリーされた情報を提供する。例えば、「カテゴリ」レベルは、「ブランド」レベルのデータを集約し、カテゴリごとの売上高や在庫数などの情報を提供する。一方、下位レベルは、上位レベルのデータをドリルダウンして、より詳細な情報を提供する。例えば、「ブランド」レベルから「製品」レベルにドリルダウンすることで、特定のブランドに属する個々の製品の売上高や在庫数などの詳細情報を確認できる。
各階層レベルには、レベルを代表するプライマリ属性が存在する。プライマリ属性には、レベルが表す概念を直感的にエンドユーザーが理解できるように、ID やコード値ではなく、「名前」を使用することが推奨される。例えば、「カテゴリ」レベルのプライマリ属性は "category_name" とし、"衣服"、"家電" などの名称を使用する。
階層レベルを適切に定義することで、エンドユーザーがデータの構造を理解しやすくなる。各レベルは、ビジネス上の意味を持つ概念を表すため、エンドユーザーはデータの文脈を把握しやすい。例えば、「衣服」カテゴリの下に「シャツ」や「パンツ」などのブランドがあり、さらにその下に個々の製品があるという階層構造は、小売業界に関する一般的な知識があれば理解しやすい。
属性の関連付け
属性階層を設計する際には、各属性が属する階層レベルを明確にすることが重要である。プライマリ属性以外の属性は、関連する階層レベルに紐づける必要がある。
これにより、各階層レベルに関連する情報を適切に管理することができる。例えば、"brand_manager" 属性は「ブランド」レベルに関連付けることで、各ブランドの担当者を管理できる。
また、属性の関連付けを明確にすることで、クエリの効率化やデータの一貫性維持にも役立つ。例えば、「製品」レベルでデータを検索する際に、関連付けられた "sku" 属性を条件に使用することで、効率的に目的の製品を見つけることができる。
適切に設計された属性階層は、エンドユーザーによるデータ理解を促進し、様々な粒度でのデータ分析を可能にする。
階層の一貫性
属性階層を設計する際には、階層レベル間の関係が一貫していることを確認する必要がある。
まず、階層構造が論理的に正しく、矛盾がないことを確認する。例えば、「ブランド」レベルの下に「カテゴリ」レベルがあるような逆転した構造になっていないかをチェックする。
次に、上位レベルと下位レベルの関係が適切であるか、データの粒度が階層に沿って正しく設定されているかなどを確認する。例えば、「カテゴリ」レベルのデータが「ブランド」レベルよりも粒度が細かくなっていないかを確認する。
一貫性のある階層構造により、データの整合性が保たれ、エンドユーザーの理解も深まる。例えば、「カテゴリ」、「ブランド」、「製品」の階層構造が一貫していれば、エンドユーザーは直感的にデータの構造を理解し、必要な情報にアクセスしやすくなる。
階層関係の文書化
属性階層の文書化は、スタースキーマの設計と活用に関わるすべての人にとって重要である。視覚的に表現されたり、略記法で簡潔にまとめられたりすることで、属性階層はよりわかりやすくなり、エンドユーザーがデータを理解し、適切に分析するための助けになる。
属性間の階層関係を文書化する方法はいくつか存在するが、中でも視覚的に表現する方法が最も効果的である。筆者がオススメするのは、Mermaid を使用して、階層構造を ER 図風に可視化することである。以下の図では、各階層のプライマリ属性に「★」を付けて強調している。
この図を見ると、属性階層が一連の連続したマスター・ディテール関係として整理されていることがわかる。例えば、製品ディメンションの属性は、レベルごとにグループ化され、最上位の最も集約された製品ビューから、連続する詳細レベルを経て下位に移動している。カラス足は、1 対多のリレーションシップの「多」側を示している。
階層の最上位には、「ALL_PRODUCTS」と呼ばれるレベルがある。このレベルには属性が存在し ないが、製品ディメンションの完全な集約ビューを表現するために便宜上追加している。一方、階層の最下位には、「PRODUCT」と呼ばれるレベルがあり、これは階層内で最も詳細なレベルを表している。
また、属性階層を簡潔に表現するために、略記法を使用することもできる。以下の例では、各階層のカーディナリティ(インスタンス数)を括弧内の数字で示している。
- ALL_PRODUCTS (1) → CATEGORY (25) → BRAND (650) → PRODUCT (8000)
- ALL_CUTOMERS (1) → CUSTOMER (25092)
- ALL_DAYS (1) →
- YEAR (5) → QUARTER (20) → MONTH (60) → DAY (1826)
- FISCAL_YEAR (6) → FISCAL_PERIOD (21) → MONTH (60) → DAY (1826)
この略記法から、製品ディメンションには 25 のカテゴリ、650 のブランド、合計 8000 の製品があることがわかる。また、顧客ディメンションには 25092 人の顧客が存在し、日付ディメンションは暦年と会計年度の 2 つの階層で構成されていることがわかる。
ドリリング
属性階層の設計と文書化が適切に完了すると、ドリリング操作が可能になる。ドリリングとは、属性階層に沿ってデータを詳細化したり集約したりすることで、異なる粒度レベルでデータを分析する操作を指している。これは、「複数のスタースキーマ」で説明する ドリルアクロス とは全く関係のない分析手法である。
ドリリングには主に 2 つの種類がある。
- ドリルダウン: より詳細なレベ ルへとデータを掘り下げること。例えば、製品ディメンションで、カテゴリレベルからブランドレベル、さらには個々の製品レベルへとドリルダウンすることで、より詳細な売上データを分析できる。
- ロールアップ(ドリルアップ): より集約されたレベルへとデータを積み上げること。例えば、日付ディメンションで、日レベルから月レベル、四半期レベル、年レベルへとロールアップすることで、売上データを時間軸に沿って集約し、トレンドを分析できる。
単一のディメンション
| Category | Order Dollars |
| -------- | ------------- |
| Boxes | 88,561.00 |
| Mailers | 18,590.23 |
| Tape | 143,424.71 |
| Pens | 20,997.93 |
(ロールアップ)↑↓(ドリルダウン)
| Category | Brand | Order Dollars |
| -------- | --------------------- | ------------- |
| Boxes | Shipping Supplies Co. | 45,000.00 |
| | Boxco | 28,561.00 |
| | EconoBox | 15,000.00 |
| Mailers | Shipping Supplies Co. | 12,000.00 |
| | PostalPros | 6,590.23 |
| Tape | Shipping Supplies Co. | 80,000.00 |
| | TapeKing | 50,000.00 |
| | EconoTape | 13,424.71 |
| Pens | OfficeSupply Inc. | 15,000.00 |
| | PenPro | 5,997.93 |
複数のディメンション
ドリリングは、属性階層内の単一のディメンション内で行うことができるが、複数のディメンションをまたいで行うことも可能である。例えば、製品ディメンションのカテゴリレベルから、日付ディメンションの月レベルにドリルダウンすることで、カテゴリ別の月次売上データを分析できる。
| Category | Order Dollars |
| -------- | ------------- |
| Boxes | 88,561.00 |
| Mailers | 18,590.23 |
| Tape | 143,424.71 |
| Pens | 20,997.93 |
(ロールアップ)↑↓(ドリルダウン)
| Category | Month | Order Dollars |
| -------- | ----- | ------------- |
| Boxes | Jan | 23,520.20 |
| | Feb | 33,120.03 |
| | Mar | 31,920.77 |
| Mailers | Jan | 8,544.00 |
| | Feb | 7,763.01 |
| | Mar | 2,283.22 |
| Tape | Jan | 49,920.01 |
| | Feb | 29,088.37 |
| | Mar | 64,416.33 |
| Pens | Jan | 14,997.84 |
| | Feb | 2,880.01 |
| | Mar | 3,120.08 |
このように、複数のディメンションをまたいだドリリングは、データの中に隠れた関係性や傾向を明らかにし、ビジネス上の意思決定をサポートする強力なツールとなる。
例えば、特定のカテゴリにおける月別の売上推移を把握することで、季節性や市場の変化に対応した施策を立案することができる。また、製品ディメンションのブランドレベルから、顧客ディメンションの業種レベルにドリルダウンすることで、ブランド別の売上を業種ごとに分析し、販売戦略の最適化に活用することもできる。
まとめ
本記事では、属性階層の設計と文書化について詳細に解説した。属性階層は、スタースキーマにおけるディメンションテーブルの属性間の階層関係を表現したものであり、データを異なる粒度レベルで分析するための基礎となる。
属性階層の設計において重要なのは、階層レベルの明確な定義、属性の適切な関連付け、階層の一貫性の維持である。これらの点に留意することで、エンドユーザーにとって理解しやすく、分析に活用しやすい階層構造を構築する ことができる。
また、属性階層の文書化は、データウェアハウスの設計と活用に関わるすべての人にとって重要である。階層構造をわかりやすく図示したり、略記法で簡潔に表現したりすることで、属性階層への理解を深め、データ分析やシステムメンテナンスの効率を高めることができる。
さらに、適切に設計され、文書化された属性階層は、ドリリング操作の基盤となる。ドリリングによって、エンドユーザーはデータを詳細化したり集約したりしながら、多角的な分析を直感的に行うことができる。単一のディメンション内でのドリリングだけでなく、複数のディメンションをまたいだドリリングも可能であり、これによってビジネス上の意思決定に役立つ洞察を多角的に得ることができる。