【问题标题】:Cassandra Table ModelingCassandra 表建模
【发布时间】:2016-04-19 02:39:01
【问题描述】:

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

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

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

  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;
    

在 MongoDB 中,我将只有一个集合,而我返回的文档将具有描述数据的“类型”属性。所以也许我真正的问题是如何在 Cassandra 中复制我可以用 MondoDB 做的事情。到目前为止,我的 Cassandra 之旅是为每个唯一文档创建 UDT,然后更改表以将此新 UDT 添加为列。我的起始表看起来像这样,其中 ColumnDataName 是提示;

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

谢谢

【问题讨论】:

  • Cassandra 没有空值的概念。如果一行中有一个空列,则它是空的。您可以执行 SELECT *。 Cassandra 将仅返回现有数据。我不明白你为什么需要更多?

标签: cassandra


【解决方案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 数据模型是通过查询来设计的。

最好的建议是观看一些 Cassandra 数据模型视频(免费http://academy.datastax.com

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 2021-01-06
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2015-10-31
    相关资源
    最近更新 更多