mongoose中skema设计问题
发布于 8 年前 作者 bigtotorouk 3631 次浏览 来自 问答

一些社交app的设计中, 比如我的uer设计是这样的 var UserSchema = new Schema({ name: { type: String}, pass: { type: String }, nicker: { type: String}, //… posts : [{ type: Schema.Types.ObjectId, ref: ‘Post’ }], posts_num : { type: Number, default: 0 }, follow : [{ type: Schema.Types.ObjectId, ref: ‘User’ }], follow_num: { type: Number, default: 0 }, followed : [{ type: Schema.Types.ObjectId, ref: ‘User’ }], followed_num: { type: Number, default: 0 }, },{ timestamps: true }); 这个双关联关设计, 当写关注一个人接口的时候,涉及到两个user的save操作,我发现变成事务操作了,但是mongodb不支持事物的。 请问,这样的应用场景怎么办? 我的app设计界面要求有(我的发布文章个数,我的关注用户列表,我的被关注列表)。 如果这种设计不行,那边替代的设计如何做。

5 回复
  • 单个collection是支持事务的
  • 多个collection也支持事务,但非常麻烦,自己看两阶段提交

另外wiretiger引擎有更好的实现

哦 我现在去掉了follered字段 保留了follow而已 其实也能满足

可以参考cnode社区源码吧

@weizainiunai 这个知识点我在cnnode的源码里没找到。请问你找到了吗

@bigtotorouk 统一放在一个collection里,key可以是关注的人和被关注的人的id,而且也比较灵活,所有关注的类型都可以放在一个Collection里面,比如关注人和关注话题 /** * type * focus_user * focus_topic */

  • type: { type: String },
  • user_id: { type: Schema.ObjectId, ref: ‘User’ },
  • focus_user: { type: Schema.ObjectId, ref:‘User’},
  • focus_topic: { type: Schema.ObjectId, ref:‘Topic’ },

查询的时候直接复合查询就好,我一般是这么做的,不知道合不合理-。-

回到顶部