代码之家  ›  专栏  ›  技术社区  ›  Rasmus Edvardsen

MongoDB用户/房间关系标准

  •  0
  • Rasmus Edvardsen  · 技术社区  · 7 年前

    所以我有一个业余爱好的卑鄙项目。 现在我正在设置用户和房间,对进一步的进展有点犹豫,因为我不确定db的一般协议是否正确。

    我记得,你不应该有多对多的关系;相反,您应该有一个关系表。

    现在,我的用户模式有一个他所在的房间数组,我的房间模式有一个与之关联的用户数组(第三个也是最后一个模式是消息)。

    有一个UserRoomRelationship文档来保存PK、一个房间的id,然后是这个房间中所有用户的列表,这样更好吗?

    谢谢 拉斯姆斯

    2 回复  |  直到 7 年前
        1
  •  0
  •   Kevin Hoerr    7 年前

    MongoDB不像*SQL数据库那样是关系数据库(因此MongoDB被称为NoSQL),所以在Mongo中使用关系表效率很低。如果您不想重复数据,那么在文件室集合中保存一个用户id数组是最理想的选择。

    Here are some more indepth answers on many-to-many in MongoDB.

        2
  •  0
  •   Ian Mercer    7 年前

    用户如何可以在多个房间中?这不只是用户的一个属性吗?如果你把它编入索引,为什么还要把它存储在房间里呢?

    没有一种正确的方法,这实际上取决于您拥有的每个对象的数量,如果对象的数量很小(正如房间和用户所暗示的那样),您可以使用更简单、更可靠(不能存储不可能的值)的方法,例如在用户上拥有单个属性 RoomId . 这永远不会不一致,如果您需要在给定的房间中查找用户集,那么这是一个廉价的查询。

    在MongoDB中,可以对数据进行非规范化,并在每个对象上存储一个数组,该对象包含其他对象的一部分或全部,但如果需要,也可以创建一个有效的联接集合。

    例如,您可以拥有一个集合{UserId,RoomId,DateTimeEntered,DateTimeLeft},该集合具有适当的索引,允许您在给定的时间快速查找给定房间中的所有用户。一旦你有了一组ID,如果你需要它们来显示,你可以去加载它们,或者你可以把你需要显示的字段添加到这个表{UserId,UserName,…}但是,如果数据发生变化,您就有维护数据的问题,如果您需要知道,当他们进入房间时,您就有保存数据的问题。

    关于StackOverflow,还有很多其他问题与您应该如何存储相关数据有关,我建议您也去阅读这些问题。