何时使用嵌套数组与使用单独的集合

时间:2014-09-14 15:14:43

标签: angularjs express mongoose

我需要在dbref中使用mongoose,但我不知道哪种设计对我更好。

首先设计:

var user = mongoose.Schema({
    name: 'string'
});

var eventSchema = mongoose.Schema({
    title: 'string',
    propietary_id: 'String',
    comments : [{
        text: 'string',
        user: { type : mongoose.Schema.Types.ObjectId, ref : 'users' },
        createdAt: {type: Date, default: Date.now }  
    }]
});

第二个设计:

var user = mongoose.Schema({
    name: 'string'
});

var eventSchema = mongoose.Schema({
    title: 'string',
    propietary_id: 'String'
});

var commentSchema = mongoose.Schema({
    text: 'string',
    event_id : { type : mongoose.Schema.Types.ObjectId, ref : 'events' },
    user_id : { type : mongoose.Schema.Types.ObjectId, ref : 'users' },
    createdAt: {type: Date, default: Date.now }  
});

它是如何工作的?在我的网站上有一个事件列表,如果你想看到评论,你必须点击每个事件,然后angularjs获取所选事件的所有评论(文本,用户名和用户照片)。

1 个答案:

答案 0 :(得分:0)

两种解决方案都有利弊,最适合您的解决方案取决于您的使用方法。请记住,您可以独立于您的设计生成完全相同的API,但这仅限于您可以快速轻松地维护后端。首先考虑两种设计:


首先设计:

首先评论,我不会将评论保存为嵌套文档,而是作为数组保存。否则,每个活动仅限一个评论。请改用此架构:

comments: [
    {
        text: { type: String },
        user: { type: mongoose.Schema.Types.ObjectId, ref : 'users' },
        createdAt: { type: Date, default: Date.now },
    }
]

优点:

  • 无需多个收藏
  • 您将在get请求中返回与事件一起返回的注释,这意味着对您的后端的请求减少
  • 无需将评论映射到活动

缺点:

  • 即使您不希望这些评论显示,您也会将此评论返回给您
  • 如果对事件有很多评论,请求响应会非常大
  • 如果你想删除或编辑数组中的注释,那将会更棘手(虽然不是不可能)

第二个设计:

优点:

  • 您将分隔事件和评论,这意味着更精简的对象
  • 您可以更轻松地提取一条评论进行编辑或删除
  • 您可以更轻松地获取没有评论的活动,然后在另一点请求评论

缺点:

  • 您需要始终将评论映射到意味着更多代码的事件
  • 两个集合通常意味着两个请求
  • 维护其他收藏品

判决:

所有优缺点都取决于您需要编写多少额外代码。当然,您也可以随后在第二个设计中返回与事件一起返回的注释,但是您将首先提取注释并将其与事件对象一起返回,这将意味着要维护额外的代码。

我认为第二种设计对你来说会更好。我通过您的评论来判断,如果用户点击某个活动,您只需要评论。然后,当用户点击事件时,我会首先请求事件并再次发出评论请求,但是,随着事件返回总是返回注释应该使得ui更加敏捷,因为注释已经被加载。

这一切最终取决于您对数据的重要性。如果您对任何要点有任何疑问,请与我们联系。