cassandra - simple/basic 检索所有员工的数据建模
cassandra - simple/basic data modeling to retrieve all employees
在 Cassandra 中创建以下员工列族
案例一:
CREATE TABLE employee (
name text,
designation text,
gender text,
created_by text,
created_date timestamp,
modified_by text,
modified_date timestamp,
PRIMARY KEY (name)
);
从UI开始,如果我想得到所有员工,是不可能的
取回。是真的吗?
select * 来自员工; //不可能,因为它是按名称分区的
案例二:
我被告知要以这种方式检索所有员工。
我们需要用静态键来设计它,以检索所有员工。
CREATE TABLE employee (
static_name text,
name text,
designation text,
gender text,
created_by text,
created_date timestamp,
modified_by text,
modified_date timestamp,
PRIMARY KEY (static_name,name)
);
static_name 即)"EMPLOYEE" 将是分区键,名称将是集群键。主键,static_name 和 name
的组合
static_name -> 每次添加员工时,插入静态值即)EMPLOYEE
现在,您将能够"select all employees query"
//这将return你所有的员工
select * 来自员工 static_name='EMPLOYEE';
这是真的吗?我们不能将案例 1 用于 return 所有员工吗?
两种方法都是o.k。有一些收获
方法一:
当你说 UI 我猜你的意思是使用简单的 select * ...如果你想得到每一个,这不会真正开箱即用是正确的他们出来了。特别是如果数据集很大。您可以在驱动程序上使用分页(我不是 100% 确定,因为我有一段时间没有使用它的情况)但是当我需要跳过所有分区时,我会使用令牌函数,即:
select token(name), name from employee limit 1;
system.token(name) | name
----------------------+------
-8839064797231613815 | a
现在您使用令牌的结果并将其放入下一个查询。这必须由您的程序来完成。在它获取所有大于...的元素之后,您还需要开始所有低于 -8839064797231613815 的元素。
select token(name), name from employee where token(name) > -8839064797231613815 limit 1;
system.token(name) | name
----------------------+------
-8198557465434950441 | c
然后我将把它包装成一个循环,直到我取出所有元素。 (我认为这也是 spark cassandra 在从集群中检索宽行时的做法)。
这个模型的缺点是它真的很糟糕,因为它必须遍及整个集群并且或多或少用于分析工作负载。既然你提到了 UI,用户得到结果的时间会太长,所以我建议不要在 UI 相关的东西中使用方法 1。
方法二
第二个的缺点是它会成为所谓的热排。这意味着每次更新都会转到一个分区,而这在大多数情况下都是错误的模型。
优点是您可以轻松地对一个分区进行分页,并通过驱动程序内置的分页功能取出数据。
如果您的负载适中(每秒数十或数百次更新)并且用户数量相对较少,那么这将如何表现得很好,假设 100 000 这会很好地工作。如果你的数字更大,你必须以某种方式将用户分成多个分区,以便 "load" 得到更均匀的分布。
一种可能是将字母表中的字母包含到 "EMPLOYEE" 中......这样你就会有 "EMPLOYE_A"、"EMPLOYEE_B" 等等......这会比较有效。由于字典顺序分布,一些分区可能会获得相对较大的数量,这也不理想。
一种方法是创建一些人工列,假设按照设计你说有 10 个桶,当你插入 "EMPLOYEE" 分区时,你只需添加(随机桶到静态前缀)"EMPLOYEE_1" 等等...但是在检索时,您会遍历特定分区,直到耗尽结果。
在 Cassandra 中创建以下员工列族
案例一:
CREATE TABLE employee (
name text,
designation text,
gender text,
created_by text,
created_date timestamp,
modified_by text,
modified_date timestamp,
PRIMARY KEY (name)
);
从UI开始,如果我想得到所有员工,是不可能的 取回。是真的吗?
select * 来自员工; //不可能,因为它是按名称分区的
案例二: 我被告知要以这种方式检索所有员工。 我们需要用静态键来设计它,以检索所有员工。
CREATE TABLE employee (
static_name text,
name text,
designation text,
gender text,
created_by text,
created_date timestamp,
modified_by text,
modified_date timestamp,
PRIMARY KEY (static_name,name)
);
static_name 即)"EMPLOYEE" 将是分区键,名称将是集群键。主键,static_name 和 name
的组合static_name -> 每次添加员工时,插入静态值即)EMPLOYEE
现在,您将能够"select all employees query"
//这将return你所有的员工 select * 来自员工 static_name='EMPLOYEE';
这是真的吗?我们不能将案例 1 用于 return 所有员工吗?
两种方法都是o.k。有一些收获
方法一:
当你说 UI 我猜你的意思是使用简单的 select * ...如果你想得到每一个,这不会真正开箱即用是正确的他们出来了。特别是如果数据集很大。您可以在驱动程序上使用分页(我不是 100% 确定,因为我有一段时间没有使用它的情况)但是当我需要跳过所有分区时,我会使用令牌函数,即:
select token(name), name from employee limit 1;
system.token(name) | name
----------------------+------
-8839064797231613815 | a
现在您使用令牌的结果并将其放入下一个查询。这必须由您的程序来完成。在它获取所有大于...的元素之后,您还需要开始所有低于 -8839064797231613815 的元素。
select token(name), name from employee where token(name) > -8839064797231613815 limit 1;
system.token(name) | name
----------------------+------
-8198557465434950441 | c
然后我将把它包装成一个循环,直到我取出所有元素。 (我认为这也是 spark cassandra 在从集群中检索宽行时的做法)。
这个模型的缺点是它真的很糟糕,因为它必须遍及整个集群并且或多或少用于分析工作负载。既然你提到了 UI,用户得到结果的时间会太长,所以我建议不要在 UI 相关的东西中使用方法 1。
方法二
第二个的缺点是它会成为所谓的热排。这意味着每次更新都会转到一个分区,而这在大多数情况下都是错误的模型。
优点是您可以轻松地对一个分区进行分页,并通过驱动程序内置的分页功能取出数据。
如果您的负载适中(每秒数十或数百次更新)并且用户数量相对较少,那么这将如何表现得很好,假设 100 000 这会很好地工作。如果你的数字更大,你必须以某种方式将用户分成多个分区,以便 "load" 得到更均匀的分布。
一种可能是将字母表中的字母包含到 "EMPLOYEE" 中......这样你就会有 "EMPLOYE_A"、"EMPLOYEE_B" 等等......这会比较有效。由于字典顺序分布,一些分区可能会获得相对较大的数量,这也不理想。
一种方法是创建一些人工列,假设按照设计你说有 10 个桶,当你插入 "EMPLOYEE" 分区时,你只需添加(随机桶到静态前缀)"EMPLOYEE_1" 等等...但是在检索时,您会遍历特定分区,直到耗尽结果。