技術情報ブログ
Dataverse
2026.02.25

Dataverse:Dataverse入門(3)!リレーションでデータを構造化する-テーブル間の連携とは?

Dataverse:Dataverse入門(3)!リレーションでデータを構造化する-テーブル間の連携とは?
伊礼圭吾

こんにちは。アーティサン株式会社の伊礼(いれい)です。

前回は「商品」テーブルに「列」を追加しながら、列ごとに適したデータ型や選択肢について解説しました。
第3回となる今回は、Dataverseで最も魅力的な機能の一つ、「リレーションシップ(テーブル間の関連付け)」についての解説となります。

例えばExcelでデータを管理していると、「商品一覧」と「注文一覧」が別々のシートにあって、それをVLOOKUP関数で繋げたりすることも多いのではないでしょうか?
Dataverseではこれを、「リレーションシップ」という機能を使うことで、より簡単に、より堅牢に実現することができます!

今回は、前回作成した「商品」テーブルを使って、「注文」「顧客」などのデータを紐付けるハンズオンを行っていきます!

 

 


弊社はPower Platform(Power Apps・Power Automate)に関するアプリ開発や、
皆様が内製化を行う際の支援サービスを提供しておりますので、
Power Platformに関する内容でお悩みがある場合は、以下からぜひお問い合わせください。



 

そもそも「リレーション」とは?

Dataverseや一般的なデータベースでは、すべての情報を1つのテーブル(表)にまとめるのではなく、「情報の種類ごとに別々のテーブルに分けて」管理し、それらを「関連付け(リレーション)」して使うのが基本となります。

一見すると「なるべく多くの情報を1つのテーブルにまとめた方が、パッと見やすくていいのでは?」と思うかもしれません。

例として、「注文管理」を考えてみましょう。

 

1つの表で管理する方法(Excel的なアプローチ)

すべての情報を1つの表にベタ打ちした場合です。

注文日 顧客名 顧客住所 商品名 単価 数量
4/1 山田 太郎 東京都港区… ノートPC 100,000 1
4/2 鈴木 次郎 大阪府大阪市… マウス 2,000 2
4/3 山田 太郎 東京都港区… マウス 2,000 1

この方法にはいくつか問題があります。

  1. 入力が面倒・ミスが増える: 同じマウスが注文されるたびに、毎回同じ「商品名」や「単価」を入力しなおす必要があります。入力者によって「商品名」の表記ゆれが起きるかもしれないですし、「単価」の入力ミスは一大事になってしまいます。
  2. 変更が大変: もし商品名を変更した場合、 過去の注文データの「商品名」をすべて書き換える必要があります。

 

テーブルを分けてリレーションする方法(データベース的なアプローチ)

Dataverseや一般的なデータベースではこれらの問題を、「商品」、「注文」、「顧客」といった別々のテーブルに分けることで解決します。

A. 商品テーブル(商品情報を一元管理)

ID 商品名 単価
001 ノートPC 100,000
002 マウス 2,000

B. 顧客テーブル(顧客情報を一元管理)

ID 顧客名 顧客住所
001 山田 太郎 東京都港区…
002 鈴木 次郎 大阪府大阪市…

C. 注文テーブル(商品や顧客はIDで指名するだけ)

注文日 顧客(ここで紐付け!) 商品(ここで紐付け!) 数量
4/1 001(山田さん) 001(ノートPC) 1
4/2 002(鈴木さん) 002(マウス) 2
4/3 001(山田さん) 002(マウス) 1

「注文テーブル」には「山田さん(ID: 001)」や「マウス(ID:002)」という情報だけが記録されている構成となります。
こういった構成にすると、もし商品名が変更されても「商品テーブル」の商品名を1か所直すだけで、注文テーブルのすべてのデータに変更後の商品名を反映することができます。

この「テーブルとテーブルをIDで繋ぐ仕組み」こそがリレーションシップであり、Dataverseを活用するうえで一番重要な機能の一つとなります。
適切にリレーションを作成してあげることで、システム内の各データの矛盾や重複を自動的に防ぎつつ、システム全体のパフォーマンスも最適化することが可能になります!

