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
Studentcon el atributoStudentIdcomo (tipo hash) clave principal. Cada elemento podría tener un atributo llamadoAttends, cuyo valor era una lista de Ids en las clases. - Una tabla
Classcon atributoClassIdcomo (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;