2012-10-06 8 views
10

Etwas, das ich nicht ganz verstehe, ich habe einige Recherchen für Datenbanken für Node.JS durchgeführt und fast jeder empfiehlt NoSQL-Typ-Datenbanken wie MongoDB oder CouchDB mit Node zu verwenden.Node.JS mit NoSQL oder SQL?

Aber weiter lesen Ich sehe, dass NoSQL nicht so toll für relationale Daten ist ... Aber das ist, wo ich verwirrt bin: Die meisten Geschäftsanwendungen (oder Social Networking-Apps) haben relationale Daten.

Nehmen wir zum Beispiel an, ich baue eine Anwendung in Node.JS für eine Schule, die Schüler, Lehrer, Klassen hat. Sie können sehen, dass dort viele Beziehungen sind. Würden Sie trotzdem NoSQL empfehlen?

Antwort

5

MongoDB wird oft wegen ihrer gemeinsamen asynchronen Natur mit Node.js gepaart, und wegen der einfachen Verwendung von Javascript JSON-Objekten mit der JSON-basierten mongoDB-Dokumentstruktur. Das heißt, mongoDB hat seine Schwächen, insbesondere wenn komplexe Berichte erstellt werden müssen. Eine der besseren Erklärungen, die ich gefunden habe, ist, dass die Replikation des einfachen Datenzugriffs in mongo eine Verknüpfung in mysql erfordert. Wenn Sie jedoch die Daten auf eine andere Weise verbinden möchten, wäre das in SQL ziemlich einfach, aber viel komplexer Mongo.

5

Werfen Sie einen Blick auf Mungo für Knoten. Sie können Modelle für eine Express-Anwendung definieren. Sie können .populate() verwenden, um einen Fremdschlüssel in einem RDBMS-System effektiv zu verknüpfen.

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); 

Saving Refs

Saving Refs zu anderen Dokumenten funktioniert auf die gleiche Art und Weise Sie in der Regel ObjectIDs speichern, weisen nur eine 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! 
    }); 
}) 

Bevölkerung

So Bisher haben wir nichts Besonderes gemacht. Wir haben lediglich eine Person und eine Geschichte erstellt. Werfen wir nun einen Blick darauf, unsere _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" 
}) 
unserer Geschichte zu bevölkern