2012-10-31 56 views
1

我仍然試圖圍繞cassandra中的組合鍵的整個概念。我從https://github.com/thobbs/phpcassa/blob/master/examples/composites.php拿起這一段代碼,我努力理解這意味着什麼(請在下面看到的問題/註釋中):Phpcassa - 我很努力去理解這段代碼

$cf->insert_format = ColumnFamily::ARRAY_FORMAT; 
$cf->return_format = ColumnFamily::ARRAY_FORMAT; 

$key1 = array("key", 1); // Which one of these is a column name? 
$key2 = array("key", 2); 

$columns = array(
    array(array(0, "a"), "val0a"), //Which is value, and which is column name? 

    array(array(1, "a"), "val1a"), 
    array(array(1, "b"), "val1b"), 
    array(array(1, "c"), "val1c"), 

    array(array(2, "a"), "val2a"), 

    array(array(3, "a"), "val3a") 
); 

/** 
* What type of queries in (CQL if possible) can I achieve with this? 
/

我想了解的是:

  • array("key", 1);分別是key1組成這個鍵的兩列,或者1的值是key
  • 哪一個是列名,哪個是值array(array(0, "a"), "val0a")
  • 以表格形式(或儘可能接近),如何將這些數據可視化爲存儲在數據庫中。我知道它不是以表格的形式存儲的,只是爲了幫助我理解。

我是NoSQL技術的新手,這是扭曲我的思想。

謝謝您的幫助:-)

編輯

只是幾個問題:

  • 如果你有一個複合主鍵成一排,這是否意味着所有該行中的列必須是複合材料?
  • 我想有一列族具有以下結構:

    CREATE COLUMN FAMILY users (
        userid int, 
        username varchar, 
        firstname varchar, 
        lastname varchar, 
        PRIMARY KEY (userid,username) 
    ) 
    // How can I represent this structure with Phpcassa? 
    // I tried to make every column `array("firstname" => "my name")`, but it didn't work 
    
  • 我可以在有我的鑰匙之一,在複合材料爲空(在上面的例子username = null),並可能增加值後來?

回答

1

的那個例子接下來的兩行可能會幫助:

$cf->insert($key1, $columns); 
$cf->insert($key2, $columns); 

我做輕微的猜測在這裏,因爲我不知道PHP,但似乎清楚的命名是cf是ColumnFamily中,並且兩個insert()調用正在使用密鑰$key1$key2向兩行添加多列。

行鍵是複合鍵,即第一行鍵是字符串"key"和號碼1的組合。 在phpcassa中,我相信組合鍵被構造爲數組。

$key1 = array("key", 1); 
$key2 = array("key", 2); 

注意,在該實例中,行鍵列鍵是組合鍵。

這使得$columns是一列數組;每列需要一個名稱(鍵)和一個值...

因此,例如array(0, "a")是列名稱(列名稱也是複合鍵),而"val0a"是列值。第一,行和列的在卡桑德拉總體佈局(顯示3列各2行,例如):

的數據可如下進行可視化。請注意,列不必遵循表格結構 - 我們可以在一行中包含name3,在另一行中包含name3,或者在不同行中包含完全不相關的列名。

row1 -> name1 name2 name3 ... 
     val1 val2 val3 ... 

row2 -> name1 name2 name4 ... 
     val1 val2 val4 ... 

接下來,使用示例中的一些特定(複合)鍵(2行6列)。這就是它實際存儲的方式(假設這是這些列的正確排序順序,這取決於比較器)。

("key", 1) -> (0, "a") (1, "a") (1, "b") (1, "c") (2, "a") (3, "a") 
       "val0a"  "val1a"  "val1b"  "val1c"  "val2a"  "val3a" 

("key", 2) -> (0, "a") (1, "a") (1, "b") (1, "c") (2, "a") (3, "a") 
       "val0a"  "val1a"  "val1b"  "val1c"  "val2a"  "val3a" 

但由於組合鍵,你可以用另一層嵌套(在這裏,只是擴展列鍵)可視化它。這使同種結構的那卡桑德拉Supercolumns有時用於:

("key", 1) ->  0     1    2    3 
       "a" -> "val0a" "a" -> "val1a" "a" -> val2a" "a" -> "val3a" 
           "b" -> "val1b" 
           "c" -> "val1c" 

我懷疑,如果你運行的例子,可以看到其輸出會變得更加清晰!

更新解決額外的問題:

我覺得你可以自主決定是否採用複合行鍵和列鍵:看到配置線,一條爲列密鑰,其長,ASCII和其中一個是Ascii,Long的行鍵。

"comparator_type" => "CompositeType(LongType, AsciiType)", 
"key_validation_class" => "CompositeType(AsciiType, LongType)" 

你不能有一個空鍵 - 在卡桑德拉您只需將忽略該列(因爲它是不是一個真正的表),後來,如果你想添加它。

您列族的設計只是一個簡短的評論(因爲這個答案越來越很長!)。我會考慮爲什麼你想要一個複合主鍵 - 無論如何,用戶標識應該是唯一的?

你可以使用每個用戶一排,在鍵入用戶ID(或用戶ID上的複合,用戶名,如果你真的需要),然後爲每個其他字段的列。非常像一個標準的關係表。我沒有看到任何需要在這裏使用複合列名稱。也許找一些簡單的例子phpcassa首先嚐試組合鍵之前...

+0

謝謝DNA。這真的有幫助,但只有幾個問題,請參閱上面我的問題編輯。 – Sthe

+0

我已經更新了我的答案。如果有幫助,請考慮接受我的答案。 – DNA

+0

爲什麼我認爲複合鍵的唯一原因,是因爲當我登錄用戶,我無法選擇使用'username'。我得到一個錯誤,因爲'用戶名'不是一個鍵,所以我不能在'WHERE'子句中使用它。而且我不能在這個階段選擇使用userid作爲條件。即使我可以讓用戶名成爲行鍵,我也必須在會話中使用它來始終查找用戶行。這個限制是否仍然存在,或者我只是使用舊版本的PHP庫? – Sthe