PR

Excelでリレーショナルデータベース(RDB)を作る【テーブル間を関連付け】

Thumbnail for Excelでリレーショナルデータベース(RDB)を作る【テーブル間を関連付け】
  • 「マスタデータの更新時に、書き換え箇所が多くて手間がかかる…」
  • 「より効率的にデータ管理を行いたい…」
  • 「Excelでリレーショナルデータベースを構築できないだろうか…」

Excel(エクセル)でも、複数のテーブルを共通のキーで関連付けることにより、疑似的にリレーショナルデータベース(RDB)のように運用できます。

本記事では、Excelにおけるデータの正規化の手順と、関数・Power Query・データモデルを用いたテーブル結合の手法を解説します。

前提知識|RDBの仕組みと「テーブルの分割・紐づけ」の基本

 

リレーショナルデータベース(RDB)とExcelフラットテーブルの違い

テーブルの結合方法を理解するには、RDBとフラットテーブルの違いを知っておく必要があります。

リレーショナルデータベース(RDB) とは、データを複数の独立した表(テーブル)に分割し、共通の識別子(キー)を介して相互に関連付け(リレーション)を行うデータ管理方式です。データの重複(冗長性)を排除し、不整合(データの矛盾)を防ぐ構造を持ちます。

一方、Excelでよく使われる、1つのシートにすべての情報をまとめた形式は、一般的に 「 フラットテーブル (単一の表) などと呼ばれます。これは、1つのテーブル内に顧客名・商品名・売上金額・部署名などの全データを単一の行(レコード)に詰め込んだデータ構造を指します。

両者の違いを以下の表にまとめました。

項目リレーショナルデータベース(RDB)Excelフラットテーブル
データ保持形態役割ごとに分割された 複数 テーブル単一 のシート(2次元の表)
データの冗長性マスタデータの一元化により排除同一データ(名称等)が複数行に重複して出現
データ変更時の影響マスタの1箇所を変更すれば全データに反映全重複箇所の修正が必要(修正漏れのリスク有)
最大レコード数数百万〜数億行以上1シートあたり最大 1,048,576行
複数人同時編集レコード(行)レベルの排他制御により可能ファイルロックがかかり原則、同時編集不可
 

実現方法:疑似RDB運用のためのテーブルの「分割」と「紐づけ」

Excelで疑似的にRDB運用をするには、次の2ステップを踏みます。

  • ステップ1. テーブルを分割(正規化)してデータ管理する
  • ステップ2. テーブルを紐づけ・結合してデータ利用する

テーブル同士を結びつけるときには、「主キー」と「外部キー」という概念を使います。

  • 主キー(プライマリキー / Primary Key)
    テーブル内で各レコードを「一意(ユニーク)に識別するためのフィールド。重複する値(ダブり)や空白(Null)は許容されない。
    • 例:社員ID、商品コード、顧客ID。
  • 外部キー(フォーリンキー / Foreign Key)
    別のテーブルの主キーを参照するために、自テーブル内に配置するフィールド。これによりテーブル間のリレーション(関連付け)が成立する。
    • 例:売上テーブル内の「商品コード」

マスタテーブルのみを複数のブックで使い回すだけでもデータを一元管理でき、データ活用が大きく進みます。Excelでの具体的な方法については下記にまとめました。

本記事では、単一のテーブルのみの利用でなく、複数のテーブルを関連付けて使用するところまでを取り扱います。

テーブルの分割|正規化によるマスタとトランザクションの分離

 

正規化とは

データベース設計では、テーブルの分割を行うことで、 データの繰り返しを減らし データ量の削減、 マスタデータのメンテナンスの効率化 と不整合の防止を図ります。この「テーブルを適切に分割すること」を「 正規化と呼びます。

正規化によって作られるテーブルの種類は、主に以下の2種類です。

  • 商品情報などの「属性」データを格納する マスタテーブル
  • 売上などの「イベント」の記録データを格納する トランザクションテーブル
