2016-07-05 37 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没有父记录的标记中的所有记录。