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" 等等...但是在检索时,您会遍历特定分区,直到耗尽结果。