【问题标题】:Modeling a user-to-item database in MongoDB在 MongoDB 中建模用户到项目的数据库
【发布时间】:2011-11-13 10:02:55
【问题描述】:

我有两张桌子。

电影,其中列出了数据库中的所有电影。
用户,拥有用户。

通常,我会创建一个连接表来将用户连接到电影(例如,用户喜欢某部电影)。

但是,既然你不能在 MongoDB 中做到这一点,我该怎么办?我希望能够找到某个用户喜欢的所有电影,以及喜欢某部电影的所有用户,以及一组给定用户喜欢的电影。

嵌入式文档?

谢谢!

【问题讨论】:

    标签: mongodb database-design mongoose database


    【解决方案1】:

    对于像这样的电影和用户之间的多对多关系,我可能会为每个用户设置单独的集合,但是通过嵌入他们的 _id 和 @987654323 将喜欢电影的用户非规范化到 movies 集合中@ 字段到 likes 数组中。

    这样,您可以检索喜欢电影的用户的姓名,而无需单独查找 users 集合,但仍有额外的用户字段不会嵌入到电影中。

    权衡的是,如果用户更改了他们的名字,您需要同时更新这两个集合,但我认为这是值得的。

    db.movi​​es

    {
        _id: <objectid>,
        name:"Star Wars",
        likes: [ 
            { userid: <user-objectid>, name: "John Smith" },
            { userid: <user-objectid>, name: "Alice Brown" }
        ]
    }
    

    db.users

    {
        _id: <objectid>,
        name: "John Smith",
        username: "jsmith",
        passwordhash: "d131dd02c5e6eec4693d"
    }
    

    某个用户喜欢的电影

    db.movies.find( { "likes.userid": <user-objectid> }, { "name": 1 } );
    

    喜欢某部电影的用户

    db.movies.find( { "_id": <movie-objectid> }, 
        { "likes.userid": 1, "likes.name": 1 } );
    

    特定用户喜欢的电影

    db.movies.find( { "likes.userid": 
        { $in: [ <user1-objectid>, <user2-objectid> ] } },
        { "name": 1 } );
    

    【讨论】:

      【解决方案2】:

      可以在 MongoDB 中做到这一点,只是不能在数据库级别进行“加入”操作,而必须在应用程序级别进行。

      如果您有数百万部电影和数百万用户,您必须使用连接集合来完成,因为您无法将一部电影或一个用户的喜欢数量放入任一文档中.

      1. 查找用户并获取他们的_id
      2. 查找具有匹配 _id 值的 UserMovie 文档
      3. 根据需要查找电影

      您可能在此处进行的非规范化是将电影名称存储在 UserMovie 集合中,这样您就可以显示用户喜欢的电影,而无需从 Movie 集合中获取每一部。

      可能的优化
      您可以在此方案上尝试的一项优化是在包含多个关系的 UserMovie 集合中创建文档,而不是为每个关系使用单个文档(就像在 SQL 中那样)。

      例如,如果最常见的访问模式是查找用户喜欢的电影,您可以按用户对它们进行分组,并将它们放入由该用户 ID 索引的一个或多个文档中。请查看 this blog post 中的 StatementGroups 以获得更完整的说明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 2011-11-15
        • 1970-01-01
        • 2020-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多