【问题标题】:Phpcassa - I'm struggling to understand this snippet of codePhpcassa - 我很难理解这段代码
【发布时间】:2012-11-02 03:53:27
【问题描述】:

我仍在尝试围绕 cassandra 中复合键的整​​个概念展开思考。我从https://github.com/thobbs/phpcassa/blob/master/examples/composites.php 获取了这段代码,我很难理解这意味着什么(请参阅下面的问题/在 cmets 中):

$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 构成此键的两列,或者1key 的值?
  • 其中哪一个是列名,哪一个是值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),并且可以稍后添加一个值?

【问题讨论】:

    标签: php cassandra cql phpcassa


    【解决方案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 应该是唯一的吗?

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

    【讨论】:

    • 感谢 DNA。这确实有帮助,但还有几个问题,请参阅上面我的问题的编辑。
    • 我已经更新了我的答案。如果有帮助,请考虑接受我的回答。
    • 我考虑复合键的唯一原因是因为当我登录用户时,我无法使用username 进行选择。我收到一个错误,因为username 不是键,所以我不能在WHERE 子句中使用它。在那个阶段我不能选择使用userid 作为条件。即使我可以将用户名设置为行键,我也必须在会话中使用它并一直使用它来查找用户行。这个限制仍然存在还是我只是在使用旧版本的 PHP 库?
    • 我偶然发现了这个网站并通读了这篇文章。 rackspace.com/blog/cassandra-by-example 我想我将不得不创建两个列族。我将为login 使用一个单独的username 作为row key 仅用于登录,并让另一个使用userid 作为行键。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2021-04-03
    • 2019-02-13
    • 2020-03-27
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多