Как моделировать ученика / классы с помощью DynamoDB (NoSQL) - PullRequest
18 голосов
/ 07 февраля 2012

Я пытаюсь разобраться с DynamoDB и NoSQL.

Каков наилучший (правильный?) Подход для моделирования таблиц учеников и таблиц классов с учетом того факта, что мне нужно иметьотношения ученик в классе.Я принимаю во внимание, что в DynamoDB нет второго индекса.

Модель должна ответить на следующие вопросы:

Какие учащиеся находятся в определенном классе?

Какие уроки посещает студент?

Спасибо

Ответы [ 2 ]

15 голосов
/ 08 февраля 2012

Очень простым предложением (без ключей диапазона) было бы иметь две таблицы: по одной на тип запроса.Это не является необычным для баз данных NoSQL.

В вашем случае у нас будет:

  • Таблица Student с атрибутом StudentId в качестве первичного ключа (типа хэша).Каждый элемент может затем иметь атрибут с именем Attends, значением которого является список идентификаторов классов.
  • Таблица Class с атрибутом ClassId в качестве первичного ключа (тип хэша).Каждый элемент может затем иметь атрибут с именем AttendedBy, значением которого является список идентификаторов учащихся.

Выполнение ваших запросов будет простым.Обновление базы данных с помощью одного отношения «посещает» между учеником и классом требует двух отдельных записей, по одной в каждую таблицу.

В другом проекте будет одна таблица Attends с первичным ключом хэша и диапазона.Каждая запись будет представлять посещаемость одного студента в одном классеАтрибутом hash может быть Id класса, а ключом диапазона - Id студента.Дополнительные данные о классе и ученике будут находиться в других таблицах.

0 голосов
/ 26 апреля 2012

Для объединения двух таблиц Amazon DynamoDB

В следующем примере сопоставляются две таблицы Hive с данными, хранящимися в Amazon DynamoDB.Затем он вызывает соединение между этими двумя таблицами.Объединение вычисляется на кластере и возвращается.Объединение не происходит в Amazon DynamoDB.В этом примере возвращается список клиентов и их покупок для клиентов, разместивших более двух заказов.

CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "Purchases",
"dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items");

CREATE EXTERNAL TABLE hive_customers(customerId bigint, customerName string, customerAddress array<String>) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Customers",
"dynamodb.column.mapping" = "customerId:CustomerId,customerName:Name,customerAddress:Address");

Select c.customerId, c.customerName, count(*) as count from hive_customers c 
JOIN hive_purchases p ON c.customerId=p.customerId 
GROUP BY c.customerId, c.customerName HAVING count > 2;
...