Javascript 在node.js中插入其他用户模式的用户模式

Javascript 在node.js中插入其他用户模式的用户模式,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在制作一个应用程序,其中一个用户可以戳其他用户。下面是我考虑过的模式设计的代码。第一种是仅使用用户模式: const userSchema = new Schema({ name: { type : String}, pokes: [{ type : Schema.Types.ObjectId, ref: 'Users' ,default:null}], }); 另一种方法是使用pokes模式。这里我将id对象存储在users模式中的pokes模式中 const pokesSch

我正在制作一个应用程序,其中一个用户可以戳其他用户。下面是我考虑过的模式设计的代码。第一种是仅使用
用户
模式:

const userSchema = new Schema({ 
  name: { type : String},
  pokes: [{ type : Schema.Types.ObjectId, ref: 'Users' ,default:null}],
});
另一种方法是使用
pokes
模式。这里我将
id
对象存储在
users
模式中的
pokes
模式中

const pokesSchema = new Schema({ 
  from_user_id: { type : Schema.Types.ObjectId, ref: 'Users' ,default:null},
  to_user_id: { type : Schema.Types.ObjectId, ref: 'Users' ,default:null},
});

const userSchema = new Schema({ 
  name: { type : String},
  pokes: [{ type : Schema.Types.ObjectId, ref: 'Pokes' ,default:null}],
});

在第三种方式中,我完全消除了两种模式之间的关系:

const pokesSchema = new Schema({ 
  from_user_id: { type : Schema.Types.ObjectId, ref: 'Users' ,default:null},
  to_user_id: { type : Schema.Types.ObjectId, ref: 'Users' ,default:null},
});

const userSchema = new Schema({ 
  name: { type : String},
});
在第二和第三种方法中,我可以轻松查询poke。
我想知道这三种设计中哪一种是最好的,为什么。另外,如果
userA
userB
,则
userB
也可以戳回
userA
。我目前正在学习
node.js
,对
mongoDb
中的设计感到困惑,好吧,下面是我能做的最好的事情。你在我上面的评论中简要地回答了我的问题,但我想指出,思考你正在做什么(或期望做什么)以及做多少是很重要的。除此之外,让我们来看看每个模式。
const userSchema = new Schema({ 
    name: { type : String},
    pokes: [{ type : Schema.Types.ObjectId, ref: 'Users' ,default:null}],
});
当我们看第一个时,它似乎不足以满足您的需求。这是一个用户的集合,他们有自己的名字和一系列的戳。如果我们需要知道用户戳了谁,那么这是一个非常简单和快速的查询-它就在他们的名字下面,按
名称
\u id
搜索,我们就完成了!但是,当你想查找谁捅了这个用户的时候会发生什么呢您需要查询每个用户,然后在每个pokes数组中搜索原始用户。如果我们有m个用户,每个用户都有n个戳,那就是做m*n测试。哎呀。如果m和n变大,那将是很大的差别(想想100*100和10000*10000甚至更多的差别!)。即使您个人没有在节点中编写搜索代码,mongo也在进行搜索。因此,除非你确定查找谁捅过用户的情况非常罕见,否则这可能不是一个好的选择。继续:

const pokesSchema = new Schema({ 
    from_user_id: { type : Schema.Types.ObjectId, ref: 'Users' ,default:null},
    to_user_id: { type : Schema.Types.ObjectId, ref: 'Users' ,default:null},
});

const userSchema = new Schema({ 
    name: { type : String},
    pokes: [{ type : Schema.Types.ObjectId, ref: 'Pokes' ,default:null}],
});
现在我们有了一个pokes模式,很好!如果我们想进行上面讨论过的搜索,我们可以直接根据
to_user_id
查询poke,然后如果我们需要发起poke的所有用户的名称,我们可以根据其
\u id
查询用户。不错!我们仍然有快速的方法来得到相反的结果,也就是用户发起的poke搜索,因为在我们的用户模式中仍然有
poke
。但是,当戳到的时候会发生什么我们必须更新这两个模式。因此,我们不仅要(相对容易)插入poke,还必须更新执行poke的用户的poke数组。这可能没那么糟糕,但是如果一次更新失败会发生什么呢?现在我们的数据是不一致的-用户和戳不匹配。我们还将每天更新一倍。这可能没什么大不了的,如果我们得到的用户戳比我们戳的要多得多,那么这可能是一个不错的折衷方案,但它变得有点风险,因为我们已经引入了一些我们可能不一致的地方。好的,最后一个:

const pokesSchema = new Schema({ 
    from_user_id: { type : Schema.Types.ObjectId, ref: 'Users' ,default:null},
    to_user_id: { type : Schema.Types.ObjectId, ref: 'Users' ,default:null},
});

const userSchema = new Schema({ 
  name: { type : String},
});
首先,请注意,这些模式仍然是相关的——pokes模式引用用户。它只是不像上一个那样有双重关联。无论如何,现在我们已经从用户模式中删除了pokes数组。好啊我们不再冒数据不一致的风险了,noice!我们也不是每次戳两次更新,托伊特!现在,当我们想要得到一个用户戳过的用户列表时,我们需要做一个类似于上面的查询,当我们想要得到一个用户戳过的用户列表时。这并不是很糟糕,但肯定没有pokes阵列坐在那里等待那么快

在我看来,除非你在搜索哪些用户被戳过(而且没有被戳过),否则第三种情况是最好的。模式具有逻辑意义,您不会更新两次。这就是我要用的。但是正如我所说,考虑你的特殊需要和设计是非常重要的。
希望有帮助

最佳设计取决于您将如何处理数据。你会主要添加戳吗?你大部分时间都在看《刺客》吗?你有兴趣得到所有戳的列表吗?等等,然后-多久一次?彼此相对的频率是多少?数据设计与node.js无关,但它本身是一项有用的技能:)三个函数将被调用更多…添加戳…读取戳…获取戳