

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# データモデリングのベストプラクティス: データモデル設計時の推奨事項
<a name="data-modeling"></a>

Amazon Keyspaces (Apache Cassandra 向け) を使用する際にパフォーマンスを最適化し、コストを最小限に抑えるには、効果的なデータモデリングが不可欠です。このトピックでは、アプリケーションのデータアクセスパターンに適したデータモデルを設計する上で重要となる考慮事項と推奨事項を取り上げます。
+ **パーティションキー設計** – パーティションキーは、Amazon Keyspaces の複数のパーティション間でどのようにデータを分散させるかを決める上で重要な役割を果たします。適切なパーティションキーを選択することが、クエリのパフォーマンスやスループットコストを大きく左右する可能性があります。このセクションでは、パーティション間で読み取り/書き込みアクティビティを均等に分散させるためのパーティションキー設計の戦略について説明します。
+ **主な考慮事項:**
  + **アクティビティの均等分散** – スループットコストを最小限に抑え、バーストキャパシティを効果的に活用するために、読み取り/書き込みのアクティビティをすべてのパーティションに均等に分散させることを目指します。
  + **アクセスパターン** – アプリケーションのプライマリデータのアクセスパターンに合わせて、パーティションキーを設計します。
  + **パーティションサイズ** – 肥大化するパーティションはパフォーマンスに支障をきたし、コスト増の原因となりかねないため、作成しないようにします。

[NoSQL Workbench](workbench.md) を使用すれば、データモデルの可視化と設計が簡単になります。

**Topics**
+ [Amazon Keyspaces でパーティションキーを効果的に使用する方法](bp-partition-key-design.md)

# Amazon Keyspaces でパーティションキーを効果的に使用する方法
<a name="bp-partition-key-design"></a>

Amazon Keyspaces テーブルの各行を一意に識別するプライマリキーは、データを保存するパーティションを決定する 1 つ以上のパーティションキー列と、パーティション内のデータのクラスター化とソートの方法を定義する 1 つ以上のクラスタリング列 (オプション) で構成されます。

パーティションキーによって、データが保存されるパーティションの数と、これらのパーティション間でデータを分散させる方法が決まるため、パーティションキーの選択方法が、クエリのパフォーマンスに大きな影響を与える可能性があります。通常は、ディスク上のすべてのパーティション全体でアクティビティが均一になるようにアプリケーションを設計する必要があります。

アプリケーションの読み取り/書き込みアクティビティをすべてのパーティションに均等に分散させることで、スループットコストを最小限に抑えることができます。これは、オンデマンドおよび読み取り/書き込みのプロビジョンドキャパシティモードにも適用されます。例えば、プロビジョンドキャパシティモードを使用している場合、アプリケーションに必要なアクセスパターンの決定と、各テーブルに必要な読み取りキャパシティユニット (RCU) と書き込みキャパシティユニット (WCU) の合計の見積もりが可能です。Amazon Keyspaces では、指定されたパーティションのトラフィックが 3,000 RCU と 1,000 WCU を超えない限り、プロビジョニングされたスループットによってアクセスパターンはサポートされます。

パーティションの読み取りまたは書き込みスループットが持続的に高い場合、トラフィックパターンに応じて、Amazon Keyspaces は自動的にパーティションを 2 つの新しいパーティションに分割することがあります。各新しいパーティションには元のパーティションの行のサブセットが含まれ、両方のパーティションにスループットが均等に分散されます。

Amazon Keyspaces では、バーストキャパシティを指定して、パーティションごとのスループットプロビジョニングに柔軟性をもたらします。詳細については、[Amazon Keyspaces でバーストキャパシティを効果的に使用する](throughput-bursting.md) を参照してください。

**Topics**
+ [書き込みシャーディングを使用してワークロードをパーティション間で均等に分散させる](bp-partition-key-sharding.md)

# 書き込みシャーディングを使用してワークロードをパーティション間で均等に分散させる
<a name="bp-partition-key-sharding"></a>

