【问题标题】:Cassandra Data Modeling - Access Pattern involving more than two entitiesCassandra 数据建模 - 涉及两个以上实体的访问模式
【发布时间】:2015-12-30 21:00:45
【问题描述】:

这个问题可能是一个非常明显的事情或反模式,但是我无法通过搜索找到权威信息,因此将其发布在这里。

假设有三个实体

用户
-id
-名称
-电子邮件
...
视频
-id
-标题
-类型
...
演员
-id
-名称
...

关系和基数:


用户--1----m--视频
视频--n----m--演员

我应该如何为以下访问模式/查询建模?

查找由给定用户上传并以给定演员为特色的视频

编辑: 当我在互联网上搜索时,我只得到涉及一个或最多两个相关实体的访问模式示例。无法确定这种接触两个以上实体的访问模式是否无效/反模式,或者在这种情况下也应该遵循相同的建模技术。

问候,
Aniket

【问题讨论】:

    标签: cassandra data-modeling datastax


    【解决方案1】:

    我对 Cassandra 的经验很少,但上周我一直在努力,所以我会试一试。

    CREATE TABLE videos_by_user(
        user_name TEXT,
        user_email TEXT STATIC,
        actor TEXT,
        video_id INT,
        video_type TEXT,
        PRIMARY KEY ((user_name), actor, video_id)
    );
    

    user_name 是分区键,因此“查找给定用户上传的所有视频”之类的请求很简单,并返回单个分区:

    SELECT * FROM videos_by_user WHERE user_name = 'Joe';
    

    actor 是一个集群键(一个actor 是分区中的一行),它们中的每一个都存储对视频的引用,并且由于复制一些数据没有害处,video_type 是为每个演员复制。然后你可以做类似的查询

    SELECT * FROM videos_by_user WHERE user_name = 'Joe' AND actor = 'John';
    

    属于用户的属性被声明为static 并且不重复:user_email 是每个分区(即每个用户)的单个值。假设您想通过电子邮件将链接发送给某个用户,因为他突然对某个演员的视频感兴趣:

    SELECT user_email, video_id FROM videos_by_user WHERE user_name = 'Joe' AND actor = 'John';
    

    我也对其他人对此解决方案的看法很感兴趣。我做功课了吗?

    【讨论】:

    • 对涉及两个以上实体的数据模型的好和有用的想法。我有类似的表设计概念,需要组合来自三个实体的属性。上述设计中唯一的变化可能是将 video_id 也作为主键的一部分,作为集群列或分区键的一部分,主要是为了避免 UPSERT。如果我们在主键中不包含 video_id,那么“joe”和演员“john”上传的 vid1 将被“joe”和演员“john”上传的 vid2 替换。我仍然想知道这种涉及两个以上实体的访问模式不是很常见吗?
    • 当我在互联网上搜索时,我只得到了涉及一个或最多两个相关实体的访问模式和模型的示例。无法确定这种访问两个以上实体的访问模式是否无效/反模式,或者在这种情况下也应该遵循相同的建模技术。
    • 确实,对于同一用户拥有多个具有相同演员的视频的问题,我将更新答案。其余的我也很难找到这样的信息。
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多