Подтвердить что ты не робот

Как смоделировать студент/классы с помощью DynamoDB (NoSQL)

Я пытаюсь войти в DynamoDB и NoSQL.

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

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

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

Какие классы принимает студент?

Спасибо

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Чтобы присоединиться к двум таблицам 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;