格納データテーブルの種類テーブル名のプレフィックス(接頭語)
属性マスタ(ディメンション)M_(Master)商品リスト、顧客台帳、名簿
イベントトランザクション(ファクト)T_(Transaction / Table)売上明細、入出庫履歴、ログデータ
 

マスタテーブルとトランザクションテーブルの例

以降の説明で使用する具体例を示します。

※ 以降の説明では、データをテーブル化している前提で進めます。

【マスタテーブル】

テーブル名M_商品

商品コード商品名単価
P-01ノートPC120,000
P-02モニター35,000
P-03マウス5,000

【トランザクションテーブル】

テーブル名T_売上明細

売上ID日付商品コード数量
10012026/6/1P-011
1002P-032
10032026/6/2P-021
1004P-013
マスタとトランザクションの例

M_商品 がマスタテーブル、T_売上明細 がトランザクションテーブルに該当します。T_売上明細 内の「商品コード」が外部キーとなり、M_商品 の主キー「商品コード」を参照する構造です。

テーブルの結合|複数のExcelテーブルを紐づける3つの手法

Excelで複数のテーブルを紐付ける手法には、主に 3つ の方法があります。

  • 手法①. 関数による「XLOOKUP / VLOOKUP(動的参照)
    • セル単位で他の表からデータを検索・転記する、従来からある最も身近な手法。
  • 手法②. Power Queryによる「マージ(物理結合)
    • 2つの表を特定のキー(IDなど)をもとに横方向へ合体させ、 1つの新しいフラットな表 を作り出す手法。SQLのJOINやVLOOKUP関数の処理を自動化・高度化したもの。
  • 手法③. データモデル(Power Pivot)による「リレーションシップ(論理関連付け)
    • 表を合体させず、それぞれ 独立した状態のまま共通のキーで「繋がり(関係性)だけを定義 する手法。AccessなどのRDBの仕組みに最も近い。シート上にはピボットテーブルとして出力できる。
 

各手法の使い分け基準

上記の3つの手法は、「最終的にテーブル(表)として出力したいのか」「ピボットテーブルで集計・分析したいのか」という 目的 や、 データ量 によって使い分ける必要があります。

評価項目③ 関数:XLOOKUP等① Power Query:マージ② データモデル:リレーションシップ
最終出力通常のセル結合済みの 1つのテーブル / ピボットテーブルピボットテーブル
データ量(目安)🔴 数千行程度(小規模)🟡 数万行〜数十万行程度🟢 数十万〜数百万行以上(大量データ)
処理速度・負荷🔴 行数・関数が増えるとExcelが極端に重くなる🟡 行数が増えると更新に時間がかかる🟢 インメモリエンジンにより高速・軽量
データの状態セル内に他表の値が転記される物理的に1つに合体する独立した状態を維持する
追加のデータ整形🟢 各自セル上で行える🟢 可能(結合後にさらに列加工ができる)🟡 不可(集計やDAX計算がメイン)
 

使い分けの判断フロー

テーブルを結合するときにどの手法を使うかは、以下を基準に考えるとよいでしょう。

  • 「数千行程度の小さな表で、その場でパッと1〜2つの項目だけを別表から持ってきたい」
    • ⇒ 手法③ 関数(XLOOKUP等)
  • 「結合した後に、さらに列の分割や条件フィルターなどの加工を加えて、最終的に1つの表としてシートに出力したい」
    • ⇒ 手法① Power Queryのマージ
  • 「集計画面(ピボット)だけがあればよく、データ量が数十万行以上ある」
    • ⇒ 手法② データモデルのリレーションシップ。

      表を合体させないため、データの重複(冗長性)が発生せず、ファイルサイズを小さく抑えられる。

手法①|関数(XLOOKUP)による疑似リレーション

XLOOKUP関数やVLOOKUP関数、INDEX+MATCH関数を使えば、疑似的にテーブルを結合できます。ここではXLOOKUPを例に取り上げます。

 

XLOOKUP関数の構文

=XLOOKUP(検索値, 検索範囲, 戻り範囲, [見つからない場合], [一致モード], [検索モード])

