
应用程序设计
|
181
或者可以使用另一种方式,将订阅者内嵌到生产者文档中,如下所示:
{
"_id" : ObjectId("51250a7ed86041c7dca81936"),
"username" : "joker",
"email" : "joker@mailinator.com",
"followers" : [
ObjectId("512510e8d86041c7dca81912"),
ObjectId("51250a5cd86041c7dca8190f"),
ObjectId("512510ffd86041c7dca81910")
]
}
每当这个用户发布新信息时,立即就可以知道需要给哪些用户发送通知。这样做的缺点
是,如果要查找一个用户关注的用户列表,则需要查询整个
users
集合
(与前一个例子中
的限制相反)。
这两种方式都有一个额外的缺点:它们会使用户文档更大、更不稳定。
"following"
或
"followers"
字段甚至不需要返回:查询粉丝列表这个操作会有多频繁?因此,最后一个
方案通过对数据进一步范式化并将订阅信息保存在单独的集合中来避免这些缺点。进行这
种程度的范式化可能有些过了,但对于一个经常发生变化并且不需要与文档其他部分一起
返回的字段来说非常有用。对
"followers"
字段进行这种范式化是比较明智的。
在本例中,使用一个集合来保存发布者和订阅者的关系,其文档如下所示:
{
"_id" : ObjectId("51250a7ed86041c7dca81936"), ...