2016-07-05 67 views
0

我想從cassandra的記錄中刪除只使用主鍵的一部分,這是因爲我試圖刪除給定視頻的某些標籤的所有視頻,但我不再有原始標籤通過id從非規範化表中刪除?

架構

原始Killr視頻表

CREATE TABLE videos (
    videoid uuid, 
    userid uuid, 
    name varchar, 
    description varchar, 
    location text, 
    location_type int, 
    preview_thumbnails map<text,text>, 
    tags set<varchar>, 
    metadata set <frozen<video_metadata>>, 
    added_date timestamp, 
    PRIMARY KEY (videoid) 
); 

規格化視頻由標籤

CREATE TABLE videos_by_tag (
    tag text, 
    videoid uuid, 
    added_date timestamp, 
    name text, 
    preview_image_location text, 
    tagged_date timestamp, 
    PRIMARY KEY (tag, videoid) 
); 

我試圖

DELETE FROM videos_by_tag WHERE videoid='SOMEUUID'; 

但卡桑德拉抱怨,我錯過了PK的標記部分,但是我知道這怎麼可能我曾經從這種非規範化表中刪除記錄,如果我不再知道完整的PK?

+0

您使用哪個cassandra版本? –

+0

@GuillaumeS我正在使用Cassandra 3.0.7 – perrohunter

回答

1

也許你可以使用物化視圖。

在這種情況下,你有一個主表所示:

CREATE TABLE videos (
    tag text, 
    videoid uuid, 
    added_date timestamp, 
    name text, 
    preview_image_location text, 
    tagged_date timestamp, 
    PRIMARY KEY (videoid) 
); 

您可以刪除與你的delete語句:如果你想讀別人的標準數據

DELETE FROM videos WHERE videoid='SOMEUUID'; 

,創建物化視圖:

CREATE MATERIALIZED VIEW 
AS 
SELECT * 
FROM videos_by_tags 
WHERE videoid IS NOT NULL 
    AND tag IS NOT NULL 
PRIMARY KEY (tag, videoid); 

在這種情況下,如果您插入,更新或刪除主數據庫中的數據(視頻)。 相關的物化視圖也會受到影響。因此,必須在一張桌子上執行這些操作,並在許多桌子上閱讀。

+0

我認爲這是一個好主意,但是每個視頻都有多個標籤,這使得物化視圖變得複雜 – perrohunter

+0

好的。因此,您可以修改表格'視頻'中的分區鍵以將標記包含在聚類列中,並將表格視頻中的所有其他列設置爲靜態。通過此結構,您可以添加帶有標籤的視頻和信息以及靜態列,您只需向視頻添加另一個標籤即可,而無需指定其他屬性。但要小心,靜態列不能添加到物化視圖中。在您的視圖中指定欄目videoid和標記,而不是* –

1

當我第一次創建該模式時,我想通過應用程序邏輯管理記錄。由此,使用應用程序工作流來管理存儲在數據庫中的數據。當您上傳新視頻時,視頻表格會獲得一條記錄,video_by_user和videos_by_tag也會得到一條記錄。更新時,所有三者可能都需要更新。

在刪除的情況下,我希望應用程序向用戶顯示「刪除視頻?」選項。一旦採取行動,video_id就是已知的,您可以使用它從任何索引表中刪除。這是遵循應用程序工作流數據模型。與標籤相同。如果您刪除標籤,請更新視頻和videos_by_tag。最好用批處理語句來確保兩個更新都發生。

如果你有以前刪除的視頻的孤兒記錄,那麼我的建議是使用類似Spark工作的東西來清理事情。即使使用關係數據庫,也需要一個相當有趣的子查詢來查找具有video_id沒有父記錄的標記中的所有記錄。