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);arekey1组成这个键的两列中,或者1是一个值key
  • 其中哪一个是列名,哪一个是 value 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)并且可能稍后添加一个值?
4

1 回答 1

1

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

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

由于我不了解 PHP,因此我在这里进行了轻微的猜测,但是从cfcolumnfamily 的命名来看,这似乎很清楚,并且这两个调用正在使用键和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 应该是唯一的吗?

您可以只为每个用户使用一行,以用户 ID 为键(或者如果您确实需要,则以用户 ID、用户名的组合为键),然后为每个其他字段使用一列。很像一个标准的关系表。我认为这里不需要使用复合列名。在尝试复合键之前,也许先找到一些更简单的 phpcassa 示例......

于 2012-10-31T21:49:04.613 回答