我的问题:我如何拥有一个RESTful mongodb实例,该实例使用mongoosejs而不会产生一百万个http请求?
我的设置:我正在使用NodeJS作为后端MongooseJS。我在前端使用AngularJS,因此我决定使用angular-bridge来解析我的MongoDB数据库。
我的架构:我有以下架构:
注意:箭头的开头表示该对象在箭头末尾有对象的引用(例如,comment
具有owningPost
属性是ObjectID
对帖子的引用)。此外,星号(*)表示“很多”,因此,帖子可以有很多注释,但注释只引用一个帖子,一个流可以引用许多桶,一个桶可以有许多引用它的流。
问题:假设用户点击代表存储桶的页面。我需要提出以下获取请求:
请求数量可能会迅速爆炸。也许我可以在帖子中包含评论,这可能不是问题。但是,我不能为其他一切做到这一点(并保持理智)。
我尝试创建一个端点,它可以获取不同属性中的所有数据,如:
data: {
bucket: {},
user: {},
posts: [
{
post: {},
comments: [
user: {},
comment: {}
]
}
]
}
然而它不再宁静......对吗?它使更新内容有点困难。
我做错了什么?有什么更好的方法呢?
答案 0 :(得分:2)
我通常做的是:
就我而言,这不会使您的服务减少RESTful。它仍然是面向资源的,附加数据实际上属于该特定资源。这应该会减少您需要提出的请求数量。
或者,您可以创建一个容器资源,收集所有必需的信息并将其发送回客户端。不过,我个人会提出几个不同的请求。特别是因为,由于HTTP 1.1,可以通过相同的连接执行多个请求。我不认为同时请求多个JSON对象会对应用程序的性能产生任何重大影响。
我不会将所有内容嵌套在“数据”架构中。
希望它有所帮助,祝你好运!
答案 1 :(得分:1)
对我来说,更像是面向文档的数据设计问题,而不是REST设计问题。我的方法是通过视图或页面来驱动数据模型的设计,而不是先设计模型然后尝试使视图适合它。这与Reda的答案在某种程度上是一致的。
为了减少请求或猫鼬群体的数量,我总是允许文档中的重复。在您的示例中,存储桶将包含一个post id和一系列stream id。同时,一个帖子将有一系列桶的ID,甚至每个桶的一些详细信息。这样的设计将非常快速地检索文档,但是减慢了更新操作,并且还引入了不一致的风险。
答案 2 :(得分:0)
你应该对你的架构进行非规范化