2012-01-14 9 views
7

Questa domanda non è necessariamente Couchbase 2.0 sviluppare un'anteprima specifica tuttavia penso che possa aiutare le persone con indagini sul nuovo prodotto Couchbase.Couchbase data modeling - Document oriented

Sto cercando consigli sulla modellazione dei dati. Stiamo esaminando Couchbase al fine di utilizzarlo eventualmente per l'analisi in tempo reale.

Tuttavia non riesco a trovare alcuna documentazione sul modo migliore per modellare i dati del mondo reale.

Proporrò uno scenario e se la comunità potrebbe aiutarmi o discutere alcune idee su come questo potrebbe essere modellato sarebbe molto utile?

Nota che questa non è rappresentativo del nostro prodotto e non sto chiedendo alla gente di risolvere il nostro modellazione per noi la questione è più previsto per la discussione

lascia supporre che i clienti fanno gli acquisti di prodotti in una data particolare/tempo, i prodotti hanno informazioni con loro come id, nome, descrizione e prezzo, un acquisto viene eseguito in una data.

Il requisito iniziale è poter contare tutti gli acquisti tra due date. Per ogni giorno potrebbero esserci più di 100.000 acquisti: questo è un business piuttosto grande;)

Se una qualsiasi delle sintassi non è corretta, per favore fatemelo sapere - tutti i consigli/aiuto sono benvenuti.

Se abbiamo modellato il qualcosa di dati in questo modo (che forse completamente errata):

Acquisti con prodotti

{ 
    "_id" : "purchase_1", 
    "_rev" : "1-1212afdd126126128ae", 
    "products" : [ 
     "prod_1" : { 
      "name" : "Milk", 
      "desc" : "Semi-skimmed 1ltr", 
      "price" : "0.89" 
     }, 
     "prod_7568" : { 
      "name" : "Crisps", 
      "desc" : "Salt and Vinegar", 
      "price: "0.85" 
     } 
    ] 
    "date" : "2012-01-14 14:24:33" 
} 

{ 
    "_id" : "purchase_2", 
    "_rev" : "1-1212afdd126126128ae", 
    "products" : [ 
     "prod_89001" : { 
      "name" : "Bread", 
      "desc" : "White thick sliced", 
      "price: "1.20" 
     } 
    ] 
    "date" : "2012-01-14 15:35:59" 
} 

Quindi, dato che il layout del documento possiamo vedere ogni acquisto e siamo in grado di vedere il i prodotti che erano in quell'acquisto - tuttavia come potremmo andare a contare tutti gli acquisti tra due date? Inoltre, come è possibile visualizzare un log di tutti gli acquisti tra due date in ordine decrescente di data?

È adatto per questo Couchbase?

Ci potrebbero essere centinaia di migliaia di acquisti tra due date e il cliente non piace aspettare per i rapporti ... .come sono sicuro che ognuno di noi ha sperimentato;)

sarebbe meglio usare l'incr funzioni e se sì, come andresti a modellare i dati?

Mille grazie a tutti coloro che lo leggono, spero di poterlo spiegare ulteriormente dando ulteriori esempi di problemi di modellazione del mondo reale, se possibile.

James

+0

Ciao a tutti, Un utente disponibile sul canale IRC Couchbase mi ha segnalato in direzione di pagine World Tour 'CouchConf'. Ci sono molte presentazioni con video e diapositive di accompagnamento di ciascuna conferenza. http://www.couchbase.com/couchconf-world-tour In particolare quello di San Francisco ha un sacco di materiale di supporto. http://www.couchbase.com/couchconf-sanfrancisco – eggsy84

risposta

6

Nel caso più semplice si potrebbe scrivere una funzione Map che creerebbe una vista utilizzando il campo data come chiave.

Quindi, con un design leggermente modificato il documento:

{ 
    "_id": "purchase_1", 
    "_rev": "2-c09e24efaffd446c6ee8ed6a6e2b4a22", 
    "products": [ 
     { 
      "id": "prod_3", 
      "name": "Bread", 
      "desc": "Whole wheat high fiber", 
      "price": 2.99 
     } 
    ], 
    "date": "2012-01-15 12:34:56" 
} 

{ 
    "_id": "purchase_2", 
    "_rev": "2-3a7f4e4e5907d2163d6684f97c45a715", 
    "products": [ 
     { 
      "id": "prod_1", 
      "name": "Milk", 
      "desc": "Semi-skimmed 1ltr", 
      "price": 0.89 
     }, 
     { 
      "id": "prod_7568", 
      "name": "Crisps", 
      "desc": "Salt and Vinegar", 
      "price": 0.85 
     } 
    ], 
    "date": "2012-01-14 14:24:33" 
} 

La vostra funzione mappa sarà simile:

function(doc) { 
    for (var product in doc.products) { 
    emit(doc.date, doc.products[product].price); 
    } 
} 

Si potrebbe eventualmente aggiungere una funzione che avrebbe ridurre riassumere gli acquisti in base alla data.

function(keys, values) { 
    return sum(values); 
} 

È possibile interrogare la vista utilizzando i parametri startkey e endkey.

http://localhost:5984/couchbase/_design/Products/_view/total_price_by_date?startkey="2012-01-01"&endkey="2012-01-31"&group=true 

L'uscita dal interrogare la vista sarebbe:

{"rows":[ 
{"key":"2012-01-14 14:24:33","value":4.94}, 
{"key":"2012-01-15 12:34:56","value":2.99} 
]} 

o rimuovere il parametro di gruppo per ottenere la somma per l'intero intervallo di date:

{"rows":[ 
{"key":null,"value":7.930000000000001} 
]} 

Speranza che aiuta.

- John

+1

Ottima risposta, grazie! Quindi questo è il modo comune per modellare i dati con la base di divano? Per esempio. Supponiamo che tutto ciò che volevo sapere fosse quanti prodotti sono stati venduti al giorno (non il valore totale) questo di solito dovrebbe essere modellato come tale e quindi calcolato con una vista e mappa/riduzione o le persone tendono a memorizzare i dati come si aspettano leggerlo - usando la funzione counters (incr) o qualcosa di simile? – eggsy84