使用 mean.js 和 mongoose 进行数据库建模

Database modeling with mean.js and mongoose

我是传统开发人员,通常从我的 Web 应用程序开发关系数据库。

我想学习新方法并使用 mean.js 和 mongoDB 构建应用程序。我使用 meanjs.org 中的 yo 生成器开始。

当我对数据建模时,我总是会退回到经典的关系建模。而且我认为这不是应用程序构建的“新方式”的全部内容。

所以我的问题是:对我的数据模型样本建模的最佳实践是什么? 我的学习示例是一个应用程序,其中您有特定的给定音乐专辑列表(例如有史以来最好的 50 张爵士乐专辑)并且用户签入并对音乐进行评分。 我有一个 CRUD 模块,用于添加和编辑用户应该收听的专辑。这以有序的相册列表结束。

我有一个供用户使用的 CRUD 模块,由 yo 生成器生成。 用户现在可以看到列表并标记他已经听过的专辑。他应该能够给出评分和评论。

那么问题来了:用户的listenTo信息存储在哪里?在关系世界中,我将引入一个新的外键 table,它具有从用户到相册的关系,并在外键 table 中对评级和评论等属性进行建模。我认为这不是 mongo 数据库世界中的工作方式,是吗?

我可以将用户收听信息添加到每个专辑。我会有一个用户列表和每张专辑的评论。然后,我需要确保如果请求列表,则只显示当前用户的信息。所以我必须在子文档上过滤 属性 。感觉很奇怪。 或者,我可以为每个新创建的用户复制相册列表,但是我需要编写代码来在编辑原始列表时更改用户的对象。

你会推荐什么?

当我想到数据建模时,我将其分解为以下关系:

1 <--> 1

1 <--> Few/Many(一个有限的数字,比如用户的 phone 号码列表)

1 <--> 很多

MongoDB 的一般经验法则是您应该尽可能嵌入。所以对于 1 <--> 1 和 1 <--> Few/Many 如果文档大小很小,你应该将集合嵌入到用户文档中。

考虑这里的用例很重要。如果我们想要跟踪用户喜欢或收听的所有歌曲,这可能是数百或数千首,因此我们可能希望将此信息存储在一个单独的集合中,并在其中包含对用户的索引引用。

在跟踪用户是否收听歌曲的情况下,我可能会在您的用例中像这样构建它:

{
    _id: ObjectID, // The identifier of the document
    user_id: ObjectID, // The user who listened to the song
    song_id: ObjectID, // The id of the song
    count: number, // The number of times the user listened
    rating: number, // The number of stars the user rated the song
    favorite: boolean, // If the user marked the song as a favorite
    last_listened: Date // The last time the user listened
}

索引为 { user_id: 1, song_id: 1 }。

这里是关于如何解决您的问题的非常好的参考: https://docs.mongodb.com/manual/applications/data-models-relationships/