Node.js - Mongoose / MongoDB - 模型架构

时间:2011-12-09 04:21:10

标签: mongodb node.js mongoose

我在Node.js中创建一个博客系统,mongodb作为db。

我有这样的内容:(博客文章):

// COMMENTS SCHEMA:
// ---------------------------------------
var Comments = new Schema({

    author: {
        type: String
    },
    content: {
        type: String
    },
    date_entered: {
        type: Date,
        default: Date.now
    }

});
exports.Comments = mongoose.model('Comments',Comments);
var Tags = new Schema({ 
    name: {
        type: String
    } 
});
exports.Tags = mongoose.model('Tags',Tags);


// CONTENT SCHEMA:
// ---------------------------------------
exports.Contents = mongoose.model('Contents', new Schema({

    title: {
        type: String
    },
    author: {
        type: String
    },
    permalink: {
        type: String, 
        unique: true,
        sparse: true
    },
    catagory: {
        type: String,
        default: ''
    },
    content: {
        type: String
    }, 
    date_entered: {
        type: Date,
        default: Date.now
    }, 
    status: {
        type: Number
    },
    comments: [Comments],
    tags: [Tags]

}));

我对这种类型的数据库有点新,我在LAMP堆栈上用于MySQL。

基本上我的问题如下:

  • 了解将内容作者与用户关联的最佳方式 DB?
  • 另外,最好的方法是做标签和类别吗?

在MYSQL中,我们会有一个标签表和一个类别表,并按键关联,我不确定在Mongo中这样做的最佳和最佳方式。

感谢您的时间!!

2 个答案:

答案 0 :(得分:2)

Mongo的一些想法:

  • 关联用户的最佳方式是电子邮件地址 - 作为内容/评论文档的属性 - 电子邮件通常是可靠的唯一密钥。 MongoDB没有外键或相关约束。但那很好。
  • 如果您有注册政策,请将用户名,电子邮件地址和其他详细信息添加到用户集合中。然后使用用户名和电子邮件对内容文档进行反规范化。如果用户因任何原因更改了名称,则必须更新所有相关内容/注释。但只要文档中有电子邮件地址,这应该很容易。
  • 标签和类别最好建模为内容文档中的两个列表,恕我直言。
  • 如果需要,您还可以在这些属性上创建两个索引。取决于您要提供的访问模式和UI功能
  • 您还可以添加一个文档,该文档在内容集合中保留标记列表和类别列表,并使用$ addToSet向此文档添加新标记和类别。然后,您可以显示一个以当前标记为起点的组合框。
  • 最后,请仔细考虑您计划访问数据的方式,然后设计文档,集合和文档。因此指数
  • [更新12/9/11]在MongoSv和Eliot(CTO 10gen)提出了与此问题相关的模式:每个用户(可能会变大)的每个评论文档每天都有一个评论文档供使用使用_id = -YYYYMMDD,甚至每月一个,具体取决于评论的频率。这样可以优化索引创建/文档增长与文档扩散(如果设计中每个用户只有一条注释)。

答案 1 :(得分:0)

  1. 将内容作者与MongoDB中的用户相关联的最佳方法是在作者集合中使用一个数组,该数组保留对用户的引用。基本上是数组,因为一个内容/书籍可能有多个作者,即您需要将一个内容与多个用户相关联。

  2. 分类的最佳方法是在数据库中创建不同的集合,与上面类似,在内容中保留数组。

  3. 我希望它至少有一点帮助。