我是新手设计cassandra数据模型,我需要一些帮助来思考这个框。
基本上我需要一个分层表,这在谈论员工时非常标准。
你有一个雇员,比如Big Boss,他有一份雇员名单。
类似的东西:
create table employee(id timeuuid, name text, employees list<employee>, primary key(id));
那么,有没有办法在Cassandra中建模层次模型,添加表类型本身,甚至是另一种方法?
在上面尝试这一行时,它会给我
错误请求:第1:61行在输入'employee'
时没有可行的替代方案
EDITED
我在考虑两种可能性:
添加一个uuid,在我的java应用程序中找到每个uuid员工,当提出“老板”时。
使用Map,其中uuid是id本身,我的文本将是整个Row,然后在我的java应用程序中获取地图,将每个“text”员工转换为Employee实体,最后返回整个对象;
答案 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
查询这将为您提供重复静态属性的行,但在磁盘上,它仍然保持一次。您可以解决其余的客户端问题。