2012-05-31 4 views
1

У меня есть следующие настройки:
Имейте пункты CF и ключевые слова CF.
Каждый элемент имеет ноль, одно или несколько ключевых слов, хранящихся в столбцах.
Каждое ключевое слово имеет один или несколько элементов, хранящихся в столбцах.
Это выглядит следующим образом:Дизайн схемы Apache Cassandra

 

    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 } 
    } 

, когда я добавить новый элемент, я добавляю столбец «Веб-страница» в ключевых словах, если необходимому.
когда я Удаляя элемент, я удаление колонки «пункт: хх», а также

вопрос заключается в том, чтобы избежать «пустых» ключевые слова, например, если я удалить элемент Nokia «нет»:

 

    keywords{ 
     ... 
     NOKIA  { webpage => www.domain.com/nokia } 
     phone  { webpage => www.domain.com/phone } 
    } 

Я могу считать элемент ломтика: *, но из-за возможной согласованности это будет, вероятно, неправильным aproach.

+0

Что делать, если я денормализовал столбец «веб-страницы» для каждого элемента: столбец xx? – Nick

ответ

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, а строка автоматически удаляется (призрак), если там нет полей. Однако я до сих пор не уверен, что это такая яркая идея.

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, рассматривать его как удаленные. Вы не должны удалять столбец «веб-страницы», если вы читаете строку с count == 0, так как может быть операция одновременного добавления.

+0

К сожалению, столбцы счетчиков могут быть добавлены только в специальное семейство столбцов CounterColumnType. Этот подход в целом может работать, но вам нужно будет искать счет в отдельном счетчике cf, созданном для этой цели. – nickmbailey

Смежные вопросы