如何为 REST API 构建 Mongo 数据库 [关闭]

Posted

技术标签:

【中文标题】如何为 REST API 构建 Mongo 数据库 [关闭]【英文标题】:How to Structure Mongo Database for REST API [closed] 【发布时间】:2013-03-12 20:21:35 【问题描述】:

我正在使用 Mongo 编写一个 REST API,并且对整个文档建模策略很感兴趣。这似乎是一个非常分裂的问题,人们说先去规范化,然后再规范化,反之亦然。

我有兴趣了解 REST api 的资源结构如何影响基于文档的数据库的结构。似乎使用 REST api 资源结构,为所有内容(即位置、租户、事务)设置单独的集合几乎是有意义的,尽管这似乎会违背 Mongo 的好处之一。

我的问题是如何在 NoSQL(特别是 Mongo)文档数据库中对 REST api 的资源进行建模。

【问题讨论】:

【参考方案1】:

答案是,有很多方法,具体取决于您要优化的内容。 通常,您的文档架构的定义和集合的分离将取决于您对文档的特定用例 - 您将如何使用您的数据?

要记住的一个重要概念是,集合之间的“连接”成本很高 - 基本上,您从一个集合中获取外键并在另一个集合中进行完全其他的查找,这就是为什么反规范化通常有助于提高性能 -如果它符合您的用例。这就是 MongoDB 可能大放异彩的地方,尽管将来如果您的需求发生变化,您的文档结构可能需要发生巨大变化。

第二个关键考虑因素是 MongoDB 文档大小限制 - 我上次检查时大约为 16MB。 以您的经典博客网站为例,其中包含博客文章集合。我们可以选择将 cmets 存储为子文档,作为 post 文档中的数组。这样,您可以拥有一个用于 /posts/postID 的 REST API,将帖子文档返回给您,而无需在其他集合中为 cmets 执行任何“连接”或查找等等。但是你会遇到问题,如果你的帖子上有大量的 cmets,那么在这种情况下,你必须通过将 cmets 分离到另一个集合中来标准化你的数据。

因此,从数据库中检索的速度/易用性以及文档存储的灵活性 - 如果您需要更改文档的架构结构以备不时之需,是您在规划项目 API 时应该考虑的两个主要考虑因素。

问问自己,文档/集合 X 将如何使用?您什么时候需要从中检索数据?如果一个资源 tenants 有一个“父资源”location,并且访问位置是您真正需要租户的唯一时间,那么无论如何您都可以设计租户的存储进入位置图式。但是,如果您需要能够自己查询租户,那么您可能希望将租户分成他们自己的集合。因此,没有对错之分,只需根据您计划如何使用数据来制定计划!

祝你好运!

【讨论】:

非常感谢您的详细回复。它证实了我的想法。最初我打算有一个结构,例如 Locations -> Tenants -> Transactions,但是一旦我明白我们需要对这些资源中的每一个进行 CRUDing,并且永远不需要一起抓取两个资源(即 Locations 不会需要与租户一起检索)我正在考虑将它们分成单独的集合。我的一个担忧是,如果我将资源分成集合,我将无法利用 Mongo 在消除连接和存储父 ref id 方面的优势之一。 这听起来是个不错的计划。如果您在集合之间有对文档的引用,那没关系。如果您打算使用 MongoDB,则不必充分利用它的所有优势,而只是在编写查询等时让自己的生活变得更加艰难。请记住,MongoDB 还具有聚合管道和更高级的功能,可以支持查询子文档,这只是更多的工作! 太棒了。一件奇怪的事情是,如果我在集合之间有对文档的引用,并且被引用的文档被删除,我必须记住删除该引用(可能还有包含该引用的子文档)。 是的,这完全取决于您(在编程方面),以确保在修改或删除另一个文档时更新或删除相应的文档。 MongoDB 中没有强制引用。

以上是关于如何为 REST API 构建 Mongo 数据库 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何为 WCF REST API 生成提到的 json 格式

如何为 LOB 应用程序中的多个视图设计 REST API

如何为 django-rest-framework api 编写单元测试?

如何为 Node JS 设置 REST API

如何为我的移动应用程序的 REST API 调用授予 Angular 授权

如何为非 CRUD“命令”设计 REST API,例如激活和停用资源?