2016-07-05 5 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) 
); 

私は、もはや完全なPKを知っていればどのように私は今までに非正規化テーブルのこの種からレコードを削除することができなかった私は、しかし、このことを知って、私はPKのタグ部分が欠落してい

DELETE FROM videos_by_tag WHERE videoid='SOMEUUID'; 

が、カサンドラの苦情を試してみましたか?

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

この場合、マスターtaにデータを挿入、更新または削除するとble(ビデオ)。 関連するマテリアライズド・ビューにも影響があります。だからwirte操作は1つのテーブルで実行し、多くのテーブルで読み取る必要があります。

+0

これは素晴らしいアイデアだと思いますが、ビデオごとに複数のタグがあり、マテリアライズドビューの種類が複雑になります。 – perrohunter

+0

Ok。したがって、テーブル 'ビデオ'のパーティションキーを変更してタグをクラスタリング列として組み込み、他のすべての列をテーブルビデオに静的に設定することができます。この構造では、タグとその情報と静的列を持つビデオを追加することができます。他のプロパティを指定しなくても、ビデオに別のタグを追加することができます。ただし、静的な列をマテリアライズド・ビューに追加することはできません。*あなたのビューではなく、 –

1

私は最初にそのスキーマを作成したとき、アプリケーションロジックを使ってレコードを管理することを考えていました。これにより、アプリケーションワークフローを使用して、データベースに格納されたデータを管理します。新しい動画をアップロードすると、動画テーブルにレコードが表示されますので、videos_by_userとvideos_by_tagも表示されます。更新するときは、再度3つすべてを更新する必要があります。

削除の場合は、アプリケーションにユーザーに「ビデオを削除しますか?」と表示されます。オプション。そのアクションが実行されると、video_idがわかり、それを使用して任意のインデックステーブルから削除できます。これは、アプリケーションワークフローデータモデルに従っています。タグと同じです。タグを削除する場合は、videosとvideos_by_tagを更新してください。バッチ・ステートメントを使用すると、両方の更新が確実に行われることが望ましい

以前に削除した動画の孤立した記録がある場合は、スパークジョブのようなものを使用してクリーンアップすることをお勧めします。親レコードを持たないvideo_idを持つタグ内のすべてのレコードを見つけるために、かなり興味深いサブクエリをとるリレーショナルDBがあっても。

関連する問題