2015-03-31 71 views
0

我在模型(GroupName)和动态部分1-x(成员)中总是有一定的固定结构。Mongoose/MongoDB数据库设计

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

是更好地利用两个表,并在以后通过IDS将它们连接起来是这样的:

Groups: 
    Group1 
    GroupName 
    GroupId 
    Group2 
    GroupName 
    GroupId 

Members: 
    Member 1 
    GroupId 
    Member 2 
    GroupId 

或使用Schema.Types.Mixed(或其他任何东西)?以及如何以第二种方式做到这一点?

以后我会一直使用它们。从直觉我会选择第一种方法: http://blog.mongolab.com/2013/04/thinking-about-arrays-in-mongodb/

编辑: 但是即使我有这个问题的第二种方法,即一个成员可以属于多个组,我不希望存储了他两次。这些团体是独一无二的,只存在一次。

但我是MongoDb的新手,所以我想了解什么是最佳选择以及为什么。

编辑II: 我选择了两个分为两个文档。这是实施的模式不是正确的像这样的:

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

看看这个:http://blog.mongodb。org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1 – ZeMoon 2015-03-31 08:11:07

回答

2

有对MongoDB的博客,讲述了一个模式,可以根据设计的不同方式的优秀post模型关系。

我相信你最好的模式是使用带有成员ID的嵌入式数组。

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

编辑

有在架构需要一个修正:

// 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); 
+0

是的,阅读后这听起来也是最好的。我有一对一的关系,但我想单独访问成员。其实这些成员是非常静态的,很少更新。所以我会选择非规范化的方式为会员名称。我是对的,在我的猫鼬模式中,我将成员定义为数组? – 2015-03-31 13:48:26

+0

是的。那是对的。您还可以为数组提供一个类型,如[String]或[SomeSchema] – ZeMoon 2015-03-31 13:58:29

+0

如果您可以查看编辑II,那将会很棒。感谢您的帮助。在开始s.th时,我总感觉有点失落。 – 2015-03-31 14:00:36

0

我不知道您的文件包含,如果成员是一个不断增长的阵列 - 例如Group1在任何特定时刻都可以有1-n members。如果这是你应该选择2去的情况:你可以试试:

{gId: 1, mId: 5} 

这是最适合Social graph的设计。你Group documents将有一个固定的大小,这是很好的记忆,你可以很容易地得到一组的所有成员(不要忘记指数gIdmId

如果每个组有成员固定数量的(或不增长和缩小)然后选择1

mongoDb团队(还有src代码)有一篇很棒的文章谈论设计。

Socialite