以下是cassandra中用户表的简单示例。什么是创建主键的最佳策略。
我的要求是
提到的所有密钥都是高基数密钥。此外,在任何时候我都只会搜索其中一个
PRIMARY KEY(uid,用户名,电子邮件)
如果我只有用户名怎么办?,那么上面的主键就不用了。我无法使用复合主键可视化解决方案吗?
还有什么其他选择?我们应该使用带有uid用户名的新表,然后搜索用户表。 ?
互联网上的所有文章都建议不要为高基数密钥创建二级索引
CREATE TABLE medicscity.user (
uid uuid,
fname text,
lname text,
user_id text,
email_id text,
password text,
city text,
state_id int,
country_id int,
dob timestamp,
zipcode text,
PRIMARY KEY (??)
)
我们如何解决这种情况?
答案 0 :(得分:1)
是的,您需要使用重复的表格。
如果曾经在Cassandra中遇到过必须独立查询基于column1,column2或column3的表的情况。您将不得不复制表格。
现在,您必须使用多少重复,这是个人选择。
在本例中,您可以使用完整数据复制表。 或者,您只需在主表中创建一个新表column1(partition),column2,column 3作为主键。 创建一个新表,其主键为column1,column2,column3和column2上的分区键。 另一个在column3上具有相同的主键和分区键。
因此,您的数据重复将是行,但在这种情况下,您将最终查询数据两次。一个来自重复的表,一个来自完整的表。
大数据技术,是为了加快计算速度,让你的系统水平扩展,它以磁盘/存储为代价。我的意思是只看一切,即使它的复制因素基础也会重复数据。
答案 1 :(得分:1)
您的PRIMARY KEY(uuid,username,email)
不符合您的要求。因为您无法在不填充分区键的情况下搜索群集列,甚至无法填充第一个群集列的第二个群集列。
e.g。你不能在WHERE子句中搜索没有uuid的用户名,也不能在没有uuid和用户名的情况下搜索电子邮件。
您需要的只是非规范化和重复数据。
数据的非规范化和重复是Cassandra的事实。不要害怕它。磁盘空间通常是最便宜的资源(与CPU,内存,磁盘IOP或网络相比),而Cassandra则围绕这一事实进行架构。为了获得最有效的读取,您通常需要复制数据。
在您的情况下,您需要创建3个具有相同列的表(您想要获取的数据),但是这3个表将具有不同的PRIMARY KEY,一个具有作为PK的uuid,一个具有PK的用户名,以及一个人有电子邮件作为PK。 :)