Cassandra ドキュメント

バージョン

プレリリース版のドキュメントを表示しています。

コレクションを使用したSAIインデックス

SAIは、maplistset型の集合をサポートしています。集合を使用すると、データを列にまとめて格納できます。

リレーショナルデータベースでは、ユーザーの複数のメールアドレスなどのグループ化は、(たとえば)userテーブルとemailテーブル間の多対一の結合関係によって実現されます。Apache Cassandraは、ユーザーのメールアドレスをuserテーブルの集合列に格納することにより、2つのテーブル間の結合を回避します。各集合は、保持されるデータのデータ型を指定します。

集合は、集合ストレージのデータが限定的な場合に適しています。データがメッセージの送信や毎秒登録されるセンサーイベントのように無制限に増加する可能性がある場合は、集合を使用しないでください。代わりに、データがクラスタリング列に格納される複合主キーを持つテーブルを使用してください。

SAIインデックスを持つデータベーステーブルのCQLクエリでは、CONTAINS句がサポートされており、次のように限定されます。

  • SAI **コレクションマップ** (keysvaluesentries)

  • SAI **コレクション** (listおよびset型)

set型の使用

この例では、次のテーブルとインデックスを使用します。

CREATE TABLE IF NOT EXISTS cycling.cyclist_career_teams (
  id UUID PRIMARY KEY,
  lastname text,
  teams set<text>
);
CREATE INDEX teams_idx
    ON cycling.cyclist_career_teams (teams)
    USING 'sai';

cyclist_career_teamsテーブルの集合列teamsにインデックスが作成されます。

集合teams列からのCONTAINSを使用したクエリ

  • CQL

  • 結果

SELECT * FROM cycling.cyclist_career_teams
   WHERE teams CONTAINS 'Rabobank-Liv Giant';
 id                                   | lastname | teams
--------------------------------------+----------+------------------------------------------------------------------------------------------------------
 5b6962dd-3f90-4c93-8f61-eabfa4a803e2 |      VOS | {'Nederland bloeit', 'Rabobank Women Team', 'Rabobank-Liv Giant', 'Rabobank-Liv Woman Cycling Team'}

list型の使用

この例では、次のテーブルとインデックスを使用します。

CREATE TABLE IF NOT EXISTS cycling.upcoming_calendar (
  year int,
  month int,
  events list<text>,
  PRIMARY KEY (year, month)
);
CREATE INDEX events_idx
    ON cycling.upcoming_calendar (events)
    USING 'sai';

upcoming_calendarテーブルのリスト列eventsにインデックスが作成されます。

リストevents列からのCONTAINSを使用したクエリ

  • CQL

  • 結果

SELECT * FROM cycling.upcoming_calendar
   WHERE events CONTAINS 'Criterium du Dauphine';
 year | month | events
------+-------+-----------------------------------------------
 2015 |     6 | ['Criterium du Dauphine', 'Tour de Sui\nsse']

少し複雑なクエリでは、特定のイベントを含む行、または特定の月の日付を持つ行を選択します。

  • CQL

  • 結果

SELECT * FROM cycling.upcoming_calendar
    WHERE events CONTAINS 'Criterium du Dauphine'
          OR month = 7;
 year | month | events
------+-------+-----------------------------------------------
 2015 |     6 | ['Criterium du Dauphine', 'Tour de Sui\nsse']
 2015 |     7 |                            ['Tour de France']

map型の使用

この例では、次のテーブルとインデックスを使用します。

CREATE TABLE IF NOT EXISTS cycling.cyclist_teams (
  id uuid PRIMARY KEY,
  firstname text,
  lastname text,
  teams map<int, text>
);
CREATE INDEX IF NOT EXISTS team_year_keys_idx
ON cycling.cyclist_teams ( KEYS (teams) );
CREATE INDEX IF NOT EXISTS team_year_entries_idx
ON cycling.cyclist_teams ( ENTRIES (teams) );
CREATE INDEX IF NOT EXISTS team_year_values_idx
ON cycling.cyclist_teams ( VALUES (teams) );

cyclist_career_teamsテーブルのマップ列teamsに作成されたインデックスは、列データのキー、値、完全なエントリをターゲットにします。

マップteams列からのKEYSを使用したクエリ

  • CQL

  • 結果

SELECT * FROM cyclist_teams WHERE teams CONTAINS KEY 2014;
 id                                   | firstname | lastname   | teams
--------------------------------------+-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 cb07baad-eac8-4f65-b28a-bddc06a0de23 | Elizabeth | ARMITSTEAD | {2011: 'Team Garmin - Cervelo', 2012: 'AA Drink - Leontien.nl', 2013: 'Boels:Dolmans Cycling Team', 2014: 'Boels:Dolmans Cycling Team', 2015: 'Boels:Dolmans Cycling Team'}
 5b6962dd-3f90-4c93-8f61-eabfa4a803e2 |  Marianne |        VOS |                                                                                          {2014: 'Rabobank-Liv Woman Cycling Team', 2015: 'Rabobank-Liv Woman Cycling Team'}

マップteams列から値をクエリします。キーワードCONTAINSのみが含まれていることに注意してください。

  • CQL

  • 結果

SELECT * FROM cyclist_teams WHERE teams CONTAINS 'Team Garmin - Cervelo';
 id                                   | firstname | lastname   | teams
--------------------------------------+-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 cb07baad-eac8-4f65-b28a-bddc06a0de23 | Elizabeth | ARMITSTEAD | {2011: 'Team Garmin - Cervelo', 2012: 'AA Drink - Leontien.nl', 2013: 'Boels:Dolmans Cycling Team', 2014: 'Boels:Dolmans Cycling Team', 2015: 'Boels:Dolmans Cycling Team'}

WHERE句の違いに注意して、マップteams列からエントリをクエリします。

  • CQL

  • 結果

SELECT * FROM cyclist_teams
WHERE
    teams[2014] = 'Boels:Dolmans Cycling Team'
    AND teams[2015] = 'Boels:Dolmans Cycling Team';
 id                                   | firstname | lastname   | teams
--------------------------------------+-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 cb07baad-eac8-4f65-b28a-bddc06a0de23 | Elizabeth | ARMITSTEAD | {2011: 'Team Garmin - Cervelo', 2012: 'AA Drink - Leontien.nl', 2013: 'Boels:Dolmans Cycling Team', 2014: 'Boels:Dolmans Cycling Team', 2015: 'Boels:Dolmans Cycling Team'}

この例では、マップteams列に2つのエントリが存在する行を探します。

詳細については、以下を参照してください。