2012-10-06 27 views
10

Algo que no entiendo muy bien, he estado investigando para bases de datos para Node.JS y casi todo el mundo está recomendando bases de datos de tipo NoSQL como MongoDB o CouchDB para usar con Node.Node.JS con NoSQL o SQL?

Pero leyendo más veo que NoSQL no es tan bueno para los datos relacionales ... Pero ahí es donde me confundo: la mayoría de las aplicaciones comerciales (o aplicaciones de redes sociales) tienen datos relacionales.

Por ejemplo, supongamos que estoy creando una aplicación en Node.JS para una escuela que tiene alumnos, profesores y clases. Puedes ver que hay muchas relaciones ahí. ¿Todavía recomendarías usar NoSQL?

Respuesta

5

MongoDB a menudo se combina con Node.js debido a su naturaleza asíncrona compartida, y debido al fácil uso de objetos JavaScript JSON con la estructura de documentos mongoDB basada en JSON. Dicho esto, mongoDB tiene sus deficiencias, especialmente cuando se deben hacer informes complejos. Una de las mejores explicaciones que he encontrado es que replicar el fácil acceso a los datos en mongo requeriría una unión en mysql, sin embargo, si quisiera unir los datos de una manera diferente, sería bastante sencillo en SQL, pero mucho más complejo en Mongo.

5

Eche un vistazo a la mangosta para el nodo. Le permite definir modelos para una aplicación express. Puede usar .populate() para unir efectivamente lo que sería una clave externa en 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); 

árbitros de ahorro

árbitros de ahorro a otros documentos funciona de la misma forma en que normalmente se guarda ObjectID, simplemente asignar una 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! 
    }); 
}) 

Población

Así Hasta ahora no hemos hecho nada especial. Simplemente hemos creado una Persona y una Historia. Ahora echemos un vistazo a la población del _creator de nuestra historia:

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" 
})