【发布时间】:2013-01-17 20:24:05
【问题描述】:
我正在使用 node.js 和 MongoDB 构建一个 RESTful Web 应用程序。
我有一个人物模型
Person
id: '12345'
name: 'John'
likes: [ {id: '54321', name: 'Mary'} ]
isLikeydBy: []
Person
id: '54321'
name: 'Mary'
likes: []
isLikeydBy: [ {id: '12345', name: 'John'} ]
建模“likes”和“isLikedBy”关系的最佳方法是什么?由于我使用的是 MongoDB,我认为这是一种建模关系的好方法,因为只有一个访问权限到获取有关一个人的所有数据所需的数据库。
如何为这种关系创建 REST api? 如果“John”不再喜欢“Mary”怎么办。服务器只接收到下面的put请求。
Person
id: '12345'
name: 'John'
likes: []
isLikeydBy: []
但是服务器也应该更新“玛丽”,因为现在她不再被“约翰”喜欢了。 (我知道 MongoDB 不直接支持事务,我必须自己实现它们。)
我的想法:
1. 每次更新 Person(“likes”和“isLikedBy”字段)时,从数据库中获取此人,并将他们的“likes”和“isLikedBy”字段与请求进行比较。这种方法有一些开销,而且我不知道它是否符合 RESTful API 的精神。
2. 让客户端发送原始的 'likes' 和 'isLikedBy' 字段以及新更新的字段(或仅发送差异)。这似乎与 RESTful 设计相去甚远,因为客户端现在必须知道哪些数据最后一次成功保存到服务器。
3. 创建一个包含关系信息的单独对象(3 个字段:id、me、whoILike)。但这意味着,每次我想要获取有关某个人的数据时,我都需要 2 个查询,一个针对该人,一个针对关系,然后将数据组合成一个对象。
我该怎么办?
【问题讨论】:
标签: mongodb rest database-design architecture denormalization