1. 概要

このチュートリアルでは、ApacheCassandraデータベースfrozenキーワードについて説明します。 まず、宣言する方法を示します凍ったコレクションまたはユーザー定義型(UDT) 。 次 使用例と、それが永続ストレージの基本操作にどのように影響するかについて説明します。

2. Cassandraデータベース構成

docker image を使用してデータベースを作成し、cqlshを使用してデータベースに接続してみましょう。 次に、キースペースを作成する必要があります。

CREATE KEYSPACE mykeyspace WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};

このチュートリアルでは、データのコピーを1つだけ使用してキースペースを作成しました。 それでは、クライアントセッションをキースペースに接続しましょう。

USE mykeyspace;

3. 凍結コレクションタイプ

タイプがフリーズされたコレクション(セット、マップ、またはリスト)である列は、その値全体のみを置き換えることができます。つまり、個々の要素を追加、更新、または削除することはできません。凍結されていないコレクションタイプで可能な限りのコレクション。 したがって、 frozen キーワードは、たとえば、単一値の更新からコレクションを保護する場合に役立ちます。

さらに、 t フリーズのおかげで、フリーズされたコレクションをテーブルの主キーとして使用できます。 set list map などのコレクションタイプを使用して、コレクション列を宣言できます。 次に、コレクションのタイプを追加します。

frozen コレクションを宣言するには、コレクション定義の前にキーワードを追加する必要があります。

CREATE TABLE mykeyspace.users
(
    id         uuid PRIMARY KEY,
    ip_numbers frozen<set<inet>>,
    addresses  frozen<map<text, tuple<text>>>,
    emails     frozen<list<varchar>>,
);

いくつかのデータを挿入しましょう:

INSERT INTO mykeyspace.users (id, ip_numbers)
VALUES (6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47, {'10.10.11.1', '10.10.10.1', '10.10.12.1'});

重要なのは、前述のように、凍結コレクションは全体としてのみ交換できるです。 これは、要素を追加または削除できないことを意味します。 ip_numbersセットに新しい要素を追加してみましょう。

UPDATE mykeyspace.users
SET ip_numbers = ip_numbers + {'10.10.14.1'}
WHERE id = 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47;

更新を実行すると、次のエラーが発生します。

InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid operation (ip_numbers = ip_numbers + {'10.10.14.1'}) for frozen collection column ip_numbers"

コレクション内のデータを更新する場合は、コレクション全体を更新する必要があります。

UPDATE mykeyspace.users
SET ip_numbers = {'11.10.11.1', '11.10.10.1', '11.10.12.1'}
WHERE id = 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47;

3.1. ネストされたコレクション

Cassandraデータベースでネストされたコレクションを使用しなければならない場合があります。 ネストされたコレクションは、frozenとしてマークした場合にのみ可能です。 これは、このコレクションが不変であることを意味します。 frozenコレクションとnon-frozenコレクションの両方でネストされたコレクションをフリーズできます。 例を見てみましょう:

CREATE TABLE mykeyspace.users_score
(
    id    uuid PRIMARY KEY,
    score set<frozen<set<int>>>
);

4. ユーザー定義タイプのフリーズ

ユーザー定義型(UDT)は、それぞれが名前と型指定された複数のデータフィールドを単一の列に付加できます。 ユーザー定義型の作成に使用されるフィールドは、コレクションやその他のUDTを含む任意の有効なデータ型です。 UDTを作成しましょう:

CREATE TYPE mykeyspace.address (
    city text,
    street text,
    streetNo int,
    zipcode text
);

凍結されたユーザー定義型の宣言を見てみましょう。

CREATE TABLE mykeyspace.building
(
    id      uuid PRIMARY KEY,
    address frozen<address>
);

ユーザー定義型でfrozenを使用すると、Cassandraは値をblobのように扱います。 このblobは、UDTを単一の値にシリアル化することによって取得されます。 したがって、ユーザー定義型の値の一部を更新することはできません。 値全体を上書きする必要があります。

まず、いくつかのデータを挿入しましょう。

INSERT INTO mykeyspace.building (id, address)
VALUES (6ab09bec-e68e-48d9-a5f8-97e6fb4c9b48,
  {city: 'City', street: 'Street', streetNo: 2,zipcode: '02-212'});

1つのフィールドのみを更新しようとするとどうなるか見てみましょう。

UPDATE mykeyspace.building
SET address.city = 'City2'
WHERE id = 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b48;

再びエラーが発生します:

InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid operation (address.city = 'City2') for frozen UDT column address"

それでは、値全体を更新しましょう。

UPDATE mykeyspace.building
SET address = {city : 'City2', street : 'Street2'}
WHERE id = 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b48;

今回は住所を更新します。 クエリに含まれていないフィールドは、null値で入力されます。

5. タプル

他の構成タイプとは異なり、タプルは常にフリーズされます。 したがって、frozenキーワードでタプルをマークする必要はありません。 したがって、タプルの一部の要素のみを更新することはできません。 凍結されたコレクションまたはUDTの場合と同様に、値全体を上書きする必要があります。

6. 結論

このクイックチュートリアルでは、Cassandraデータベースのコンポーネントをフリーズする基本的な概念について説明しました。 次に、フリーズされたコレクションとユーザー定義の型を作成しました。 次に、これらのデータ構造の動作を確認しました。 その後、タプルのデータ型について説明しました。 いつものように、記事の完全なソースコードは、GitHubから入手できます。