2012-10-06 15 views
10

Qualcosa che non capisco, ho fatto qualche ricerca per i database per Node.JS e quasi tutti raccomandano database di tipo NoSQL come MongoDB o CouchDB da usare con Node.Node.JS con NoSQL o SQL?

Ma la lettura di questo vedo che NoSQL che non è grande per i dati relazionali ... Ma è lì che mi sto confuso: La maggior parte delle applicazioni aziendali (o tipo di rete applicazioni sociali) hanno dati relazionali.

Ad esempio, supponiamo che sto costruendo un'applicazione in Node.JS per una scuola che ha studenti, insegnanti, classi. Puoi vedere che ci sono molte relazioni lì dentro. Consiglieresti comunque l'uso di NoSQL?

risposta

5

MongoDB è spesso associato a Node.js a causa della loro natura asincrona condivisa e per l'uso semplice degli oggetti JSON javascript con la struttura del documento mongoDB basata su JSON. Detto questo, mongoDB ha i suoi difetti, in particolare quando devono essere eseguiti report complessi. Una delle migliori spiegazioni che ho trovato è che la replica dell'accesso facile ai dati in mongo richiederebbe un join in mysql, tuttavia se si volesse unire i dati in un modo diverso sarebbe piuttosto semplice in SQL, ma molto più complesso in Mongo.

5

Dai un'occhiata a mangusta per nodo. Permette di definire modelli per un'applicazione espressa. È possibile utilizzare .populate() per unirsi efficacemente su quale sarebbe una chiave esterna su un sistema RDBMS.

http://mongoosejs.com/docs/populate.html

var mongoose = require('mongoose') 
    , Schema = mongoose.Schema 

var PersonSchema = new Schema({ 
    name : String, 
    age  : Number, 
    stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }] 
}); 

var StorySchema = new Schema({ 
    _creator : { type: Schema.Types.ObjectId, ref: 'Person' }, 
    title : String, 
    fans  : [{ type: Schema.Types.ObjectId, ref: 'Person' }] 
}); 

var Story = mongoose.model('Story', StorySchema); 
var Person = mongoose.model('Person', PersonSchema); 

arbitri Salvataggio

Salvataggio arbitri ad altri documenti funziona allo stesso modo che normalmente salva objectIds, basta assegnare un ObjectId:

var aaron = new Person({ name: 'Aaron', age: 100 }); 

aaron.save(function (err) { 
    if (err) return handleError(err); 

    var story1 = new Story({ 
    title: "Once upon a timex.", 
    _creator: aaron._id // assign an ObjectId 
    }); 

    story1.save(function (err) { 
    if (err) return handleError(err); 
    // thats it! 
    }); 
}) 

Popolazione

Così lontano non abbiamo fatto niente di speciale. Abbiamo semplicemente creato una persona e una storia. Ora diamo un'occhiata a popolamento della nostra storia _creator:

Story 
.findOne({ title: /timex/ }) 
.populate('_creator') 
.exec(function (err, story) { 
    if (err) return handleError(err); 
    console.log('The creator is %s', story._creator.name); // prints "The creator is Aaron" 
})