我仍然试图围绕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
组成此密钥的两列,或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
中)并且可能稍后添加值?答案 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例子......