データベースの基本となる非常に重要な機能ですが、Dataverseでは簡単な操作でリレーションを作成することができます!
さっそく試してみましょう!

 

ハンズオン:1対多(1:N)を作成しよう

まずはリレーションの基本となる「1対多(1:N)」のリレーションシップを作成してみましょう!

1対多のイメージとしては、
1人の顧客(1)」が「複数の注文をする(多)」というケースは一般的だと思いますが、
1つの注文(1)」に「複数の顧客が紐づいている(多)」というケースは通常ないかと思われます。

そのため「顧客(1)」、「注文(多)」としてリレーションを設定していくことになります。

図として整理すると以下のようなイメージですね!

Dataverse_25_1

Tips:画像のように、システム内のテーブルとリレーション関係をまとめたものをER図と呼びます。

まずは紐付け先となる「顧客」テーブルと「注文」テーブルが必要ですね。
テーブルの作り方や列の追加については、それぞれ第1回と第2回にて解説していますので、詳細はそちらを参考にしていただきながら作ってみてください。

 

 

 

1. 「顧客(Customer)」テーブルの作成

Dataverse_18
  • 表示名: 顧客

  • 複数形: 顧客

  • プライマリ列: 顧客名

  • スキーマ名: Customer

  • 所有権: ユーザーまたはチーム(各営業担当が顧客情報を管理する想定です)


今回のハンズオンでは、列はプライマリ列(顧客名)だけで進めていきます。

 

2. 「注文(Order)」テーブルの作成

Dataverse_19
  • 表示名: 注文

  • 複数形: 注文

  • プライマリ列: 注文番号

  • スキーマ名: Order

  • 所有権: ユーザーまたはチーム


また、注文テーブルには「注文日」を格納する日付列を追加しましょう。

  • 表示名: 注文日

  • データの種類: 日付と時刻

  • 必須: 必須

  • タイムゾーンの調整: ユーザーローカル

  • スキーマ名: OrderDate

 

3. 注文テーブルに「顧客」への検索列を追加する

ここからがリレーションの設定手順になります!

今回は「1対多」という関係性のリレーションを作っていきます。

「注文」テーブルに、「どの顧客からの注文なのか」を記録するための列を追加します。
これには「検索(Lookup)」というデータ型を使用します。

「注文」テーブルの列の追加画面で、以下のように設定してください。

Dataverse_20
  • 表示名: 顧客

  • データの種類: 検索

    • 関連テーブル: 顧客(先ほど作成した顧客テーブルを選択)

  • スキーマ名: CustomerId

  • リレーションシップ名: order_CustomerId(自動生成されますが、簡潔で分かりやすい名前を付けておきましょう)


上記のように設定して保存するだけで、「注文(多)対 顧客(1)」のリレーションシップが完成しました!

ポイント:リレーションの方向

「1対多」を作る時は、「多」の方のテーブルに「1」の方への検索列を追加すると覚えるとスムーズです!
(今回であれば、「注文(多)」テーブルに、「顧客(1)」への検索列を追加したことになります。)

 

ハンズオン:多対多(N:N)を理解しよう

次はもう少し複雑なケースになります!

次は注文商品のリレーションを作成するために、先ほどと同じようにテーブル間の関係を整理してみましょう。

すると、
1つの注文(1)」に「複数の商品が含まれている(多)」というケースは考えられますし、
1つの商品(1)」が「複数の注文に紐づいている(多)」というケースも当然あり得ると思います。

このように、どちらのテーブルも多の側になりえる関係を、「多対多(N:N)」の関係と呼びます。

実は、Dataverseにも標準で「多対多」のリレーションを作る機能もあるのですが、
実際のシステムでは2つのテーブルの間に「中間テーブル」を設けて、双方のテーブルに1対多のリレーションを作成することで疑似的に「多対多」のリレーションを実現する設計が推奨されています。

