使用集合的 SAI 編製索引
SAI 支援 map
、list
和 set
類型的集合。集合允許您將資料分組並儲存在欄位中。
在關聯式資料庫中,例如使用者的多個電子郵件地址,此類分組是透過 (例如) user
表格和 email
表格之間的一對多關聯關係來達成。Apache Cassandra 透過將使用者的電子郵件地址儲存在 user
表格中的集合欄位中,來避免兩個表格之間的關聯。每個集合會指定所持有資料的資料類型。
如果集合儲存的資料有限,則集合是適當的。如果資料具有無限成長的潛力,例如每秒註冊的訊息傳送或感測器事件,請勿使用集合。請改用具有複合主鍵的表格,其中資料儲存在群集欄位中。
在具有 SAI 索引的資料庫表格的 CQL 查詢中,
|
使用 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
欄位查詢
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
欄位查詢
SELECT * FROM cycling.upcoming_calendar
WHERE events CONTAINS 'Criterium du Dauphine';
year | month | events
------+-------+-----------------------------------------------
2015 | 6 | ['Criterium du Dauphine', 'Tour de Sui\nsse']
稍微複雜一點的查詢會選取包含特定事件或特定月份日期的列
使用映射類型
此範例使用下列表格和索引
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
欄位查詢
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
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
子句的差異
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
欄位中存在兩個項目的列。
如需更多資訊,請參閱