Как смоделировать студент/классы с помощью DynamoDB (NoSQL)
Я пытаюсь войти в DynamoDB и NoSQL.
Каков наилучший (правильный?) подход для моделирования таблицы учеников и таблиц классов в отношении того, что мне нужно иметь отношения "ученик-в-классе".
Я принимаю во внимание, что в DynamoDB нет второго индекса.
Модель должна ответить на следующие вопросы:
Какие ученики находятся в определенном классе?
Какие классы принимает студент?
Спасибо
Ответы
Ответ 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;