database - query - Cómo modelar Estudiante/Clases con DynamoDB(NoSQL)
get all items from dynamodb table (2)
Una sugerencia muy simple (sin teclas de rango) sería tener dos tablas: una por tipo de consulta. Esto no es inusual en las bases de datos NoSQL.
En tu caso, tendríamos:
- Una tabla
Student
con el atributoStudentId
como (tipo hash) clave principal. Cada elemento podría tener un atributo llamadoAttends
, cuyo valor era una lista de Ids en las clases. - Una tabla
Class
con atributoClassId
como (tipo hash) clave principal. Cada elemento podría tener un atributo llamadoAttendedBy
, cuyo valor era una lista de Ids en los estudiantes.
Realizar sus consultas sería simple. La actualización de la base de datos con una relación "atiende" entre un alumno y una clase requiere dos escrituras separadas, una para cada tabla.
Otro diseño tendría una tabla. Attends
con una clave principal de hash y rango. Cada registro representaría la asistencia de un alumno a una clase. El atributo hash podría ser el Id de la clase y la clave de rango podría ser el Id del alumno. Los datos suplementarios sobre la clase y el estudiante residirían en otras tablas, entonces.
Estoy tratando de hacer lo que quiero con DynamoDB y NoSQL.
¿Cuál es el mejor enfoque (¿correcto?) Para modelar una tabla de estudiantes y tablas de clase con respecto al hecho de que necesito tener una relación de estudiante-en-clase. Estoy teniendo en cuenta que no hay un segundo índice disponible en DynamoDB.
El modelo debe responder las siguientes preguntas:
¿Qué estudiantes están en una clase específica?
¿Qué clases toma un estudiante?
Gracias
Para unir dos tablas de Amazon DynamoDB
El siguiente ejemplo asigna dos tablas Hive a los datos almacenados en Amazon DynamoDB. Luego llama a una combinación a través de esas dos tablas. La unión se calcula en el clúster y se devuelve. La unión no tiene lugar en Amazon DynamoDB. Este ejemplo devuelve una lista de clientes y sus compras para los clientes que han realizado más de dos pedidos.
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;