そこで今回は「注文明細(Order Detail)」という中間テーブルを作成して、多対多のリレーションを実現していきます!
ER図にすると以下の通りです!

Dataverse_25_2

Tips

標準の多対多リレーションが推奨されない理由はいくつかあるのですが、代表的なのは「紐づけに対する付加情報」を持たせられない点でしょうか。
例えば標準の多対多のリレーションでは「注文と商品」を紐づけることはできるものの、「この注文でその商品を何個注文した」といった「数量」などの情報は持つことができなくなってしまいます。
その他にも、多対多のリレーションには保守性やパフォーマンスの面などでも難点があり、標準の多対多リレーションは利用しないことが推奨されています。

 

1. 「注文明細」テーブルの作成

注文と商品を繋ぐための専用テーブルです。

Dataverse_21
  • 表示名: 注文明細

  • プライマリ列: 明細番号

  • スキーマ名: OrderDetail

 

2. 2つの検索列を追加する

このテーブルに、2つの検索列を追加します。

① 注文へのリンク

Dataverse_22
  • 表示名: 注文

  • データの種類: 検索

    • 関連するテーブル: 注文

  • スキーマ名: OrderId


② 商品へのリンク

Dataverse_23
  • 表示名: 商品

  • データの種類: 検索

    • 関連するテーブル: 商品

  • スキーマ名: ProductId

 

3. 数量列を追加する

最後に、何個買ったかを記録する列を追加します。

Dataverse_24
  • 表示名: 数量

  • データの種類: 整数

  • スキーマ名: Quantity


以上で完成です!


一度、これまでに作成したテーブルとリレーションの関係をER図に整理してみると、以下のようになりますね!

Dataverse_25

このように1つのテーブルではなく、複数のテーブルに分割してリレーションを設定することで、
「山田さんという顧客からの注文Aには、商品Xが2個、商品Yが1個含まれる」といった柔軟なデータ管理が可能になります!

 

リレーションの動作設定について

リレーションシップの作成は以上の手順で完了なのですが、システムに組み込むときに重要な設定として「動作」という項目があります。
これは例えば、商品テーブルのような親(1側)のレコードが削除されたり割り当て変更されたりした時に、注文明細テーブルのような子(多側)のレコードはどうするのか、という設定です。

まずはテーブルの設定画面より、「スキーマ」→「リレーションシップ」をクリックします。

Dataverse_26

すると、テーブルに含まれるリレーションシップの一覧が表示されます。
その中から「動作」を設定したいリレーションシップ、今回は「商品テーブル」をクリックしてみましょう。

Dataverse_27

画面右側に設定メニューが開かれるのですが、その中の「詳細オプション」→「関連付け動作」から動作の設定が可能です!

設定には「動作の種類」や「削除」などの項目があり、各設定の詳細な挙動については公式ドキュメントを参照いただければと思いますが、
基本的には以下の3つから選択していただければ問題ないと思われます!


参照:リンクの削除

親となるレコードが削除された場合も子レコードは削除されず、リンクが切れた状態となります。

例として、取り扱いが終了した商品を商品テーブルから削除することは想定されると思いますが、
併せて注文明細テーブルから関連する過去のレコードまで削除されてしまうと、売り上げの計算などが合わなくなる、といった影響が考えられます。

そういった場合は「参照:リンクの削除」を設定することで、商品データの削除は許可しつつ、注文データへの影響を少なくすることが可能となります。


参照:制限

子レコードが存在する限り、親レコードも削除することができない制限がかかります。

例えば、顧客テーブル注文テーブル間のリレーションに「参照:制限」を設定することで、一度でも注文をしたことのある顧客は削除することができなくなります。
どうしても顧客レコードの削除が必要な場合は、事前に注文テーブルから関連するレコードをすべて削除しないといけない、といったステップが必要になるので、手順は煩雑になりますが、ミスによる削除を強く防ぐことができます。

今回の顧客テーブルのような、操作ミスや判断ミスなどで削除されると取り返しのつかない、重要性の高いテーブルのリレーションに適した設定となります。


