【发布时间】:2015-04-04 21:55:41
【问题描述】:
在 cassandra 中为列族选择 rowid 时应考虑哪些标准?我想迁移一个不包含任何主键的关系数据库。在那种情况下,最好的 rowid 选择应该是什么?
【问题讨论】:
标签: cassandra
在 cassandra 中为列族选择 rowid 时应考虑哪些标准?我想迁移一个不包含任何主键的关系数据库。在那种情况下,最好的 rowid 选择应该是什么?
【问题讨论】:
标签: cassandra
如果可能,使用可以从数据集中派生的自然键(例如,电话簿的电话号码,用户表的用户名)。如果那不可能,请使用 UUID。
【讨论】:
在考虑cassandra系统的主键时需要考虑很多事情
了解primary和partition键的区别
创建表用户 ( 用户名 varchar 主键, 密码 varchar, );
在上述情况下,主键和分区键是相同的。
CREATE TABLE users (
user_name varchar,
user_email varchar,
password varchar,
PRIMARY KEY (user_name, user_email)
);
这里的主键是用户名和用户电子邮件,其中用户名是分区键。
CREATE TABLE users (
user_name varchar,
user_email varchar,
password varchar,
PRIMARY KEY ((user_name, user_email))
);
这里主键和分区键都等于user_name,user_email
Cassandra 使用前面的示例组织使用分区键进行查找的数据
对于第一种情况:
user_name ---> email:password email:data_of_birth
ABC --> abc@gmail.com:abc123 abc@gmail.com:22/02/1950 abc@yahoo.com:def123...
第二种情况:
user_name,email ---> password data_of_birth ABC,abc@gmail.com --> abc123 22/02/1950
使包含许多数据的分区键更加复杂,这将确保您有很多行,而不是包含很多列的单行。平衡您可能诱导的行数与每行可能具有的列数可能是有益的。拥有令人难以置信的大量小行可能对读取没有太大帮助
分区键表示数据如何跨节点分布,因此请考虑是否有热点并决定是否要进一步分解。
案例 1: 所有名为 ABC 的用户都将在一个节点中
案例 2: 名为 ABC 的用户可能在也可能不在单个节点中,具体取决于随电子邮件生成的密钥。
【讨论】:
您的分区键应该是您想要存储数据的方式以及您将始终如何查找它。您只能通过分区键检索数据,因此选择您自然会查找的内容很重要(这就是为什么有时数据在 Cassandra 中通过将其存储在多个模拟物化视图的表中来非规范化)。
如果您有时想检索分区中的所有数据而有时只需要其中的一部分,则集群列键(如果有)最有用。这对于时间序列数据之类的东西非常有用,因为您可以将数据聚集在 timeuuid 上,将其排序存储,然后对数据进行有效的范围查询。
【讨论】: