卡桑德拉表建模

时间:2016-04-18 18:06:54

标签: cassandra

想象一下包含 列的表,其中行记录中的大多数数据为空。其中一列是ID,此ID是预先知道的。

select id,SomeRandomColumn 
from LotsOfColumnsTable
where id = 92e72b9e-7507-4c83-9207-c357df57b318;

SomeRandomColumn是数千个中的一个,在大多数情况下是唯一包含数据的列。 SomeRandomColumn是 NOT ,预先知道包含数据的那个。

  1. 是否有可以执行此类操作的CQL查询。

    select {Only Columns with data}  
    from LotsOfColumnsTable  
    where id = 92e72b9e-7507-4c83-9207-c357df57b318;
    
  2. 我正在考虑添加一个指向带有数据的列的“提示”列,但除非有一个查询看起来像这样的CQL查询,否则感觉不对。

    select ColumnHint.{DataColumnName}
    from LotsOfColumnsTable  
    where id = 92e72b9e-7507-4c83-9207-c357df57b318;
    
  3. 在MongoDB中,我只有一个集合,我收到的文档将有一个描述数据的“类型”属性。所以也许我真正的问题是如何复制我在Cassandra中使用MondoDB所做的事情。到目前为止,我的Cassandra之旅是为每个唯一文档创建UDT,然后更改表以将此新UDT添加为列。我的启动表看起来像这样,其中ColumnDataName是提示;

    CREATE TABLE IF NOT EXISTS WideProductInstance (
       Id uuid,
       ColumnDataName text
       PRIMARY KEY (Id)
    );
    

    由于

1 个答案:

答案 0 :(得分:1)

  

是否有可以执行此类操作的CQL查询。

     

select {Only Columns with data}
  from LotsOfColumnsTable
  where id = 92e72b9e-7507-4c83-9207-c357df57b318;

不,你不能这样做。它很容易解释。为了能够知道列包含数据,Cassandra需要读取它。如果它必须读取数据,因为已经花费在磁盘上,它只会将这些数据返回给客户端。

如果Cassandra能够过滤掉 null 列,那么您获得的唯一节省就是网络带宽...

  

我正在考虑提出一个"提示"指向包含数据的列的列,但除非有一个CQL查询看起来像这样一个查询,否则感觉不对。

您的想法就像在另一个表中存储实际包含实际数据且不为空的所有列的列表。这听起来像一个很糟糕但不受支持的JOIN。如果您在阅读原始表格之前需要阅读此参考表格,那么您必须在许多地方阅读并且它会变得昂贵

  

所以也许我真正的问题是如何复制我在Cassandra中使用MondoDB所做的事情。

不要尝试复制从Mongo到Cassandra的相同功能。这两个数据库具有根本不同的架构。你要做的是推理你的功能用例。 "我如何从Cassandra获取数据?"从这一点设计一个合适的数据模型。 Cassandra数据模型是通过查询设计的。

最好的建议是在http://academy.datastax.com

观看一些Cassandra数据模型视频(免费