【问题标题】:Confusion over data model in cassandracassandra中数据模型的混淆
【发布时间】:2016-12-13 22:04:00
【问题描述】:

您好,我们在 Cassandra 中有一张表,其结构如下

CREATE TABLE dmp.user_profiles_6 (
    vuid text PRIMARY KEY,
    brand_model text,
    first_seen timestamp,
    last_seen timestamp,
    total_day_count int,
    total_usage_count int,
    user_type text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'}
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.1
    AND speculative_retry = '99PERCENTILE';

我从 datastax 阅读了几篇关于 Cassandra 中数据建模的文章。在里面说主键由分区键和集群键组成。

现在在上面的例子中,我们有一个 vuid 列,它是每个唯一用户的标识符。它是主键。我们有 4 亿独立用户。那么现在这是否意味着 Cassandra 正在制作 400M 分区?那么这必然会降低性能。在一篇关于数据建模的 datastax 文章中,一个示例表显示了 uuid 列上的主键,该列是唯一的并且具有非常高的基数。我完全糊涂了,谁能帮我确定哪一列可以设置为分区键,哪一列可以设置为集群键?

查询可以如下: 1.根据vuid直接选择记录 2.根据最后一次看到或第一次看到的范围选择vuid

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    在 Cassandra(查询驱动模型)中,创建表以满足查询,这与关系数据库数据建模不同。

    在 cassandra 中,主键由两种类型的键组成

    1.Partition key -> 定义分区

    2.Cluster key -> 定义分区中的顺序

    取决于用途。

    如果 Partition key 和 clustring key 中提到的列不足以提供唯一性,那么我们需要在 主键。

    除了作为提示:-

    [列名 XX] = ? -> 相等性检查而不是在分区键中添加列名

    [列名 yy] >= ? -> 范围检查在簇键中添加列名

    这里没有提到您应该提供什么查询。 请分享基于该表可以创建的查询。

    【讨论】:

    • 感谢您的意见。请参考问题我添加了可能需要的查询
    【解决方案2】:
    you need to create 3 tables as below.
    table 1:-
    CREATE TABLE dmp.user_profiles_ZZZZ (
        Dummy_column  uuid ,
        vuid text,
         ........other colums
        PRIMARY KEY((Dummy_column,vuid))
    ) .....
    
     table 2:-
    CREATE TABLE dmp.user_profiles_YYYY (
        Dummy_column  uuid ,
        .......other colums
        PRIMARY KEY((Dummy_column),first_seen)
    )  .....
    
    CREATE TABLE dmp.user_profiles_XXXX (
        Dummy_column  uuid ,
        .....other colums
        PRIMARY KEY((Dummy_column),last_seen)
    )  .....
    

    【讨论】:

      【解决方案3】:
      1. 根据vuid直接选择记录>> 你的桌子就是这样做的。它已经有 vuid 作为主键。
      2. 根据上次看到或第一次看到的范围选择 vuid >>
        这里有两个选项: 在聚类列中添加 last_seen 或 first_seen(您只能在 clustering columns 上进行范围选择)
        在这种情况下,您需要在查询中提供 vuid 以及 last_seen 和 first_seen。我不认为你想要那个。

        创建另一个具有相同数据的表(是的,在 C* 中,我们为具有相同数据的不同查询创建另一个表,并根据查询更改键。欢迎数据复制)。在此表中,您必须添加一个虚拟列作为主键,并将 last_seen 和 first_seen 作为集群键。您在查询中传递这些 seen 日期以获取 vuid。

      希望这很清楚。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-20
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 2010-12-28
        • 2017-08-14
        相关资源
        最近更新 更多