2017-07-03 52 views
0
的一部分

比方說,我在下面的表格有卡桑德拉:刪除數據與分區鍵

customer_bought_product (
    store_id uuid, 
    product_id text, 
    order_time timestamp, 
    email text, 
    first_name text, 
    last_name text, 
    PRIMARY KEY ((store_id, product_id), order_time, email) 

分區鍵store_idorder_id,它是爲了存儲時間序列數據使用。

該數據沒有TTL,因爲它應該始終可以訪問。

在某些情況下,我們可能需要刪除給定store_id的所有數據。 這樣做的最佳做法是什麼?

到目前爲止,我已經想到了以下解決方案:

  1. 寫一個程序,將選擇所有從表中的數據,並與給定store_id刪除記錄。 - 缺點是,我們在表格中插入更多的數據會花費更多的時間。
  2. 將數據留在表中。 - 這樣做的唯一問題是我們將有無用的數據。
  3. 將表名與可用分區鍵一起存儲在不同的表中,可以通過store_id查詢,從中獲取鍵併爲每個或那些鍵創建刪除語句。 - 我不喜歡這個概念,因爲我必須保持記錄。

有沒有人遇到過這個問題?清除Cassandra中未使用的記錄(不包括TTL)的最佳做法是什麼?

+0

你如何與分區鍵的一部分訪問數據刪除相應的記錄?允許過濾將在生產中如此昂貴和無效。 – dilsingi

+0

當我訪問數據時,我有一個特定的'product_id'和'store_id'。 –

+0

因此,它只有在刪除時,您只有store_id和正常訪問模式是通過product_id和store_id的分區鍵。基於此提供了我的答案。物化視圖中的 – dilsingi

回答

2

創建物化視圖以存儲屬於相應store_ids的product_id。這樣,您可以查詢MV給定的store_id,然後從主表中刪除相應的行。這樣可以避免額外的應用程序代碼來維護兩個不同的表。

create materialized view mv_customer_bought_product 
as select product_id, store_id, order_time, email 
from customer_bought_product 
where order_time is not null 
and email is not null 
and product_id is not null 
and store_id is not null 
primary key (store_id, product_id, order_time, email) ; 
+0

,除store_id和product_id之外的列可能被排除,這將有助於節省磁盤空間。 –

+1

@ArunJoyThekkiniyath您需要讓主表的主鍵中的所有列也出現在實體化視圖中。有沒有例外,以節省存儲:) – dilsingi

+0

謝謝你的答案。使用物化視圖是一個很好的解決方案,因爲我只需要維護一個表。 –

1

刪除部分分區鍵是不可能的。

這裏有一個辦法:

創建一個單獨的表,將擁有所有的product_id對一個給定的商店。

CREATE TABLE product_by_store(
store_id uuid, 
product_id set<text>, 
PRIMARY KEY(store_id) 
); 

現在詭計書面customer_bought_product,也更新到product_by_store,像

UPDATE product_by_store SET product_id=product_id + 'someValue' WHERE store_id=GIVEN_STORE_ID

您可以使用批處理語句而寫,這樣你會得到原子。

現在在刪除,你可以得到所有的product_id給定STORE_ID然後用

DELETE FROM customer_bought_product WHERE store_id=GIVEN_STORE_ID and product_id in (PRODUCT_ID YOU GET from product_by_store table)

而且從customer_bought_product