【问题标题】:Mongodb database schema design issueMongodb数据库架构设计问题
【发布时间】:2015-08-29 14:02:55
【问题描述】:

我的 mongodb 数据库中有两个集合:- 用户、俱乐部

User Schema :- 
var UserSchema = new Schema({
Name: {
    type: String ,
    required: true
},
Clubs: [
    {type: mongoose.Schema.Types.ObjectId, ref: 'Club'}
]});

现在,当用户加入俱乐部时,我会更新俱乐部数组。但我也经常需要获取特定俱乐部的所有用户。因此,我将俱乐部模式创建为:-

var ClubSchema = new Schema({
clubName : {
    type: String , 
    unique: true ,
    required: true
},
members : [
{type: mongoose.Schema.Types.ObjectId, 
    ref: 'User' , 
    default: []
} ]});

我的问题是:这是正确的做法,还是我应该只在用户收藏中维护这个俱乐部信息?也许我需要优化与获取属于某个俱乐部的所有用户相关的查询。

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    说实话,很难说什么是“正确的方法”,因为这很可能取决于您的应用程序查询和架构。

    我看到有人按照你上面的设计做了;通过在两个集合中使用引用来解决多对多关系。 这适用于您上面的案例查询:

    db.user.find({"clubs": ObjectId("000000")}); #查找属于某个俱乐部的所有用户。 db.club.find({"users": ObjectId("111111")}); # 查找用户所属的所有俱乐部。

    有两个索引:

    db.user.ensureIndex({"clubs": 1});

    db.club.ensureIndex({"users": 1});

    虽然这可能会降低整体一致性。即当您删除一个俱乐部时,您还需要更新其他受影响的文件。在上述更新过程中,您的文档可能不是最新的。 如果你在副本上没有mongodb,没有从分布式系统访问db,并且你认为这个问题不是什么大问题,那么为了便于查询,就选择这个设计。

    如果您认为上述一致性会破坏交易, 然后在用户集合中仅插入俱乐部参考。 这可能是最常见的设计,并且在 mongodb官网。

    http://docs.mongodb.org/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/

    我建议先优化您的查询,然后再选择在更新/插入中添加复杂性(因为您必须通过在用户和俱乐部中添加参考来更新所有相关文档)。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的建议。如果获取查询成为瓶颈,我将使用第二个选项并更改它。
    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 2012-08-27
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多