第5章 主キーとシャード・キーの設計

目次

主キー
部分主キー
シャード・キー
行データ

主キーシャード・キーは、表設計の重要な概念です。主キーとシャード・キーに何を使用するかは、複数の行を同時に読み取るという観点から重要な意味があります。それ以上に、キーの設計はパフォーマンス上でも重要な意味があります。

主キー

すべての表には主キーとして指定された1つ以上のフィールドが必要です。この指定は、表の作成時に行われ、その後変更することはできません。表の主キーは、表内のすべての行を一意に識別します。この最も単純な例では、確認または変更できるように特定の行を取得するために使用されます。

たとえば、productNameproductTypecolorsizeおよびinventoryCountという5つのフィールドを持つ表があるとします。表から個別の行を取得するには、製品の名前がわかれば十分です。この場合、主キーをproductNameとして設定した後、確認/操作する製品名に基づいて行を取得します。

この場合、この表を作成するために使用するCLIスクリプトは次のようになります。

## Enter into table creation mode
table create -name myProducts
## Now add the fields
add-field -type STRING -name productName
add-field -type STRING -name productType
add-field -type ENUM -name color -enum-values blue,green,red
add-field -type ENUM -name size -enum-values small,medium,blue
add-field -type INTEGER -name inventoryCount
## A primary key must be defined for every table
## Here, we will define field 'productName' as the primary key.
primary-key -field productName
## Exit table creation mode
exit
## Add the table to the store. Use the -wait flag to
## force the script to wait for the plan to complete
## before doing anything else.
plan add-table -name myProducts -wait 

ただし、主キーに複数のフィールドを使用することもできます。機能レベルでは、これにより1回の原始的操作で表から複数の行を削除できます。複数の主キーを使用すると、1回の原始的操作で表から行のサブセットを取得することもできます。

「表の行の読取り」で、表から複数の行を取得する方法について説明します。同時に、「multiDelete()の使用」で複数の行を削除する方法について説明します。

部分主キー

複数行操作の実行に使用する一部のメソッドでは、部分主キーを使用できます。部分主キーが必須の場合もあります。部分主キーとは、行の主キーを構成する一部のフィールドが指定されているキーです。

たとえば、次の例では、表の主キーに3つのフィールドを指定します。

## Enter into table creation mode
table create -name myProducts
## Now add the fields
add-field -type STRING -name productName
add-field -type STRING -name productType
add-field -type STRING -name productClass
add-field -type ENUM -name color -enum-values blue,green,red
add-field -type ENUM -name size -enum-values small,medium,large
add-field -type INTEGER -name inventoryCount
## A primary key must be defined for every table
primary-key -field productName -field productType -field productClass
## Exit table creation mode
exit
## Add the table to the store. Use the -wait flag to
## force the script to wait for the plan to complete
## before doing anything else.
plan add-table -name myProducts -wait 

この場合、完全な主キーは、3つの主キー・フィールド(productNameproductTypeおよびproductClass)すべてに値を指定するキーになります。部分主キーは、そのフィールドの1つまたは2つにのみ値を指定するキーになります。

部分キーを指定する場合、順序が重要になることに注意してください。部分キーは、指定された最初のフィールドで始まり、フィールドを順に追加する完全なキーのサブセットである必要があります。したがって、次の部分キーは有効です。

productName
productNameproductType

productTypeproductClassで構成される部分キーは無効です。

シャード・キー

シャード・キーは、シャード・ストレージの観点から意味のある主キー・フィールドを識別します。つまり、すべてのシャード・キー・フィールドに対して同じ値を含む行は、必ず同じシャードに格納されます。これは、結果の原子性を保証する操作で重要になります。(詳細は、「操作の順序の実行」を参照してください。)

たとえば、次の主キーを設定します。

primary-key -field productType -field productName -field productClass

次のように、productTypeおよびproductNameフィールドに対して設定された値を使用して、行が同じシャードに配置されることを保証できます。

shard-key -field productType -field productName

注意

シャード・キー・フィールドは、主キー・フィールドの最初から最後までのサブセットである必要があり、主キー・フィールドの場合と同じ順序で指定する必要があります。前述の例では、次のコードはエラーになります。

shard-key -field productClass

適切に使用すると、マイナー・キーもパフォーマンスの向上に役立ちますが、その方法を理解するには、表に配置するデータに関連するパフォーマンスの問題を理解する必要があります。この問題は、次の項で説明します。