用于一对多查找的Cassandra数据建模

时间:2016-07-20 18:49:37

标签: cassandra data-modeling cql

考虑存储用户及其联系人的问题。大约有1亿用户,每个用户有几百个联系人,平均联系人的大小为1kb。可能存在一些具有太多联系人(> 5000)的用户,并且可能存在比1kb的平均值大很多(例如10倍)的一些联系人。用户主动添加联系人,而不是经常删除他们。联系人不是指向其他用户的指针,而只是一组信息。

有两种查询 -

  1. 根据用户和联系人姓名,查找联系人详细信息
  2. 给定用户,查找所有相关联系人姓名
  3. 我在考虑这样的联系人表 -

    CREATE TABLE contacts {
        user_name text,
        contact_name text,
        contact_details map<text, text>,
        PRIMARY KEY ( (user_name, contact_name) )
        //            ^ Notice the composite primary key
    }
    

    复合主键的选择取决于每个用户的联系人数量和大小。我想要每行一个联系人。

    此表可轻松解决查询给定用户和联系人姓名的联系人详细信息的问题。

    我正在寻找解决第二个问题的建议。

    我心中有两个选项(有相关问题) -

    1. 创建第二个名为contact_names_by_user的表,其中user_name作为分区键,contact_name作为集群键。关注:如果有一个用户有太多的联系人(比如20k),那会不会导致一个非最佳的行?
    2. 在user_name上创建索引。关注:但是考虑到用户总数(100M)与每个用户的平均联系人(比如200)的比率,该值是否会被认为具有高基数,因此对索引不利?
    3. 一般情况下,是否存在关于查找一个项目(如此处的用户)引用的许多项目(如此处的联系人)的指导原则,而不是在宽行或非最佳索引中运行?

1 个答案:

答案 0 :(得分:0)

创建索引本身应该不是问题恕我直言。平均基数为200听起来不错。

其他选项是您维护自己的索引,如: CREATE TABLE contacts_by_user(     user_name文本PRIMARY KEY,     联系人设定 )

虽然您的索引和联系人可能会不同步。