1

我有以下设置:
有 CF 项目和 CF 关键字。
每个项目都有零个、一个或多个关键字,存储在列中。
每个关键字都有一个或多个项目,存储在列中。
它看起来像这样:

    项目 {
        dl { 名称 => DELL6400,关键字:1 => 计算机,关键字:2 => DELL,关键字:3 => 畅销产品}
        hp { 名称 => HP12345,关键字:1 => 计算机,关键字:2 => HP }
        没有 { 名称 => 诺基亚8210,关键字:1 => 电话,关键字:2 => 诺基亚 }
    }

    // 这里我只存储项目的键,
    // 实际上,我已经对大多数项目列进行了非规范化
    关键字{
        计算机 { 网页 => www.domain.com/computer , item:dl => dl , item:hp => hp }
        DELL { 网页 => www.domain.com/dell , item:dl => dl }
        畅销书 { 网页 => www.domain.com/top , item:dl => dl }
        HP { 网页 => www.domain.com/hp , item:hp => hp }
        NOKIA { 网页 => www.domain.com/nokia , item:no => no }
        电话 { 网页 => www.domain.com/phone ,项目:否 => 否 }
    }

当我添加新项目时,如果需要,我会在关键字中添加“网页”列。
当我删除一个项目时,我正在删除列“item:xx”以及

问题是如何避免“空”关键字,例如如果我删除诺基亚项目“no”:

    关键字{
        ...
        诺基亚 { 网页 => www.domain.com/nokia }
        电话 { 网页 => www.domain.com/phone }
    }

我可以计算切片项目:*,但由于最终的一致性,这可能是错误的方法。

4

2 回答 2

1

您可以将 CounterColumn (http://wiki.apache.org/cassandra/Counters) 添加到关键字 CF。向关键字添加项目时增加它,并在删除时减少:

keywords{
    computer  { webpage => www.domain.com/computer , count => 2 , item:dl => dl , item:hp => hp }
    ....
}

当读取计数== 0的行时,只需将其视为已删除。如果您读取计数 == 0 的行,则实际上不应删除“网页”列,因为可能存在并发添加操作。

于 2012-06-01T06:49:26.707 回答
0

这很有趣,但我想用其他方式 - 非规范化“网页”的东西,例如:

[代码]

keywords{
    computer  { webpage:dl => www.domain.com/computer , item:dl => dl ,
            webpage:dl => www.domain.com/computer ,  item:hp => hp }
    DELL      { webpage:dl => www.domain.com/dell ,     item:dl => dl }
    topseller { webpage:dl => www.domain.com/top ,      item:dl => dl }
    HP        { webpage:hp => www.domain.com/hp ,       item:hp => hp }
    NOKIA     { webpage:no => www.domain.com/nokia ,    item:no => no }
    phone     { webpage:no => www.domain.com/phone ,    item:no => no }
}

[/代码]

在这种情况下,当我删除项目:xx 时,我也会删除网页:xx,如果那里没有字段,则会自动删除行(重影)。但是,我仍然不确定这是否是一个好主意。

于 2012-06-01T07:19:13.280 回答