親子

親レコードが削除されたとき、子レコードも自動的に削除されます。

この設定のユースケースとしては、注文テーブル注文明細テーブルのリレーションが想定されるでしょう。

もし注文のキャンセルなどで注文テーブルからレコードが削除されたとき、関連する注文明細のレコードだけが残っていても意味がありません。

むしろ、注文明細テーブルに意味のないレコードが残ってしまうことから、検索速度などのパフォーマンスに悪い影響を与えてしまう可能性も考えられます。

このようなリレーションに対しては「親子」の動作を設定することで、
注文テーブルの削除に応じて注文明細テーブルでも自動的に関連レコードが削除され、効率的にパフォーマンスを最適化することができます。


先ほどのER図に合わせてみると、以下のようになりますね。

Dataverse_28

このように、「リレーションの動作」をテーブルやリレーションごとの要件に合わせて設定してあげることで、意図しないデータの削除を防ぎつつ、効率的なデータの管理を実現することが可能になります!

ちなみに、SharePointの参照列における動作については、過去に以下のブログでご紹介していますので、 こちらもご参考ください!
SharePoint運用Tips:選択肢・参照列の一覧を更新・削除したらどうなる? 参照列編

今回を機に、SharePointの設定を改めて見直してみるのも良いのではないでしょうか!

 

おわり

今回はDataverseにおけるリレーションシップについての解説でした。

改めておさらいすると、以下の通りです!

  • リレーション

    • 1対多
      →「多」のテーブルに検索列を追加する。

    • 多対多
      →「中間テーブル」を作って、2つの1対多で表現する。

  • 動作

    • 参照:リンクの削除
      →親レコードの削除は許可するが、子レコードは残す。

    • 参照:制限
      →子レコードが存在する限り、親レコードの削除は許可しない。

    • 親子
      →親レコードが削除されたら、子レコードも一緒に削除する。

これで、商品、顧客、注文、注文明細というテーブルの作成と、
各テーブル間のリレーションが設定され、業務アプリとして利用できるようなデータ構造が出来上がってきました!

次回は、テーブル内のデータの整合性を保つための重要な機能「キー設定(代替キー)」について解説します。
「同じ商品コードを登録できないようにしたい!」といった要望に応える機能ですので、ぜひ続けてご覧ください。

それでは!

Power Platform(SharePoint・Power Apps・Power Automate)に関する営業活動や設計、開発などを担当:伊礼 圭吾

伊礼 圭吾

🖊伊礼圭吾さんのブログ一覧はこちら

音楽と料理が生きがいです Power Platform関連を中心に、ローコードノーコード関連とかで学んだことをアウトプットしていきます。

Microsoftクラウド関連

シェアする
記事カテゴリ
最新記事
2026.02.25

Dataverse:Dataverse入門(3)!リレーションでデータを構造化する-テーブル間の連携とは?

2026.02.18

Dataverse:Dataverse入門(2)!テーブルに列を追加してみる-列の型の決め方

2026.02.11

Dataverse:Dataverse入門(1)!注文管理アプリを作ってみる-Dataverseテーブルの作り方

2026.02.04

ローコードツール(Power Platform)を活用した官公庁での発注形態について:元自治体職員(地方公務員)が官公庁におけるローコードツールを活用したシステム開発の発注・契約方法について考えてみた

2026.01.28

Power Apps:自由を手に入れよう!カスタムコンポーネントを構築してみる【実装編】

