Lookup列でテーブルを繋いだのに、チーム共有の要件が出てきた瞬間に設計が崩れる——この問題は、Dataverseで業務アプリを内製化するときに必ず一度ぶつかる。

判断軸は単純だ。「誰と共有するか」が個人(1対1)ならLookup列でいい。組織やチーム(1対多)になるなら、テキストコード突合に切り替える。

この切り替えを設計段階で決めていれば、人員増加も組織変更も無修正で吸収できる。逆に、Lookup列のまま複数人共有を試みると、テーブル構造の手戻りが発生する。

連載の前提知識:代替キー(Alternate Key)の設定と安全なUpsertの手順は、連載第1回「Dataverseの代替キーで安全にUpsertする」で解説しています。本記事はその続きとして、設計判断の軸を扱います。


Lookup列が崩れるメカニズム

Lookup列(検索列)は、Dataverseの公式仕様で次のように規定されている。

All custom lookups can only allow for a reference to a single row for a single target row type.

訳すと「すべてのカスタム検索列は、単一のターゲット行の種類に対して、単一の行への参照しか持てない」。つまり、1つのLookup列に入るのは常に1行だけだ(Microsoft Learn「Column data types in Microsoft Dataverse」2024年)。

Lookup列を使うと、DataverseはN:1(多対一)リレーションシップを自動生成する。「案件テーブルの担当者列 → 社員テーブルの1行」という構造は、担当者が1人固定のうちは問題なく機能する。

問題は、「この案件を3人で担当する」「営業グループ全員が見られるようにしたい」という要件が出たとき。Lookup列は構造上それを受け取れない。1つのセルに複数の行を詰め込む設計は、Dataverseのスキーマが許していない。

なお、メールのToフィールドのような「PartyList型」は複数値を持てるが、これはシステム列の例外扱いであり、カスタム列には適用できない(公式確認済み)。


テキストコード突合の原理

解決策は「直接繋がない設計」に切り替えることだ。

具体的には、双方のテーブルに共通のテキストコード(例:GA001GA002 といった組織コード)を持たせ、Lookup列による直接結合を使わない設計にする。ビューフィルターでこのコードを照合することで、1対多の共有が実現できる。

たとえば「案件テーブル」と「担当グループテーブル」の両方に group_code 列(テキスト型)を作り、同じ GA001 を持つ行同士を参照させる。担当者が増えても、グループが変わっても、テーブル設計には手を加えずに対応できる。

このテキストコード突合は、Dataverseの代替キー(Alternate Key)仕様を技術的な土台にしている。代替キーは、主キー(GUID)とは別に「業務上の一意識別子」として列を定義する機能で、Microsoftが公式に仕様化している(Microsoft Learn「Work with alternate keys」2024年)。ただし、「組織共有のためにテキストコード突合を使う」という設計パターンそのものの公式ガイドは存在しない。この設計パターンの公式ガイドは存在しない。代替キー仕様を土台にした設計判断として提示する。


役割分解の判断軸

設計の出発点として、次の分解を使うと判断が早い。

共有の単位向いている設計典型的なケース
個人(1対1)Lookup列担当営業、承認者、作成者
組織・チーム(1対多)テキストコード突合担当グループ、部門、担当エリア
未定・変動するテキストコード突合組織再編が見込まれる、兼任が多い

Lookup列が最も力を発揮するのは、「この行を担当するのは常に1人」という前提が成立する場面だ。担当者が交代しても「前任者→後任者」と1対1で置き換わるなら、Lookup列で問題ない。

組織単位の共有が必要な場合は、設計段階でテキストコード突合に切り替える。後から変えようとすると、既存のビューやフォームへの影響範囲が広くなる。


代替キー設定の制約——設計前に知っておく数値

テキストコード突合を代替キーとして設定する場合、次の制約が2026年時点の仕様として存在する(Microsoft Learn「Work with alternate keys」2024年)。

項目制限値
テーブルあたりの最大定義数10個
キー合計サイズ上限900バイト
キーに含められる最大列数16列
列レベルセキュリティが有効な列使用不可
NULL値の一意性強制なし(NULL重複が発生しうる)

業務コードの文字種にも注意が必要だ。代替キーを使ったUpsert(PATCH操作)では、テキストコードに < > * % & : / # のいずれかが含まれると動作しない。コード設計の段階でこれらの文字を除外する必要がある。

また、代替キーを新規作成した直後はステータスが Pending(データベースのインデックス作成中)になる。Active に変わったことを確認してからUpsertを実行すること。Pending のまま実行すると失敗する。ステータスが変わるまでの時間は既存レコード数や環境負荷によって変わるため、数値の目安は公式に記載がない——確認してから進む習慣をつけておく。


チェックリスト:設計切り替えの判断ポイント

Lookup列をやめてテキストコード突合に切り替えるかどうかは、次の問いで判断する。

□ 1つのレコードに対して、担当者・参照先が複数になる可能性があるか
□ 組織変更・人員増加が今後1〜2年以内に見込まれるか
□ ビューフィルターで「特定のグループが担当する行だけ見る」という要件があるか
□ 外部システムや既存マスタに業務コード(代理店コード・部門コード等)が存在するか
□ テキストコードに < > * % & : / # が含まれないか(Upsert利用前提の場合)
□ 代替キーのステータスをActive確認してからUpsertを実行する運用が取れるか

1つでも当てはまるなら、Lookup列のままで進めるリスクを設計書に明記した上で判断する。3つ以上当てはまるなら、テキストコード突合への切り替えをデフォルトとして考える。


個人開発環境での検証

ここまでの設計判断を実際に手を動かして確認するには、本番環境ではなく検証用テナントで試す必要がある。

Microsoft 365 Developer Programの無料テナントを使えば、Power Apps / Dataverseを個人PCから使える検証環境が手に入る。代替キーの設定→Lookup廃止→テキストコード突合のフローを1度作っておけば、次の案件でそのテンプレートを転用できる。

→ 詳細:M365環境でDataverse検証環境を整える


まとめ

Lookup列を使うかテキストコード突合に切り替えるかは、「誰と共有するか」の単位が個人か組織かで決まる。この判断を設計段階で確定しておくことで、人員増加・組織変更に無修正で対応できる構造になる。


次の一歩

  1. 現在使っているLookup列の設計を確認し、「担当が複数になる可能性」があるものをリストアップする
  2. テキストコード突合に切り替える対象を絞り、業務コードの文字種を確認する(< > * % & : / # を除外)
  3. M365 Developer Programの無料テナントで代替キーの設定→Upsert動作を1度試す

次回予告:Dataverseビューフィルターを使った「全自動バケツリレー」——担当グループが変わっても自動で表示対象を切り替える仕組みの設計パターンを解説予定。


関連記事

参考:Microsoft Learn「Column data types in Microsoft Dataverse」(2024年) / 「Work with alternate keys (Microsoft Dataverse)」(2024年)