Backbone.js、mongodb 和获取相关对象——客户端还是服务器端?
Posted
技术标签:
【中文标题】Backbone.js、mongodb 和获取相关对象——客户端还是服务器端?【英文标题】:Backbone.js, mongodb and fetching related objects - client side or server side? 【发布时间】:2012-08-17 07:30:20 【问题描述】:我正在使用 mongodb、node.js 和backbone.js 来构建一个可以作为我学习体验的应用程序。我很想知道从 REST API 获取相关对象的最佳实践是什么。
假设我们有“post”对象和“user”对象,posts 具有将它们链接到用户的“userId”属性。
你应该:
-
在客户端获取一个帖子对象。检查帖子的“userId”属性,然后单独获取该用户。就服务器端代码而言,这似乎既好又简单,但如果事情变得更加复杂,最终可能会发出大量请求。
获取一个帖子对象,让服务器“加入”并在同一个请求中为您提供相关的用户对象。
有没有人可以分享一些经验?
谢谢
【问题讨论】:
【参考方案1】:如果没有特定的 UI 故事,很难回答这个问题,但根据您提供的内容,我会说 #1 更接近我将采用的方法。但是,不要“检查”用户 ID 的帖子,而是使用 rel=user
向用户提供链接,然后只需点击该链接获取您的用户资源。我更喜欢 HATEOAS 范例,其中这些资源是通过由服务器而不是客户端构建的显式链接导航的。
这显然会导致更多的 XHR,但如果这是一个问题,那么我建议您的视图需要一个为其提供服务的视图模型 没有 连接。这是通过公开一个专门为客户服务的模型来完成的,而无需让客户负责构建它需要的数据。 hth,
麦克
【讨论】:
谢谢。 HATEOAS 对我来说是新闻,但我可以看到这是一种明智的做事方式。 当然。您可能想查看HAL 以展示标准化您的回复的一种方法。这回答了你的问题吗?【参考方案2】:MongoDB 没有在服务器上“进行连接”的功能,因此相关问题可能更多是数据建模问题,以及您是否更有意义 link or embed 相关用户数据。
Fetch a post object on the client side. Inspect the "userId" property
of the post and then separately fetch that user. This seems to be
nice and simple in terms of server-side code, but could end up making
lots of requests if things get complicated further down the line.
最接近此选项的方法是获取帖子,然后使用 $in
operator 查询帖子中提到的用户 ID 的相关信息。考虑到大量用户 ID,这可能会导致性能下降,因为实际上服务器仍在执行查询以查找索引中的每个用户 ID。
另一个需要考虑的常见方法是混合选项:
在帖子中嵌入一些最少的用户数据,例如用户 ID(database reference 到他们在另一个集合中的用户数据)和一些详细信息,例如他们的用户名。
根据需要在 AJAX 请求中查找其他详细信息(例如,将鼠标悬停在用户名上)。
哪种效果更好实际上取决于您的用例以及您希望在应用程序的页面上显示的信息。
【讨论】:
您可能会发现最近在 Redhat 博客上讨论架构的帖子很有帮助:Designing MongoDB Schemas with Embedded, Non-Embedded and Bucket Structures以上是关于Backbone.js、mongodb 和获取相关对象——客户端还是服务器端?的主要内容,如果未能解决你的问题,请参考以下文章
在 dev 和 prod 环境中设置 Backbone.js 从 Symfony2 获取
Jquery Draggable 和 Backbone.js 从可放置成功回调内部获取对骨干模型的引用
Backbone.js — 匿名视图实例中的集合在获取时多次请求