【问题标题】:Valueless Column Technique in Cassandra - Database SchemaCassandra 中的无价值列技术 - 数据库模式
【发布时间】:2011-10-17 14:06:51
【问题描述】:

我正在使用 Cassandra 0.8.2

我正在尝试使用“无价值列”技术来设置我的 cassandra 架构。无价值列背后的想法如下:列的名称成为相关信息,“名称/值”对的值为空。这用于使查询更快 - 非规范化的一个示例。我希望列的名称是反向链接的 url。行键是反向链接的目标 url 的 UUID。这甚至是一个好主意/模式设计吗?

我正在使用一个非常基本的示例来说明我的问题的重点。这是我使用 Cassandra-Cli 设置的内容:

create column family ArticleBackLinks 
with comparator = UTF8Type
and key_validation_class = UTF8Type
and default_validation_class = UTF8Type
and column_metadata = 
[
{column_name: www.arstechnica.com, validation_class: UTF8Type},        
{column_name: www.apple.com, validation_class:UTF8Type},         
{column_name: www.cnn.com, validation_class: UTF8Type},      
{column_name: www.stackoverflow.com, validation_class: UTF8Type}, 
{column_name: www.reddit.com, validation_class: UTF8Type}
];

我得到错误:

Command not found: `create column family ArticleBackLink...

我认为我的错误是由于我在 column_name 中使用的时间段造成的。简而言之,我想知道你们中的一些人是否遇到过更好的方法来使用 Cassandra 中的“无价值列”的想法?无价值列技术的任何好的/更好的例子?我的想法甚至是使用无价值列技术的正确方法吗?

提前谢谢各位。

【问题讨论】:

    标签: hyperlink cassandra database-schema schema-design


    【解决方案1】:

    我认为 Cassandra 不喜欢 column_name 中的 dot,下面的作品

    [default@stackoverflow] create column family ArticleBackLinks with
    ...     comparator = UTF8Type and
    ...     default_validation_class = UTF8Type and
    ...     column_metadata =
    ...     [
    ...     {column_name: 'www.arstechnica.com', validation_class: UTF8Type},
    ...     {column_name: 'www.apple.com', validation_class:UTF8Type},
    ...     {column_name: 'www.cnn.com', validation_class: UTF8Type},
    ...     {column_name: 'www.stackoverflow.com', validation_class: UTF8Type},
    ...     {column_name: 'www.reddit.com', validation_class: UTF8Type}
    ...     ];
    881b31f0-bc64-11e0-0000-242d50cf1ff7
    Waiting for schema agreement...
    ... schemas agree across the cluster
    

    顺便说一下,由于您使用的是 Cassandra 0.8.2,因此您应该使用 CQL

    所以,这样的声明将来会有所帮助

    UPDATE <COLUMN FAMILY> [USING <CONSISTENCY> 
    [AND TIMESTAMP <timestamp>] [AND TTL <timeToLive>]] 
    SET name1 = value1, name2 = value2 WHERE <KEY> = keyname;
    

    参考this


    更新: 根据评论要求添加了更多想法

    将分组信息保存在一个地方是个好主意。它增加了 Cassandra 提供的效率。

    例如,您的案例可以将 category 作为 RowKey,将 url 设置为 column_name。因此,在您的前端,您可以快速显示分类视图,因为您知道arstechnicia 和stackoverflow 属于technology 组,这是一个rowKey。插入数据时会增加一点额外的工作量。

    我使用的是 Cassandra 0.6.x,所以很遗憾我不能告诉很多关于 Cassandra 0.7.0+ 支持的二级索引。但据推测,您可以通过在主 CF 中添加一个列 category 来实现上述说明,该主 CF 的索引由 ArticleBackLink 持有,并且只需使用 CQL 的 select... where... 进行查询。

    您可能会研究二级索引,它可能不再需要新的“索引 CF”。你可能想看看这些:

    • Secondary Index in Cassandra 0.7
    • Cassandra Wiki FAQ

      问:创建二级索引与手动创建“索引”CF(例如“users_by_country”)有区别吗?

      答:是的。首先,在创建自己的索引时,一个节点可能会索引另一个节点持有的数据。其次,索引和数据的更新不是原子的。

    【讨论】:

    • 在使用 Cassandra 时,您对使用“无价值列”作为一种非规范化数据的技术有何看法?
    猜你喜欢
    • 2023-03-17
    • 2011-01-08
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多