2012-02-07 10 views
17

Sto cercando di ottenere risultati con DynamoDB e NoSQL.Come modellare Studente/Classi con DynamoDB (NoSQL)

Qual è l'approccio migliore (giusto?) Per la modellazione di una tabella studenti e di classi in relazione al fatto che è necessario avere una relazione studente-in-classe. Sto prendendo in considerazione che non esiste un secondo indice disponibile in DynamoDB.

Il modello ha la necessità di rispondere alle seguenti domande:

cui gli studenti sono in una classe specifica?

Quali classi prende uno studente?

Grazie

+0

È questo compito? Se è così, taggalo come tale (non cercare di essere cattivo, ma semplicemente controllando). – Kiril

+5

Non è compito di casa; Ho cercato di trovare la domanda costruttiva più semplice a cui potessi pensare dopo aver trascorso un po 'di tempo a cercare di capire NoSQL e modelli non relazionali ... –

risposta

14

Un suggerimento semplice (senza chiavi range) sarebbe avere due tabelle: Uno per tipo di query. Questo non è insolito nei database NoSQL.

Nel tuo caso avremmo:

  • Un tavolo Student con l'attributo StudentId come chiave primaria (tipo hash). Ogni articolo potrebbe quindi avere un attributo denominato Attends, il cui valore era un elenco di Id sulle classi.
  • Una tabella Class con attributo ClassId come chiave primaria (tipo hash). Ogni articolo potrebbe quindi avere un attributo denominato AttendedBy, il cui valore era un elenco di Id sugli studenti.

L'esecuzione delle vostre domande sarebbe semplice. L'aggiornamento del database con una relazione "attends" tra uno studente e una classe richiede due scritture separate, una per ogni tabella.

Un altro progetto avrebbe una tabella Attends con una chiave primaria di hash e di intervallo. Ogni registrazione rappresenterebbe la presenza di uno studente in una classe. L'attributo hash potrebbe essere l'Id della classe e la chiave dell'intervallo potrebbe essere l'Id dello studente. Dati supplementari sulla classe e lo studente risiederanno in altre tabelle, quindi.

+0

Dal momento che (a quanto mi risulta) sono limitato a una chiave hash in DynamoDB (no indici di colonne) deve essere il nome utente e non un utente arbitrario in quanto mi piacerebbe ottenere le classi di uno studente fornendo il suo nome a una "query" –

+0

Sì, se si ha un nome utente univoco per ogni studente, questo è l'identificatore corretto da usare . –

+0

E 'considerato de-normalizzazione? –

-1

per unire due tabelle Amazon DynamoDB

Il seguente esempio mappe due tabelle Hive ai dati memorizzati in Amazon DynamoDB. Quindi chiama un join su questi due tavoli. Il join viene calcolato sul cluster e restituito. Il join non ha luogo in Amazon DynamoDB. Questo esempio restituisce un elenco di clienti e i loro acquisti per i clienti che hanno effettuato più di due ordini.

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

Questo non è DynamoDB e non risponde alla domanda sulla modellazione dei dati – Tyrsius