【问题标题】:Cassandra data modeling for one-to-many lookup用于一对多查找的 Cassandra 数据建模
【发布时间】:2016-11-24 02:54:09
【问题描述】:

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

有两种查询 -

  1. 给定用户和联系人姓名,查找联系人详细信息
  2. 给定一个用户,查找所有关联的联系人姓名

我正在考虑这样的联系人表 -

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. 在用户名上创建索引。担忧:但是考虑到用户总数 (100M) 与每个用户的平均联系人数 (例如 200) 的比率,该值是否会被视为具有高基数,因此不利于索引?

一般而言,是否有关于查找由一个项目(如此处的用户)引用的许多项目(如此处的联系人)而不在宽行或非最佳索引中运行的指南?

【问题讨论】:

  • 您能否提供您的 UDT 联系人定义。
  • 我刚改成地图

标签: cassandra data-modeling cql


【解决方案1】:

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

其他选项是您维护自己的索引,例如: 创建表contacts_by_user( 用户名文本主键, 联系人集 )

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2018-03-08
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    相关资源
    最近更新 更多