Andi Giga
Andi Giga

Reputation: 4162

Mongoose/ MongoDB Database Design

I always have a certain fixed structure in my model (GroupName) and a dynamic part of 1-x (Members).

Group1 
  GroupName
  Member 1
  Member 2
Group2
  GroupName
  Member 1
Group3
  GroupName
  Member 1
  Member 2
  Member 3

Is it better to use two tables and connect them later via ids like this:

Groups:
  Group1
    GroupName
    GroupId
  Group2
    GroupName
    GroupId

Members:
  Member 1
   GroupId 
  Member 2
   GroupId

or to use Schema.Types.Mixed(or anything else)? And how to do it in the second way?

I will always use them in combination later. From a gut feeling I would choose the first method: http://blog.mongolab.com/2013/04/thinking-about-arrays-in-mongodb/

EDIT: But even on the second method I have the issue, that one member can belong to multiple groups and I don't want to store him twice. The groups are unique and do only exist once.

But I'm new to MongoDb so I want to learn what's the best option and why.

EDIT II: I have choosen two divide it into two docs. Is this implementation of the Schemas than correct like this:

var mongoose = require('mongoose');

// define the schema for group model
var groupSchema = mongoose.Schema({
  href: {
      type: String,
      required: true,
      unique: true
  },
  title: String,
  members: [id: Schema.Types.ObjectId, name: String]
});

// create the model for users and expose it to our app
module.exports = mongoose.model('group', groupSchema);

&&

var mongoose = require('mongoose');

// define the schema for member model
var memberSchema = mongoose.Schema({
  id: {
    type:Schema.Types.ObjectId,
    required: true,
    unique: true
  },
  amount: String,
  name: String
});


// create the model for users and expose it to our app
module.exports = mongoose.model('member', memberSchema);

Upvotes: 0

Views: 204

Answers (2)

ZeMoon
ZeMoon

Reputation: 20274

There is an excellent post on the MongoDB blog which tells us about the various ways a schema can be designed based on the model relationships.

I believe the best schema for you would be to make use of embedded arrays with the member IDs.

//Group
{
    _id: '1234',
    name: 'some group',
    members : [
         'abcd',
         'efgh'
        ]
}

EDIT

There is a correction needed in the schema:

// define the schema for group model
var groupSchema = mongoose.Schema({
  href: {
      type: String,
      required: true,
      unique: true
  },
  title: String,
  members: [{id: Schema.Types.ObjectId, name: String}] //Needs to be enclosed with braces
});

// create the model for users and expose it to our app
module.exports = mongoose.model('group', groupSchema);

Upvotes: 2

royB
royB

Reputation: 12977

I don't know what your documents contains and if members are a growing array - for example Group1 can have 1-n members in any given moment . if this is the case you should go with option 2: try something like:

{gId: 1, mId: 5}

That is a design best suited for Social graph. Your Group documents will have a fixed size which is good for memory and you can easily get all the members of a group (just don't forget to index gId and mId)

If for each group there is a fixed number of members (or not growing and shrinking to much) then go with option 1

There is a great post by mongoDb team (and also src code) that talks about design.

Socialite

Upvotes: 0

Related Questions