Amazon Keyspaces のパーティションで効率的な書き込みの分散を行う方法として、スペースの拡張があります。これにはさまざまな方法があります。乱数を書き込んだパーティションキー列を追加して、パーティション間で行を分散させることができます。または、クエリ対象に基づいて計算された数値を使用することができます。

## 複合パーティションキーと乱数値を使用したシャーディング
<a name="bp-partition-key-sharding-random"></a>

パーティション全体に均等にロードを分散させるための戦略として、乱数を書き込んだパーティションキー列を追加する方法があります。次に、より大きなスペース全体の書き込みをランダム化します。

例えば、次のテーブルに、日付を表すパーティションキーが 1 つあるとします。

```
CREATE TABLE IF NOT EXISTS tracker.blogs (
   publish_date date,
   title text,
   description int,
   PRIMARY KEY (publish_date));
```

このテーブルをパーティション間で均等に分散するために、乱数が保存されている追加のパーティションキー列 `shard` を含めることができます。例:

```
CREATE TABLE IF NOT EXISTS tracker.blogs (
   publish_date date, 
   shard int, 
   title text, 
   description int, 
   PRIMARY KEY ((publish_date, shard)));
```

データを挿入するときに、`shard` 列に対して `1`～`200` の乱数を選択するとします。これにより、`(2020-07-09, 1)` や `(2020-07-09, 2)` などから `(2020-07-09, 200)` までの複合パーティションキーバリューが生成されます。パーティションキーをランダム化しているため、毎日のテーブルへの書き込みは複数のパーティション間で均等に分散されます。これにより、並列性が強化され、全体的なスループットが向上します。

ただし、特定の日のすべての行を読み取るには、すべてのシャードの行をクエリしてから結果をマージする必要があります。例えば、まず、パーティションキーバリュー `(2020-07-09, 1)` に対して `SELECT` ステートメントを発行したとします。次に、`(2020-07-09, 2)` などから `(2020-07-09, 200)` までに対して別の `SELECT` ステートメントを発行します。最終的には、アプリケーションを使用して、これらすべての `SELECT` ステートメントの結果をマージする必要があります。

## 複合パーティションキーと計算値を使用したシャーディング
<a name="bp-partition-key-sharding-calculated"></a>

ランダム化の方法は、書き込みスループットを大幅に向上させることができます。しかし、行が書き込まれたときに `shard` 列にどの値が書き込まれたのかわからないため、特定の行の読み取りが難しくなります。個々の行の読み取りを容易にするために、別の戦略を使用することができます。パーティション間で行を分散させるには、乱数を使用せずに、クエリする項目に基づいて計算できる数値を使用します。

前の例では、パーティションキーで今日の日付が使用されています。各行にはアクセス可能な `title` 列があり、日付別に加えてタイトル別に行を頻繁に検索する必要があるとします。アプリケーションでは、テーブルに行が書き込まれる前に、タイトルに基づいてハッシュ値が計算され、それを使用して `shard` 列が入力されます。この計算では、1 から 200 までの数値が生成され、ランダムな方法と同様に、完全に均一に分散されます。

この計算はシンプルな計算で十分です (タイトルの文字の UTF-8 コードポイント値を乗算して、それを 200 で割った余りに \$1 1 するなど)。複合パーティションキーバリューは、日付と計算結果を組み合わせた値になります。

この方法を使用すると、書き込みがパーティションキーバリュー全体に均一に分散されます。したがって、物理パーティション全体にも均一に分散されます。これで、特定の `title` 値のパーティションキーバリューを計算できるため、特定の行と日付に対して簡単に `SELECT` ステートメントを実行できます。

特定の日のすべての行を読み取るには、`(2020-07-09, N)` キー (ここで `N` は 1〜200) を `SELECT` する必要があり、アプリケーションはすべての結果をマージする必要があります。この方法には、すべてのワークロードを利用する単一の「ホット」パーティションキーバリューを使用しないというメリットがあります。