database-design - 创建索引,还是添加到主键并创建新表?

标签 database-design cassandra database nosql

在 Cassandra 中,我有一个包含列 (a,b,c) 的表格。我要么需要查询 SELECT * FROM {table} WHERE a = ?和 b = ?SELECT * FROM {table} WHERE a = ?和 c = ?

在这种情况下,我应该怎样做主键呢?我可以用 PRIMARY KEY(a,b)PRIMARY KEY(a,c) 创建两个表吗,因为 Cassandra 需要整个分区键和/或非分区键的排列顺序?或者我可以做类似 PRIMARY KEY(a) 的事情并在 bc 上创建一个 INDEX 吗?

基本上,主键是否应该仅包含唯一性所需的最少数量的值(并从这些值中选择合适的分区键)?如果我将其他列添加到主键,因为我需要查询它们,性能会提高吗?

最佳答案

如上所述,只有提供有关 a、b 和 c 列的基数的更多信息,才能给出有根据的答案。还要确保您了解分区键和集群键的含义 - 它们都是主键的一部分,并且对您的设计有巨大影响。

如果a列有足够的不同值,可以将其作为分区键,并从以下两种方法中选择一种:

1) 每个查询单独的表

CREATE TABLE table1_by_ab (
  a int, b int, c int, 
  PRIMARY KEY (a, b));

CREATE TABLE table1_by_ac (
  a int, b int, c int, 
  PRIMARY KEY (a, c));

2) 查询频率高的一张表,另一列做索引:

CREATE TABLE table2 (
  a int, b int, c int, 
  PRIMARY KEY (a, b));

CREATE INDEX ON table2 (c);

在这两种情况下,您都可以对 (a,b) 和 (a,c) 执行查询。通常建议避免使用secondary index,但是case 2)你在(a,c)上的查询预选了partition key(字段a),所以secondary index可以在单节点上执行,性能不会变坏了。

如果您在 a 列中没有足够的不同值,那么您就不能将其作为分区键,您将需要复制您的表,两者都使用复合分区键:

CREATE TABLE table3_by_ab (
  a int, b int, c int, 
  PRIMARY KEY ((a, b)));

CREATE TABLE table3_by_ac (
  a int, b int, c int, 
  PRIMARY KEY ((a, c)));

希望对你有帮助

关于database-design - 创建索引,还是添加到主键并创建新表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27934698/

相关文章:

php - 需要MySQL数据结构建议

mysql - 即使只有一对多关系,使用关联表也会带来或更少的性能提升

Python cql 库无法使用查询替换更新 bool 列

full-text-search - apache cassandra 查询/全文搜索

python - 如何使用 Python 的 Pandas 从多列中创建一个列表?

数据库设计。并获取 PostgreSQL 中每一列的最后修改时间

database - 数据库设计 : one or two tables to remember a user choice

cassandra - RHEL 和 CentOS 上的 Scylla 安装问题

javascript - 当有数据库调用时,调用验证 Jscript 函数的正确方法是什么?

Mysql自定义序列生成器(如oracle)