Cassandra Design для управления идентификаторами продуктов - PullRequest
0 голосов
/ 28 апреля 2011

Я новичок в Кассандре и хотел начать пробовать простой тест

Наша модель данных с традиционной СУБД выглядит следующим образом

Таблица компании (Id, Name)

Таблица продуктов (Id, Name, Company ID), где ID компании является ссылкой FK на таблицу компании

Таблица ProductInstance (Id, ProductID), где ProductID является ссылкой FK на таблицу Product

Таблица ProductInstanceRating (Id, ProductInstanceID, Комментарий), где ProductInstanceID - это ссылка FK на таблицу ProductInstance

Какие-нибудь предложения о том, как должен быть дизайн с Кассандрой?

Обновление:

Я пытался смотреть с точки зрения запросов

Данные для захвата

1) Ссылка на продукт - это составной ключ, состоящий из: Наименование продукта, Номер партии продукта и ИД клиента Наименование продукта: 12456 Номер партии продукта: PQ23 Идентификатор клиента: 879456

Тогда уникальным номером продукта будет что-то вроде 12456 | PQ23 | 879456

2) Экземпляр продукта будет уникальным набором хеш-номеров для каждого экземпляра вышеупомянутого продукта

И каждый экземпляр товара получит уникальный номер 784A, 876T и т. Д., И этот номер будет уникальным для конкретного артикула изделия

Ссылка на экземпляр продукта будет примерно такой: 12456 | PQ23 | 879456 | 784A

3) Каждый уникальный номер продукта может получить более 1 оценки

В этом случае запросы будут выглядеть примерно так:

Запрос1) Чтобы добавить / вставить оценку для экземпляра продукта; Строка выборки для продукта, т. Е. 12456 | PQ23 | 879456

Запрос2) Извлечь идентификатор ProductInstance в этой строке (возможно, имя семейства столбцов)

Query3) Добавить информацию о рейтинге в виде столбца: пара значений

Должен ли дизайн быть похож на

12456|PQ23|879456 {
      784A{timestamp1:{rating:valueA
                      person name:valueX}
           timestamp2:{rating:valueB
                      person name:valueY}}

      876T{timestamp1:{rating:valueC
                      person name:valueX}
           timestamp2:{rating:valueB
                      person name:valueY}}
}

После этого мы бы хотели:

Query4) получить все продукты, которые имеют экземпляры
Query5) получить все экземпляры продукта, которые имеют оценки
Query6) получить самый высокий рейтинг для продукта
Query7) получить средний рейтинг для продукта

Есть ли лучший и более эффективный способ реализовать это?

1 Ответ

1 голос
/ 29 апреля 2011

В Cassandra вам нужно подумать о том, какие запросы вы хотите выполнить (в отличие от СУБД, где вы можете создать довольно абстрактную модель домена и затем разработать SQL-запросы), потому что вы можете только выполнять поиск по ключу строки или использовать довольно ограниченные вторичные показатели. Любые другие индексы должны быть явно созданы в ваших семействах столбцов.

По этой причине принято денормализовать. Однако сохранение данных может оказаться более сложным, поскольку в Cassandra нет каскадных удалений и т. Д.

Одна структура-кандидат может состоять в том, чтобы иметь семейство столбцов ProductInstance для хранения оценок, затем семейство столбцов Product в качестве индекса для поиска экземпляров данного продукта, а затем семейство столбцов Company в качестве индекса для поиска продукты для конкретной компании. Или вы можете просто денормализовать и поместить Компанию в качестве столбца в столбце «Продукт».

Повторюсь, «правильная» структура для вас может быть определена только тогда, когда вы знаете, какие запросы вы хотите поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...