Node.JS с NoSQL или SQL?

Что-то я не совсем понимаю, я делал некоторые исследования для баз данных для Node.JS, и почти все рекомендуют базы данных типа NoSQL, такие как MongoDB или CouchDB для использования с Node.

Но, читая далее, я вижу, что NoSQL не так хорош для реляционных данных... Но то, где я запутался: большинство бизнес-приложений (или приложений типа социальных сетей) имеют реляционные данные.

Например, скажем, я создаю приложение в Node.JS для школы, в которой есть ученики, учителя, классы. Вы можете видеть там много отношений. Вы по-прежнему рекомендуем использовать NoSQL?

Ответ 1

MongoDB часто сопрягается с Node.js из-за их общей асинхронной природы и из-за простого использования объектов JSON Javascript с структурой документа mongoDB на основе JSON. Тем не менее, у mongoDB есть свои недостатки, особенно когда требуется сложная отчетность. Одно из лучших объяснений, которое я нашел, заключается в том, что для репликации простого доступа к данным в mongo потребуется соединение в mysql, однако, если вы захотите присоединиться к данным другим способом, это будет довольно просто в SQL, но гораздо более сложным в Монго.

Ответ 2

Взгляните на mongoose для node. Он позволяет определять модели для экспресс-приложения. Вы можете использовать .populate() для эффективного объединения того, что будет внешним ключом в системе РСУБД.

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

Сохранение ссылок

Сохранение ссылок на другие документы работает так же, как вы обычно сохраняете объектные объекты, просто назначьте 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!
  });
})

Население

До сих пор мы не делали ничего особенного. Мы просто создали Человека и Историю. Теперь давайте взглянем на заполнение нашей истории _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"
})