主キーとシャード・キーは、表設計の重要な概念です。主キーとシャード・キーに何を使用するかは、複数の行を同時に読み取るという観点から重要な意味があります。それ以上に、キーの設計はパフォーマンス上でも重要な意味があります。
すべての表には主キーとして指定された1つ以上のフィールドが必要です。この指定は、表の作成時に行われ、その後変更することはできません。表の主キーは、表内のすべての行を一意に識別します。この最も単純な例では、確認または変更できるように特定の行を取得するために使用されます。
たとえば、productName
、productType
、color
、size
およびinventoryCount
という5つのフィールドを持つ表があるとします。表から個別の行を取得するには、製品の名前がわかれば十分です。この場合、主キーをproductName
として設定した後、確認/操作する製品名に基づいて行を取得します。
この例では、この表を定義するために使用する表の文は次のようになります。
CREATE TABLE myProducts ( productName STRING, productType STRING, color ENUM (blue,green,red), size ENUM (small,medium,large), inventoryCount INTEGER, // Define the primary key. Every table must have one. PRIMARY KEY (productName) )
ただし、主キーに複数のフィールドを使用することもできます。次に例を示します。
CREATE TABLE myProducts ( productName STRING, productType STRING, color ENUM (blue,green,red), size ENUM (small,medium,large), inventoryCount INTEGER, // Define the primary key. Every table must have one. PRIMARY KEY (productName, productType) )
機能レベルでは、これにより1回の原子的操作で表から複数の行を削除できます。複数の主キーを使用すると、1回の原子的操作で表から行のサブセットを取得することもできます。
「表の行の読取り」で、表から複数の行を取得する方法について説明します。同時に、「multiDelete()の使用」で複数の行を削除する方法について説明します。
複数行操作の実行に使用する一部のメソッドでは、部分主キーを使用できます。部分主キーが必須の場合もあります。部分主キーとは、行の主キーを構成する一部のフィールドが指定されているキーです。
たとえば、次の例では、表の主キーに3つのフィールドを指定します。
CREATE TABLE myProducts ( productName STRING, productType STRING, productClass STRING, color ENUM (blue,green,red), size ENUM (small,medium,large), inventoryCount INTEGER, // Define the primary key. Every table must have one. PRIMARY KEY (productName, productType, productClass) )
この場合、完全な主キーは、3つの主キー・フィールド(productName
、productType
およびproductClass
)すべてに値を指定するキーになります。部分主キーは、そのフィールドの1つまたは2つにのみ値を指定するキーになります。
部分キーを指定する場合、順序が重要になることに注意してください。部分キーは、指定された最初のフィールドで始まり、フィールドを順に追加する完全なキーのサブセットである必要があります。したがって、次の部分キーは有効です。
productName
|
productName 、productType |
productType
とproductClass
で構成される部分キーは無効です。
シャード・キーは、シャード・ストレージの観点から意味のある主キー・フィールドを識別します。つまり、すべてのシャード・キー・フィールドに対して同じ値を含む行は、必ず同じシャードに格納されます。これは、結果の原子性を保証する操作で重要になります。(詳細は、「操作の順序の実行」を参照してください。)
たとえば、次の主キーを設定します。
PRIMARY KEY (productType, productName, productClass)
次のように、productType
およびproductName
フィールドに対して設定された値を使用して、行が同じシャードに配置されることを保証できます。
PRIMARY KEY (SHARD(productType, productName), productClass)
順番はシャード・キーの場合に重要になります。キーは主キーとして定義される順に、キー・リストにすき間なく指定する必要があります。つまり、前述の例から、productName
もシャード・キーとして設定しないと、productType
およびproductClass
をシャード・キーに設定することはできません。