Cassandra层次数据模型

时间:2014-11-27 20:40:41

标签: cassandra datamodel

我是新手设计cassandra数据模型,我需要一些帮助来思考这个框。

基本上我需要一个分层表,这在谈论员工时非常标准。

你有一个雇员,比如Big Boss,他有一份雇员名单。

类似的东西:

create table employee(id timeuuid, name text, employees list<employee>, primary key(id));

那么,有没有办法在Cassandra中建模层次模型,添加表类型本身,甚至是另一种方法?

在上面尝试这一行时,它会给我

  

错误请求:第1:61行在输入'employee'

时没有可行的替代方案

EDITED

我在考虑两种可能性:

  1. 添加一个uuid,在我的java应用程序中找到每个uuid员工,当提出“老板”时。

  2. 使用Map,其中uuid是id本身,我的文本将是整个Row,然后在我的java应用程序中获取地图,将每个“text”员工转换为Employee实体,最后返回整个对象;

1 个答案:

答案 0 :(得分:2)

这实际上取决于您的查询......一个特定的模型只对一组查询有效,但对其他查询则不然。

您可以存储ID,并在客户端再次查找它们。这意味着每个“查询”都有额外的查询。这可能是也可能不是问题,因为命中分区的查询 fast 。使用从id到name的映射也是一种选择。这意味着您执行额外的工作并将名称非规范化为地图值。这也是有效的。第三种选择是使用UDT(用户定义的类型)。然后,您可以拥有列表或集,甚至是地图。在cassandra 2.1中,您也可以为地图键/值编制索引,从而允许一些非常灵活的查询。

https://www.datastax.com/documentation/cql/3.1/cql/cql_using/cqlUseUDT.html

另一种方法可以是将一个人的详细信息存储为id,将静态列存储为其属性,并将“子”作为宽行格式的列。

这看起来像

create table person(
  id int primary key,
  name text static,
  age int static,
  employees map<int, employeeudt>
);

http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/refStaticCol.html

查询这将为您提供重复静态属性的行,但在磁盘上,它仍然保持一次。您可以解决其余的客户端问题。