Phpcassa - 我很难理解这段代码

时间:2012-10-31 13:35:16

标签: php cassandra cql phpcassa

我仍然试图围绕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); 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 个答案:

答案 0 :(得分:1)

该示例的下两行可能会有所帮助:

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

我在这里做了一些小小的猜测,因为我不知道PHP,但是从名称cf是列家族看起来很清楚,而且两个insert()调用正在向列添加多个列带有键$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,另一个是行键,它们是Ascii,Long。

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

你不能拥有一个空键 - 在Cassandra中你只需省略该列(因为它实际上不是一个表),如果你愿意,可以在以后添加它。

对您的专栏设计进行简短评论(因为这个答案会变得很长!)。我会考虑为什么你想要一个复合主键 - 无论如何,用户ID肯定是唯一的?

您可以为每个用户使用一行,键入userid(或者在用户ID的组合上,如果您确实需要用户名),然后是每个其他字段的列。非常像标准的关系表。我认为没有必要在这里使用复合列名称。也许在尝试复合键之前先找一些更简单的phpcassa例子......