2012-02-07 43 views
17

Estoy tratando de hacer las cosas con DynamoDB y NoSQL.Cómo modelar Estudiante/Clases con DynamoDB (NoSQL)

¿Cuál es el mejor (¿correcto?) Enfoque 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 contestar las siguientes preguntas:

que los alumnos están en una clase específica?

¿Qué clases toma un estudiante?

Gracias

+0

¿Es esta tarea? Si es así, por favor marqúelo como tal (no intente ser malo, pero solo lo revise). – Kiril

+5

No es tarea; Intenté encontrar la pregunta constructiva más sencilla en la que pudiera pensar después de pasar algún tiempo intentando comprender los modelos NoSQL y no relacionales ... –

Respuesta

14

Una sugerencia muy simple (sin teclas de rango) sería tener dos tablas: una según el tipo de consulta. Esto no es inusual en las bases de datos NoSQL.

En su caso tendríamos:

  • Una tabla con el atributo StudentStudentId como clave primaria (tipo de hash). Cada elemento podría tener un atributo llamado Attends, cuyo valor era una lista de Id. En clases.
  • Una tabla Class con el atributo ClassId como clave principal (tipo hash). Cada elemento podría tener un atributo llamado AttendedBy, cuyo valor era una lista de Id. 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 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.

+0

Dado que (a mi entender) estoy limitado a una clave hash en DynamoDB (no índices de columna) debe ser el nombre de usuario y no un usuario arbitrario dado que me gustaría obtener las clases de un alumno al proporcionar su nombre a una "consulta" –

+0

Sí, si tiene un nombre de usuario único para cada alumno, ese es el identificador correcto para usar . –

+0

¿Se considera des-normalización? –

-1

para unir dos tablas de Amazon DynamoDB

El ejemplo siguiente se asigna dos mesas colmena para 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; 
+4

Esto no es DynamoDB y no responde la pregunta sobre modelado de datos – Tyrsius