通过id从非规范化表中删除?

时间:2016-07-05 23:28:14

标签: cassandra cql

我试图仅使用部分主键从cassandra中删除记录,这是因为我试图删除某个给定视频的某些标签的所有视频,但我不再拥有原始标签

模式

原始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';

但cassandra抱怨说我错过了PK的标签部分,但我知道如果我不再知道完整的PK,我怎么能从这种非规范化表中删除记录?

2 个答案:

答案 0 :(得分:1)

也许你可以使用物化视图。

在这种情况下,您有一个主表格,如:

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

您可以删除你的删除声明:

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);

在这种情况下,如果您在主表(视频)中插入,更新或删除数据。 相关的物化视图也会受到影响。因此,必须在一个表上执行wirte操作并在许多表上读取。

答案 1 :(得分:1)

当我第一次创建该模式时,我正在考虑通过应用程序逻辑管理记录。由此,使用应用程序工作流来管理存储在数据库中的数据。当您上传新视频时,视频表会获得记录,video_by_user和videos_by_tag也会有记录。更新时,可能还需要更新所有三个。

在删除的情况下,我希望应用程序向用户显示“删除视频?”选项。执行该操作后,video_id已知,您可以使用它从任何索引表中删除。这是在应用程序工作流数据模型之后。与标签相同。如果您删除了代码,请更新视频和videos_by_tag。最好使用批处理语句以确保两次更新都发生。

如果你有以前删除的视频的孤儿记录,那么我的建议是使用类似Spark工作的东西来清理。即使使用关系数据库,也会采用相当有趣的子查询来查找具有不具有父记录的video_ids的标记中的所有记录。