我试图仅使用部分主键从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,我怎么能从这种非规范化表中删除记录?
答案 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的标记中的所有记录。