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

18

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

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

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

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

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

Спасибо

    
задан Chen Harel 07.02.2012 в 17:07
источник
  • Это домашнее задание? Если это так, пожалуйста, пометьте его как таковой (не пытайтесь быть средним, но просто проверяете). –  Kiril 07.02.2012 в 17:30
  • Это не домашнее задание; Я попытался придумать самый простой конструктивный вопрос, о котором я мог подумать, потратив некоторое время на то, чтобы понять NoSQL и нереляционные модели ... –  Chen Harel 07.02.2012 в 19:06

2 ответа

14

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

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

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

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

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

    
ответ дан Niels Christensen 07.02.2012 в 22:49
  • Поскольку (насколько мне известно), я ограничен одним хэш-ключом в DynamoDB (без индексов столбцов), это должно быть имя пользователя, а не какое-то произвольное имя пользователя, так как я хотел бы получить классы ученика, предоставив его имя «запросу» " –  Chen Harel 08.02.2012 в 10:16
  • Да, если у вас есть уникальное имя пользователя для каждого учащегося, это правильный идентификатор для использования. –  Niels Christensen 08.02.2012 в 13:29
  • Рассматривается ли это де-нормализация? –  Chen Harel 08.02.2012 в 14:18
  • Какое «это»? В общем случае нормализация и денормализация обычно используются в контексте реляционных баз данных. –  Niels Christensen 09.02.2012 в 23:31
-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;
    
ответ дан Venkatt Guhesan 25.04.2012 в 22:09
  • Это не DynamoDB, и не отвечает на вопрос о моделировании данных –  Tyrsius 31.03.2017 в 18:12