apachecassandra模式设计

apachecassandra模式设计,cassandra,Cassandra,我有以下设置: 有CF项目和CF关键字。 每个项目都有零个、一个或多个关键字,存储在列中。 每个关键字都有一个或多个项目,存储在列中。 看起来是这样的: items { dl { name => DELL6400, keyword:1 => computer, keyword:2 => DELL, keyword:3 => topseller } hp { name => HP12345, keyword:1 => computer, keyword:2

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

items { dl { name => DELL6400, keyword:1 => computer, keyword:2 => DELL, keyword:3 => topseller } hp { name => HP12345, keyword:1 => computer, keyword:2 => HP } no { name => Nokia8210, keyword:1 => phone, keyword:2 => NOKIA } } // here I store keys of the items only, // in reality I have denormalized most of items columns keywords{ computer { webpage => www.domain.com/computer , item:dl => dl , item:hp => hp } DELL { webpage => www.domain.com/dell , item:dl => dl } topseller { webpage => www.domain.com/top , item:dl => dl } HP { webpage => www.domain.com/hp , item:hp => hp } NOKIA { webpage => www.domain.com/nokia , item:no => no } phone { webpage => www.domain.com/phone , item:no => no } } 项目{ dl{name=>DELL6400,关键字:1=>computer,关键字:2=>DELL,关键字:3=>topseller} hp{name=>HP12345,关键字:1=>computer,关键字:2=>hp} 否{name=>Nokia8210,关键字:1=>phone,关键字:2=>NOKIA} } //这里我只存储物品的钥匙, //实际上,我已经对大多数项和列进行了非规范化 关键词{ 计算机{webpage=>www.domain.com/computer,item:dl=>dl,item:hp=>hp} 戴尔{webpage=>www.domain.com/DELL,item:dl=>dl} topseller{webpage=>www.domain.com/top,item:dl=>dl} HP{webpage=>www.domain.com/HP,项目:HP=>HP} 诺基亚{webpage=>www.domain.com/NOKIA,item:no=>no} 电话{webpage=>www.domain.com/phone,项目:no=>no} } 当我添加新项目时,如果需要,我会在关键字中添加“网页”列。
当我删除一个项目时,我也删除了“项目:xx”列

问题是,如果我删除诺基亚产品“否”,如何避免出现“空”关键字:

关键词{ ... 诺基亚{webpage=>www.domain.com/NOKIA} 电话{webpage=>www.domain.com/phone} }
我可以计算切片项目:*,但由于最终的一致性,这可能是错误的做法。

您可以添加一个计数器列(http://wiki.apache.org/cassandra/Counters)要查看关键字,请在向关键字添加项目时将其递增,删除时将其递减:

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

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

您可以添加计数器列(http://wiki.apache.org/cassandra/Counters)要查看关键字,请在向关键字添加项目时将其递增,删除时将其递减:

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

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

这很有趣,但我想到了另一种方法-对“webpage”进行非规范化,例如:

[守则]

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 }
}
[/code]


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

这很有趣,但我想到了另一种方法——对“网页”进行非规范化,例如:

[守则]

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 }
}
[/code]


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

如果我为每个项目:xx列反规范化“网页”列,会怎么样?如果我为每个项目:xx列反规范化“网页”列,会怎么样?不幸的是,计数器列只能添加到CounterColumnType的特殊列族中。这种方法通常可以工作,但您需要在为此目的创建的单独计数器cf中查找计数。不幸的是,计数器列只能添加到CounterColumnType的特殊列族中。这种方法通常可以工作,但您需要在为此目的创建的单独计数器cf中查找计数。