今回の例における各引数の指定内容は以下の通りです。

  • 検索値T_売上明細(トランザクションテーブル)内の外部キー「商品コード」が入ったセル
  • 検索範囲M_商品(マスタテーブル)内の主キー「商品コード」の列
  • 戻り範囲M_商品(マスタテーブル)内の取得したい値(「商品名」や「単価」の列
 

操作手順

  1. T_売上明細 テーブルの隣に「商品名」列を作成する。
  2. セルに以下の数式を入力する。
=XLOOKUP([@商品コード], M_商品[商品コード], M_商品[商品名])
吉峰
吉峰

テーブルの構造化参照を使うと、行が増減しても自動的に数式の範囲が追従するため、手動でのメンテナンスが不要になります。

手法②|Power Queryのマージによる物理結合

Power Queryはテーブル単位でデータの加工が行え、「マージ」により2つのテーブルを結合し、1つのテーブルとして出力できます。

 

操作手順

  1. データの取り込み:結合したい2つの表(M_商品T_売上明細をPower Queryエディターに読み込む。
  2. マージの実行:[ホーム] タブ > [クエリのマージ] を選択する。
  3. キーの指定:2つの表のプレビュー画面が表示されるので、共通するキー列(「商品コード」をそれぞれクリックして選択する。
  4. 列の展開:マージすると、相手方の表が「Table」という形式で右端に結合される。セルの右上にある展開アイコンをクリックし、相手方の表(M_商品から必要な列(「商品名」や「単価」など)だけを選択して展開する。
  5. 読み込み:整形が終わったら、[閉じて読み込む] を押してExcelシートに「テーブル」として出力する。

詳細は下記の記事にまとめています。

手法③|データモデル(Power Pivot)によるリレーションシップ

データモデルの「リレーションシップ」は、テーブル間に紐づけを設定するPower Pivotの機能です。Power PivotはExcelの標準的な行数制限を超えた大規模データの分析にも対応しています。

 

操作手順

STEP1

データモデルへの追加

テーブルのセルを選択し、[Power Pivot] タブ > [データモデルに追加] を選択し、M_商品T_売上明細 の両方をデータモデルに追加する。

STEP2

リレーションシップの定義

以下のいずれかの方法で、テーブル間のリレーションシップを設定する。

通常のExcel画面上での設定:

  1. [データ] タブ > [リレーションシップ] を選択する。
  2. [新規作成] をクリックし、関連付けるテーブル(T_売上明細M_商品および列(「商品コード」を選択する。

Power Pivotエディター上での設定:

  1. Power Pivotエディターの [ホーム] タブ > [ダイアグラムビュー] を開く。
  2. 関連付けるテーブル間のキー列(「商品コード」をドラッグ&ドロップで線をつなぐ。
STEP3

ピボットテーブルの作成

  1. [挿入] タブ > [ピボットテーブル] > [データモデルから] を選択する。
  2. M_商品 の商品名」をピボットの行に配置し、T_売上明細 の数量」を値に配置する。

これにより、テーブル間を紐づけたクロス集計が可能になります。

発展|外部マスタを結合するデータフロー

社内の共通マスタなど、 外部データ/別ブック のテーブルを結合に使う場合は、3つの手法ごとに以下のフローを用いることで、外部マスタの結合が可能になります。

 

(手法①)関数を用いて結合する場合

  1. テーブルのインポート:Power Queryを使用し、外部のマスタテーブルを読み込む。
  2. シート出力:読み込んだマスタテーブルを、利用先ブック内のシートへ「テーブル」として一度出力する。
  3. セル単位の動的参照:利用先ブック内に配置されたマスタテーブルのコピーをセル単位で参照し、XLOOKUPVLOOKUP 関数を用いてもう一方のテーブルの列(セル)に値を挿入する。

数式による別ブック参照の仕様・制限

Power Queryでなく、数式によって外部データを取り込む(別ブックの参照)のは非推奨です。セル参照・構造化参照のいずれを用いても大きな欠点があるためです。

  • セル参照(通常の座標参照)の場合の挙動
    ソースブック側のシート名・シートレイアウト(セルの位置)の変更によってリンク切れが発生する。意図しないリンク切れの発生リスクが高く、メンテナンス性が大幅に低下する。
  • 構造化参照(テーブル参照)の場合の挙動
    ソースブックが開いている状態でなければ数式が正常に計算されない。ファイルを閉じるとエラーや計算不能の状態になる。

詳細:» リンク切れしにくい別ファイルの参照方法【エクセルで転記の自動化】

 

(手法②)Power Queryを用いて結合する場合

  1. テーブルのインポート:外部ファイルのマスタテーブルと、利用先ブックのトランザクションテーブルの両方をPower Queryのエディター内へ読み込む。
  2. テーブルの結合:シート上にデータを出力する前に、Power Queryエディター内で共通のキーを元に2つのテーブルを横方向に結合する。
  3. クレンジングとテーブル出力:結合されたテーブルに対して、不要な列の削除や型変更を行い、Excelシート上へ1つの「テーブル」として出力する。
 

(手法③)データモデル(Power Pivot)を用いて結合する場合

  1. テーブルのインポート:外部ファイルのマスタテーブルをPower Queryで読み込み、データ型などの最低限の前処理(クレンジング)を行う。
  2. データモデルへの追加:Power Queryの出力先として「データモデル」を選択し、直接Power Pivotに渡す。
  3. 論理結合(リレーション):データモデルの管理画面(Power Pivotウインドウ)を開き、共通キーの列同士をドラッグ&ドロップで結びつけ、テーブル間のリレーションシップのみを定義する。
  4. ピボットテーブル配置:データモデルをデータソースとした「ピボットテーブル」を配置して多角的な分析を行う。

注意点|ExcelをRDBとして運用する限界とデメリット

ExcelをRDBとして運用する場合、以下の3つの限界があります。

 

1. データ容量と処理速度の限界(ファイル肥大化)

Excelの1シートの行数上限は 1,048,576行 です。これを超える大量のトランザクションデータは、ネイティブなシート上には保持できません。データモデル内部であれば数百万行の保持は可能ですが、関数などのExcel標準機能の使用に制限がかかります。

仕様上の上限未満であっても、XLOOKUPやVLOOKUPなどの参照関数を数万行以上にわたり多重に配置した場合、セル編集のたびに再計算が走り、Excelのフリーズ・クラッシュの発生頻度が増加します。

 

2. 同時編集・排他制御の欠如

排他制御 とは、あるユーザーがデータを更新している間、他のユーザーによる同一箇所の書き換えを制限し、データの整合性を保つ仕組みです。

Excelはもともと同時編集には弱く、共有機能やOneDrive上での共同編集も可能ですが、厳密なデータ管理はできません。Excelの共有機能や共同編集では、同一レコードに対する同時書き込み(競合)が発生した際、最後に保存したユーザーのデータで上書きされてしまいます。過去の入力データが消失するリスクがあり、SQL(ACID特性)のような厳密なトランザクション管理は行われません。

 

3. データ不整合のリスク(入力規制の限界)

RDBでは、主キーや外部キーに対する制約条件を設けることでデータの整合性を保ちます。一方でExcelでは「データの入力規則」によるリスト制限が可能ですが、コピー&ペースト操作によって容易に上書き・突破できてしまう仕様となっています。

システム的な強制力(制約条件)がないため、主キーであるはずの列に重複値が入力されたり、外部キーにマスタに存在しない不正なコードが混入したりすることを、完全に防ぐ手段はありません。

まとめ|ExcelでのRDB構築と本格的DBへの移行ステップ

本記事では、Excelで疑似的にリレーショナルデータベースを構築する手法を解説しました。要点は以下の通りです。

  • テーブル設計:属性データを格納する「マスタ」とイベントデータを格納「トランザクション」に分割する正規化を行う
  • テーブル間の紐づけ:目的とデータ量に応じて3つの手法を使い分ける
    • XLOOKUPなどの関数
    • Power Queryのマージ
    • Power Pivot(データモデル)のリレーションシップ

Excelをデータベースとして使用する場合の注意点・限界、専用のデータベースシステムへの検討・移行方法については、下記の記事にまとめています。