【问题标题】:How to create table structure which supports multiple WHERE Clause with different ORDER BY in Cassandra如何在 Cassandra 中创建支持具有不同 ORDER BY 的多个 WHERE 子句的表结构
【发布时间】:2016-12-18 03:57:17
【问题描述】:

大家好,提前感谢您的帮助,并为我的床英语感到抱歉。
我是 Cassandra 数据库的新手。

现在我的问题是 我想创建一个表,我可以在该表上使用不同类型的 where 子句和 order by 子句触发多个查询

这是我的表结构

CREATE TABLE iF NOT EXISTS AD_ChangeLog 
(   AD_ChangeLog_ID int ,
    AD_Session_ID int,
    AD_Table_ID int,
    AD_Column_ID int,
    AD_Client_ID int,
    AD_Org_ID int,
    IsActive text,
    Created timestamp,
    Updated timestamp,
    CreatedBy int,
    UpdatedBy int,
    Record_ID int,
    Oldvalue text,
    NewValue text,
    Undo text,
    Redo text, 
    IsCustomization text, 
    TrxName text, 
    Description text, 
    EventChangeLog text, 
    AD_ChangeLog_UU Text
);   

  and i want to fire this queries on it
1) SELECT * FROM AD_ChangeLog WHERE IsCustomization='Y' AND IsActive='Y' ORDER BY AD_Table_ID, AD_Record_ID, AD_Column_ID;

2) SELECT * FROM AD_ChangeLog  WHERE AD_ChangeLog = x;

3) SELECT * FROM AD_ChangeLog WHERE AD_Table_ID=x AND Record_id=y AND ad_column_id=z ORDER BY UPDATED;

4) SELECT * FROM AD_ChangeLog WHERE AD_Table_ID=x AND Record_id=y ORDER BY UPDATED;

我试过了,但没有运气:(

==> 1) 
CREATE TABLE iF NOT EXISTS AD_ChangeLog 
(   AD_ChangeLog_ID int ,
    AD_Session_ID int,
    AD_Table_ID int,
    AD_Column_ID int,
    AD_Client_ID int,
    AD_Org_ID int,
    IsActive text,
    Created timestamp,
    Updated timestamp,
    CreatedBy int,
    UpdatedBy int,
    Record_ID int,
    Oldvalue text,
    NewValue text,
    Undo text,
    Redo text, 
    IsCustomization text, 
    TrxName text, 
    Description text, 
    EventChangeLog text, 
    AD_ChangeLog_UU Text,
    Primary Key (AD_ChangeLog_ID,Updated)
)With CLUSTERING ORDER BY (Updated DESC);
CREATE INDEX ON AD_ChangeLog (AD_Table_ID);
CREATE INDEX ON AD_ChangeLog (AD_Column_ID);
CREATE INDEX ON AD_ChangeLog (Record_ID);

==> 2)
CREATE TABLE iF NOT EXISTS AD_ChangeLog 
(   AD_ChangeLog_ID int ,
    AD_Session_ID int,
    AD_Table_ID int,
    AD_Column_ID int,
    AD_Client_ID int,
    AD_Org_ID int,
    IsActive text,
    Created timestamp,
    Updated timestamp,
    CreatedBy int,
    UpdatedBy int,
    Record_ID int,
    Oldvalue text,
    NewValue text,
    Undo text,
    Redo text, 
    IsCustomization text, 
    TrxName text, 
    Description text, 
    EventChangeLog text, 
    AD_ChangeLog_UU Text,
    Primary Key ((AD_Table_ID,Record_ID,AD_Column_ID),AD_ChangeLog_ID,Updated)
);

我不明白如何使它适用于所有情况
如果它开始为一种情况工作,另一种情况则失败
请提供一些指导
再次感谢你:)

【问题讨论】:

    标签: database datastax cassandra-2.1


    【解决方案1】:

    二级索引可以支持 Cassandra 表上的多种查询模式,但您的列似乎存在基数问题。二级索引不适合非常低或非常高的基数值,例如 Record_ID、IsCustomization 和 IsActive。这些列上的二级索引可能不会在规模上表现良好,即使它在测试平台中工作。有关 Cassandra 中索引的一些背景信息,请参阅 When to use an index

    Cassandra 数据建模经常对表进行非规范化处理,以对同一数据实施多种查询模式。基本上,直接复制数据或使用物化视图(在 Cassandra 3.0 及更高版本中可用)。

    您可以创建非规范化查找表并使用light weight transactions 插入基本表和查找表:

    CREATE TABLE IF NOT EXISTS AD_ChangeLog_IsActive
        AD_ChangeLog_ID int,
        AD_TableID int,
        AD_ColumnID int,
        IsActive text,
        Primary Key ((IsActive, AD_TableID, AD_ColumnID))
    );
    

    因为 IsActive 只有 Yes/No 值,所以您会希望您的分区键包含一个额外的列,以便数据不会在一两个节点上成为热点。

    DataStax 的 DSE 引擎集成了 Cassandra 和 Solr 搜索,可以更好地支持您希望运行的那种即席查询。

    【讨论】:

      猜你喜欢
      • 2018-02-23
      • 2016-06-12
      • 2015-11-19
      • 2012-03-16
      • 1970-01-01
      • 2013-01-09
      • 2012-05-31
      • 2012-12-14
      • 1970-01-01
      相关资源
      最近更新 更多