【发布时间】:2015-12-15 14:12:41
【问题描述】:
我正在尝试通过编写应用程序来自学 mongo,并且我正在努力寻找设计 mongo 'schema' 的最佳方法(我知道它是无模式的,但这可能是我理解的核心问题我来自关系背景)
无论如何,该应用程序是一个礼物列表管理器,用户可以在其中创建一个礼物列表,并将他们想要收到的礼物添加到他们的列表中。其他用户可以订阅该列表,并且可以将礼物列表中的礼物标记为已领取/已购买。 (以免圣诞节收到重复礼物的问题!)
目前,我的 GiftLists 集合不是“关系型”,它只是 GiftList 文档的集合,其中包含 Gifts 的子文档,如下所示:
{
"GiftLists": [
{
"_id": {
"$oid": "55e9924848c4ffd723890b48"
},
"description": "Xmas List for Some User",
"gifts": [{
"description": "Mongo book"
"claimed": false
},
{
"description": "New socks"
"claimed": false
},
{
"description": "New socks"
"claimed": false
}],
"owner": "some.user",
"subscribers": ["some.other.user", "my.friend"]
}
]
}
这个想法是some.user 是礼物列表的所有者,并添加了 3 件他想收到的物品。 some.other.user 已订阅列表,可以看到礼物列表和礼物。他可能会选择购买其中一件礼物,因此需要将其标记为已声明,以免my.friend 也购买。
目前,gifts 数组中的每个 Gift 都是一个没有自己 id 的子文档,我认为这是我的理解/思考陷入困境的地方。
我正在尝试为应用程序功能提供 RESTful 界面。
- 到
POST一个新的礼物列表,网址是/giftList/add,其中请求正文是新的礼物列表 - 到
GET包括儿童礼物在内的个人礼物列表的网址是/giftList/<listId>- 例如:/giftList/55e9924848c4ffd723890b48
考虑到上述情况,我的下一步自然是能够将礼物标记为已认领,也许是:
-
PUT到网址/gift/claim/<giftId>
但我在 Gift 子文档中没有任何 ID
所以也许我的网址应该是:
-
/giftList/<listId>/claim/<giftId>
但同样,我在 Gift 子文档中没有 id
或者我尝试使用项目的描述
-
/gift/claim/<gift description>例如:/gift/claim/Mongo+book
但是,如果不止一个人有一份包含“Mongo book”的礼物清单,并且对描述字符进行编码的 URL 可能会很混乱
或者我可以参考礼物清单
-
/giftList/<listId>/claim/<gift description>例如:/giftList/55e9924848c4ffd723890b48/claim/New+socks
但我声称是哪个“新袜子”实例? (毕竟,圣诞节每个人都需要很多新袜子!)
或者也许我参考了礼物的索引
-
/giftList/<listId>/claim/<gift index>例如:/giftList/55e9924848c4ffd723890b48/claim/2
但这感觉很脆弱(因为这意味着列表必须始终以相同的顺序呈现)
对我来说,真正的感觉是我需要另一个集合,只是为了礼物,每个礼物文档都有自己的 id,然后我可以在我的 RESTful url 中引用它。并且 Gift 具有对其父 GiftList 的引用,或者 GiftList 具有对 Gifts 的引用数组
但这都是一种非常“关系”的思维方式……不是吗?
这样做的最佳方法是什么?或者,如果没有“最佳”方式,我的选择是什么?
【问题讨论】:
标签: mongodb rest database-schema nosql