Dataverse エラスティックテーブル ~入門編~

現在プレビューが始まっているDataverse エラスティックテーブルについて学んでいきましょう！

::: note
Power Appsの作成画面で「弾性」と表示されるテーブルタイプについてです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/1b7d62d3-7718-a200-0695-e2b6841a8df8.png" width=70%>

:::

こちらの機能により、Dataverseが非常に便利に使えるようになります。


# 概要
エラスティックテーブルは、非常に大きなデータセットをリアルタイムで処理できるように設計されており、大きなデータセットを扱う際、標準テーブルよりもパフォーマンス上の利点があります。 
エラスティックテーブルを使用すると、スケーラビリティ、遅延、パフォーマンス問題を発生させることなく、大量のデータをインポート、保存、分析できます。

標準テーブルと同様に、エラスティックテーブルも[Dataverseデータベース容量](https://qiita.com/skuramoto/items/844bd3e75cba8e0a37d5)の使用に含まれます。
Dataverseの標準テーブルは裏側でAzure SQL DBを利用していますが、エラスティックテーブルはAzure Cosmos DBを利用しています。

# エラスティックテーブルと標準テーブルの使い分け
アプリケーションのニーズに基づいてテーブルを選択しましょう。
両方のタイプのテーブルの組み合わせが適切な場合もあります。
具体的な使い分けについて以下に示します。

### エラスティックテーブルを使用する場合
- データが半構造化されている、もしくはデータモデルが常に変化している
※ 半構造化データについては[後述](#データの種類)
- 自動水平スケーリングが必要なデータ
自動水平スケーリングとは：ストレージサイズとスループット (作成、更新、削除されるレコードの数など) に基づいてスケーラビリティを自動化
- 大量の読み取りと書き込みリクエストを処理する必要があるデータ

### 標準テーブルを使用する場合
- アプリケーションに強固な一貫性が必要
- アプリケーションにリレーショナルモデリングを使用し、そのテーブル間およびプラグインの実行段階でのトランザクション機能が必要
- アプリケーションに複雑な結合が必要

次に、標準テーブルとエラスティックテーブルの違いについて理解を深めるために、まずデータの種類についても触れましょう。

# データの種類
データの種類は大きく3つに分類できます。

### ① 構造化データ
行と列を持つテーブル形式で保存され、テーブル間にリレーションを定義できるデータ
RDB（Relational Database）と呼ばれSQLでデータの問い合わせを行う

### ② 非構造化データ
データモデルが存在せず、構造化されていないデータ
例）音声データ、画像データ、映像データ、自然言語データ

### ③ 半構造化データ
一般的には非構造化データの一種とみなされる
名前の通り構造化データと非構造化データの中間的な性質を持つもので、
ある程度のルールはあるが、テーブルよりも自由な記述が可能なデータ
（半構造化データは構造化データに変換することも可能）
例）JSON、XML

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/5a79ff6f-f2c6-05e1-7696-412c53c9fac5.png)

標準テーブルでは構造化データを扱い、エラスティックテーブルでは半構造化データを扱います。
非構造化データと半構造化データの量は、企業データ全体の80%以上を占めるといわれているくらい、構造化データよりもはるかに多いです。

こういったデータをDataverseで取り扱えるようになったことで、より多くのユースケースにあったアプリケーションにDataverseを使えるようになります。

# 詳細
細かい機能の説明をします。

## スケールとパフォーマンス
エラスティックテーブルの主な利点は、**スケールとパフォーマンス**にあります。Dataverseエラスティックテーブル(Cosmos DB)は、大量のデータに簡単にスケーリングでき、非常に高速な読み取りと書き込み時間を維持できます。
各エラスティックテーブルに自動的に作成される列で異なる値を使用して[データをパーティション分割する](https://learn.microsoft.com/ja-jp/azure/cosmos-db/partitioning-overview?wt.mc_id=dx-mvp-5004203)と、Cosmos DBが関連するデータをよりインテリジェントにまとめて格納し、アクセスを高速化できます！

また、エラスティックテーブルに対するクエリでは、この列でデータをフィルター処理する必要があります（Cosmos DB は、パーティションの 1つ内のデータのみを見ていて、回答を得るために考慮する必要があるデータの量を制限）

## データのインポート
エラスティックテーブルではCosmos DBのパフォーマンス上の利点を実際に活用して、大規模なデータのインポート処理を高速化できます。
通常と同じ方法を使用してエラスティックテーブルにデータを読み込むこともできますが、大規模なデータの読み込みを行うには、[新しいSDK](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/bulk-operations?tabs=sdk)を確認することがおすすめです。

## データの自動削除(Time to live)
作成した時点で保持する必要がある期間が決まっている一時的なデータを扱う場合、エラスティックテーブルにはデータ自動削除の組み込み機能を使用することができます。
列を設定することで、レコードが作成または最後に変更されてから何秒か後にレコードが自動的に削除されることを設定できます。

削除はバックグラウンドで自動的に行われます。TTLが期限切れになる前にレコードが削除されることはありませんが、数秒後になる可能性がありますが、これにより、一括削除で実現できるよりもレコードの自動削除をより細かく制御できます。

## セッション整合性レベル
エラスティックテーブルは[セッション整合性レベル](https://learn.microsoft.com/ja-jp/azure/cosmos-db/consistency-levels?wt.mc_id=dx-mvp-5004203#session-consistency)を使用しています（Cosmos DB自体の仕様）。
つまり、同じセッション内で実行される読み取り・書き込みは正しく実行されることが保証されますが、そのセッション外では、保証されません。

たとえば、レコードを作成した直後にレコードへの変更を読み取ることができるようにする必要がある場合は、両方の要求で**同じセッションを再利用していることを確認する**必要があります。

## JSONデータのクエリ
エラスティックテーブルでは、FetchXML や OData などのデータのクエリを実行する標準的な方法に加えて、新しい[ExecuteCosmosSqlQuery](https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/query-json-columns-elastic-tables?tabs=sdk&wt.mc_id=dx-mvp-5004203#query-json-column-data)要求を介してネイティブの [Cosmos DB SQLライクなクエリ言語](https://learn.microsoft.com/ja-jp/azure/cosmos-db/nosql/query/?wt.mc_id=dx-mvp-5004203)もサポートされています。

こちらのメリットの1つは、エラスティックテーブルのテキスト列に半構造化データを格納できることです。
テキスト形式がJSONとして設定されている限り、**構造化された方法でそのフィールド内の値を照会**できます。


# エラスティックテーブル作成
実際にノーマルな方法でエラスティックテーブル作成していきましょう。
## テーブル作成方法
Power Apps(https://make.powerapps.com )にアクセスし、[テーブル]>[新しいテーブル]>[高度なプロパティを設定する]をクリック

（[テーブル]が表示されない場合は[詳細]をクリックし、選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f255b1d0-f339-5d55-ae63-a85a17265460.png)

新しいテーブルで[表示名]を入力
[高度なオプション]を選択し、[スキーマ名]を入力
[種類]に「弾性」を選択
（Elastic(エラスティック)の日本語訳＝弾性）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/fc2b31fb-0dcd-7705-27ad-c34b4a1bc525.png" width=60%>

プライマリ列の設定をしたい場合は[プライマリ列]のタブをクリックして項目を設定
[保存]ボタンをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/4b962e55-b465-f476-7cbf-3c0eb75a7781.png" width=60%>

ちょっと時間かかりました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/2b2f3245-f824-4cd1-40b3-4a50a7403e24.png" width=60%>

## テーブル作成制限
エラスティックテーブルの作成を選択すると、重複データ検出、アクティビティや接続の追加など、多くの機能が無効になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/b2233560-f5d4-7f41-0ff3-e7b9c9ba6ee7.png" width=60%>

## リレーションの作成方法
エラスティックテーブルは標準テーブルともリレーションをはることができます。
リレーションシップから作る手順は標準テーブルと同じですが、エラスティックテーブルの場合、「列の作成」から作成することはできません。（※ 後述）

[新規]>[リレーションシップ]>[多対一] (or[一対多]) 
※ [多対多]はできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/1cb6c05c-102f-5437-db10-4fdfd92d4597.png)
該当のテーブルを選択し[保存]をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/8db7ab12-ad40-1236-7a3a-21d9a2fee107.png" width=60%>

::: note warn
列の作成から作成した場合
項目を選択はできますが、エラーになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/dbf42584-806d-4051-75cf-b2bae5c088b2.png" width=60%>
:::

## リレーション作成制限
リレーションを作ることは可能ですが、多対一の場合（エラスティックテーブル側に検索列ができる場合）**エラスティックテーブルは SQLデータベースに格納されないため**、連鎖削除 (親レコードが削除されるとエラスティック テーブル内の関連レコードが自動的に削除される) などのオプションを使用することはできません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/395c5037-37b9-5b13-b037-a7a7ace9f1d7.png" width=60%>

# まとめ
今回はエラスティックテーブルの概要と簡単な作成方法の手順をご紹介しました。
これから広がるDataverseの可能性にワクワクしますね！

# 参照
最新の情報はこちらをご参照ください。

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/create-edit-elastic-tables

https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/elastic-tables

https://learn.microsoft.com/ja-jp/azure/cosmos-db/partitioning-overview?wt.mc_id=dx-mvp-5004203

https://markcarrington.dev/2023/05/24/elastic-tables-in-dataverse/