Cassandra 文件

版本

您正在檢視預發行版本的說明文件。

使用集合的 SAI 編製索引

SAI 支援 maplistset 類型的集合。集合允許您將資料分組並儲存在欄位中。

在關聯式資料庫中,例如使用者的多個電子郵件地址,此類分組是透過 (例如) user 表格和 email 表格之間的一對多關聯關係來達成。Apache Cassandra 透過將使用者的電子郵件地址儲存在 user 表格中的集合欄位中,來避免兩個表格之間的關聯。每個集合會指定所持有資料的資料類型。

如果集合儲存的資料有限,則集合是適當的。如果資料具有無限成長的潛力,例如每秒註冊的訊息傳送或感測器事件,請勿使用集合。請改用具有複合主鍵的表格,其中資料儲存在群集欄位中。

在具有 SAI 索引的資料庫表格的 CQL 查詢中,CONTAINS 子句受支援,且特定於

  • 具有 keysvaluesentries 的 SAI 集合映射

  • 具有 listset 類型的 SAI 集合

使用 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 上建立索引。

使用 CONTAINS 從集合 teams 欄位查詢

  • 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'}

使用清單類型

此範例使用下列表格和索引

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 上建立索引。

使用 CONTAINS 從清單 events 欄位查詢

  • 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']

使用映射類型

此範例使用下列表格和索引

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 上建立的索引會針對欄位資料的鍵、值和完整項目。

使用 KEYS 從映射 teams 欄位查詢

  • 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'}

從映射 teams 欄位查詢項目,請注意 WHERE 子句的差異

  • 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 欄位中存在兩個項目的列。

如需更多資訊,請參閱