2013-05-27 54 views
3

試圖理解Cassandra中的一些基礎知識,我的印象是,開發人員在設計數據模型時可以採用的優點之一是動態添加列到由鍵標識的行。這意味着我可以對數據進行建模,所以如果有意義的話,關鍵字可以是來自關係數據庫的user_id,我可以創建任意數量的與該用戶相關的列。Cassandra和使用cql插入列

什麼我不理解就是爲什麼有那麼多的重視預定義列CLQ的例子,特別是在CREATE TABLE/ColumnFamily中的例子:

CREATE TABLE emp (
    empID int, 
    deptID int, 
    first_name varchar, 
    last_name varchar, 
    PRIMARY KEY (empID, deptID) 
); 

難道這種類型的模型更有意義只是填入關係數據庫?如果我直到運行時才知道列名,並且需要動態創建它,該怎麼辦?我是否必須使用ALTER TABLE來使用CLQ將新列添加到行中?我記得特定的應用程序用例,我只需要一個關鍵標識符和任意列名稱,其中列名可能包含時間戳+ variable_identifier。

卡桑德拉是正確的工具嗎?文檔中的預定義列僅僅是一個例子嗎?如何使用現有的列族/表添加動態列名稱?

+0

爲什麼您在Lyuben已經在這裏回答後重新發布郵件列表?有耐心,特別是週末。 – jbellis

+0

我爲此道歉。我在帖子中明確表示我正在這樣做。我會看看是否可以刪除此線程,然後在郵件線程上進行跟蹤。 – randombits

回答

5

我是否必須使用ALTER TABLE來使用CLQ向該行添加新列?

是的,在插入'新列'之前必須先定義模式。 但是,您可以定義1列是一組數據。查看datastax的'thrift to cql upgrade'博客中的'tag'示例,其中將動態列和靜態列混合在一起。

如何在現有的列族/表中添加動態列名?

在CQL中,您必須首先使用ALTER關鍵字更改表(列族)的結構。我的猜測是,這是爲了確保列族包含指定的列,消除了錯誤添加列的可能性(更好的數據質量)。

卡桑德拉是正確的工具嗎?

我想是的,但如果你需要增加一列上即時不指定模式改變語句,那麼你或許應該考慮基於節儉的API可以做到這一點,而只是一個善意的警告,datastax提醒新的應用程序使用CQL。

+0

看看Twissandra的例子,它是使用類似數據模型的twitter的cassandra的入門介紹。另外,如果你使用cassandra-cli來創建你的列族而不定義列名,那麼在運行時向列添加一列將檢查列是否存在並更新它,如果不存在,它會動態地爲你創建列,這就是你想。 – qualebs

1

我從郵件列表答案:

Schemalessness不是fundemental概念卡桑德拉,在所有。您可能受到文檔數據庫過度曝光的困擾。經驗表明,有模式說「電子郵件列是文本,而生日日期列是時間戳」,隨着項目和團隊的成長而變得非常有用。

關係模型本身沒有什麼問題(取決於需要按比例非規範化的常見解釋)。 Cassandra是關於使應用程序規模擴大,而不是爲了與衆不同而將SQL嬰兒拋出洗澡水。這就是說,如果你真的不知道什麼樣的屬性可能適用(通常是因爲它們是用戶生成的),你可以使用Map。