1

私はまだ、cassandra の複合キーの概念全体に頭を悩ませようとしています。https://github.com/thobbs/phpcassa/blob/master/examples/composites.phpからこのコードを拾いましたが、これが何を意味するのか理解するのに苦労しています (以下の質問を参照してください/コメントで):

$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);key、この1キーを構成する 2 つの列、または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
    
  • コンポジット内のキーの 1 つを null にして (上記の例でusername = null)、後で値を追加することはできますか?
4

1 に答える 1

1

その例の次の 2 行がおそらく役に立ちます。

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

私は PHP を知らないので、ここで少し推測していますが、列ファミリーである命名から明らかcfであり、2 つの呼び出しはキーとinsert()を使用して 2 つの行に複数の列を追加しています。$key1$key2

行キーは複合キーです。つまり、最初の行キーは文字列"key"と数値の複合です1。phpcassa では、複合キーは配列として構築されていると思います。

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

この例では、行キー列キーが複合キーであることに注意してください。

これにより$columns、列の配列が作成されます。各列には名前 (キー) と値が必要です...

たとえばarray(0, "a")、 は列名 (列名も複合キー) であり、"val0a"は列値です。

データは次のように視覚化できます。まず、Cassandra の行と列の一般的なレイアウト (たとえば、2 つの行とそれぞれ 3 つの列を表示)。列は表形式の構造に従う必要はないことに注意してください。ある行に name3 を、別の行に name4 を配置することも、別の行にまったく関係のない列名を配置することもできます。

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"

ただし、複合キーがあるため、別のレベルの入れ子で視覚化できます (ここでは、列キーを展開するだけです)。これにより、Cassandra Supercolumns が時々使用されたのと同じ種類の構造が得られます。

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

例を実行して出力を確認すると、より明確になると思います。

追加の質問に対処するために更新します。

複合行キーと列キーを使用するかどうかを個別に決定できると思います。構成行を参照してください。列キーは Long、Ascii で、行キーの 1 つは Ascii、Long です。

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

null キーを持つことはできません。Cassandra では、その列を単に省略し (実際にはテーブルではないため)、必要に応じて後で追加します。

カラム ファミリーの設計について簡単にコメントします (この回答は非常に長くなるためです!)。複合主キーが必要な理由を考えてみます-とにかくユーザーIDは一意である必要がありますか?

ユーザーID(または本当に必要な場合はユーザーID、ユーザー名の複合体)をキーにしたユーザーごとに行を使用し、次に他の各フィールドの列を使用できます。標準のリレーショナル テーブルによく似ています。ここで複合列名を使用する必要はないと思います。複合キーを試す前に、最初にいくつかの単純なphpcassaの例を見つけてください...

于 2012-10-31T21:49:04.613 に答える