SharePointEF CoreMarker Clusterer中級者DXカスタマイズ委任自動化したクラウド フロー運用開発環境filter query管理システム列StyleDLPポリシー地方自治体MLJSON書式保守性デジタル化推進複数レコードPCFギャラリーExcelマイグレーションRANK()関数キャンバスアプリノウハウcomponentVBAフローの種類選択肢列環境sortガバナンス登録日StudioTestCopilot Studiot共有リンクテンプレート化DX推進テーマカラーPDF変換業務システムPower AutomateFramework CoreDynamics 365 SalesDatePicker情報技術ダイアログエラーインスタント クラウド フロー参照列本番環境ソートerror notification更新者AICanvas自治体DXレポート化サイト複製作り方ダークモード資料自動作成キャンバスアプリ 違いC#Attribute directivesMicrosoft TranslatorDropdownメッセージIDコンポーネントエクセルスケジュール済みクラウド フローChatGPTライセンスmultiple itemエラー通知更新日生成系AITest Studio生成AI自治体APIPnP PowerShellページ承認Formulasプロパティフロー設計Power Apps 導入attributeO/Rマッパーマーカークラスタリングライブラリviewメールdialogerrorレスポンシブ レイアウトOpenAI環境構築手順複数項目削除変更Copilotテスト事例HTTP リクエストカスタムスクリプトドキュメント管理カラーセットテンプレート活用Power Apps 比較validationazure sql databasetailwindcssビューfirst()関数Tips復元responsive layoutオープンAIpipelineシェアポイントフォルダ外部DBlicenseテストスタジオ活用ワーケーション業務効率化IT管理カラーユニバーサルデザイン自動化事例モデル駆動型 とはローコードCase式マルチテナントアクセス制限nest新機能restoreデータ行の制限チャットGPTCI/CD便利機能ゴミ箱連携添付ファイルコントロール使い方サイトブランド化名古屋ファイル保存申請システムアプリデザインNode.jsシステム構築AngularHTTP Requestドロップダウンメニューノーコード入れ子変数Power BI引き継ぎgalleryパイプラインカレンダー完全削除接続ファイルサイズ基本知識フォントカスタマイズ体験記エンティティワークフロー自動化UI/UXVisual Studio CodeAccessCSSBreakpointObserver承認動的リスト検索個人列退職ギャラリーDevOpsCalendarモデル駆動型データフローフルリモートワークPowerAutomateブランドセンター感想フォルダ構成設定アクセシビリティPCFInfoPathxUnitメディアクエリリマインドcollectionMicrosoft 365グループユーザー列所有者を変更スクロールMicrosoft 365Teamsセキュリティロールrecycle binアーティサンX-SP Designテーマ作成チームサイトMicrosoft Learn Docsアジャイル開発Wordテンプレート環境構築MatTable.Net Core 3.1スマホSetコレクションセキュリティグループSharePoint Online異動コンテナ簡易在庫管理ローコード開発ビジネスルールアクセス許可Artisanスライドショーデザイン拡張コミュニケーションサイトカスタムコネクタ準委任契約業務自動化カスタムコンポーネントAngular MaterialVSCodePCForAll複数の添付ファイル送信元リストLoopショートカットキー時間外非エンジニアDataverseSharePoint Framework転職Slide showMicrosoft365サイトの種類OpenAPI請負契約効率化Power Platform CLIデータ構造.Net Core Test ExplorerレスポンシブUpdateContext承認フローメールの送信非表示Microsoftshortcut key通知体験談JavaScriptSPFx主キー比較移行要件定義MCPサーバー総合評価型入札資料作成開発手順モデル駆動型アプリSortByColumns関数Dataverse for TeamsDynamics 365ロードマップform差出人アプリdesignconcat関数ファイル勉強表示サンプルCopilot Studio社内ポータル多言語化サイト構成FAQエージェントデジタルトランスフォーメーション初心者向け拡張機能Power AppsTypeScriptitem関数入門技術エクスポートインスタントクラウドフロー[市民開発者JSON文字制限フィルター クエリ内製化切替samplePowerAppsグループウェアMUI権限設計AIチャットボットプロポーザル方式ハウツービルドPower PlatformHTMLGoogle Maps初心者Itインポート自動化したクラウドフロー構築デザインフロー実行ドキュメント ライブラリ市民開発登録者X-SPNFCタグエンゲージメントMultilingualデータ移行実運用官公庁システム画像挿入プロジェクト作成
PageTop
ページトップに戻る