【发布时间】:2016-11-23 09:37:03
【问题描述】:
考虑像这样的表来存储用户的联系人 -
CREATE TABLE contacts {
user_name text,
contact_name text,
contact_id int,
contact_data blob,
PRIMARYKEY ((user, contact_name), contact_id)
// ^-- Note the composite partition key
}
复合分区键为每个联系人生成一行。
假设有 1 亿用户,每个用户都有几百个联系人。
我可以使用
查找特定用户的特定联系人的数据SELECT contact_data FROM contacts WHERE user_name='foo' AND contact_name='bar'
但是,是否也可以使用类似的方式查找用户的所有联系人姓名,
SELECT contact_name FROM contacts WHERE user_name='foo'
? WHERE 子句可以只包含构成主键的所有列中的一部分吗?
编辑——我试过了,但 cassandra 不允许这样做。所以我现在的问题是,您将如何对数据进行建模以支持两个查询 -
- 获取特定用户和联系人的数据
- 获取用户的所有联系人姓名
我能想到两个选择 -
- 创建另一个表,其中包含 user_name 和 contact_name,仅 user_name 作为主键。但是,如果用户的联系人太多,这会是一个宽行问题吗?
- 在用户名上创建索引。但是考虑到 1 亿用户,每个用户只有几百个联系人,user_name 是否会被视为高基数,因此不适合在索引中使用?
【问题讨论】:
标签: cassandra data-modeling cql