我正在为我的网站做一个通知系统。
像facebook
这样的通知系统。或stackoverflow
。
我有 2 问题。
如何在db中存储?我可以在用户文档中存储所有通知吗?或者在文档中(因为我认为monogdb在文档中的大小有限?)或者,智能存储? (在db中使用inc或值(参见:true / false),查询复杂)
如何引入页面?例如,当我点击inbox
stackoverflow
中的链接时,我会重定向到该页面。但是我,我的系统multipage
为例如:我有100个朋友。每页列出30个。因此,当我点击通知时,我无法重定向到该通知,因为无法知道好的页面(用户可以被删除)。
非常感谢! 如果你有其他想法,请告诉我。感谢。
修改
(对不起我的英语,我是法国人)
对于第一个问题,我意识到我必须等待时间来选择我的结构。因为我的通知是......有点复杂,所以提前感觉。
第二,我解决了这个问题。我解释: (我以朋友为例,因为很容易找不到。) 我存储了这样的数据:
{
friends: [
{_id: xxxxx, ts: xxxx},
{_id: xxxxx, ts: xxxx}
]
}
想象一下,我显示所有朋友:每页30个。 问题是:
sort
保持为ts
。我不知道这个页面。 uniq解决方案是采取所有文件。
但是:表现非常糟糕。 所以,我这样存储:
{
friends: {
xxxx: {ts:xxx},
xxxx: {ts:xxx}
}
}
知道我可以使用skip和limit对文档进行排序。 所以,如果我想要一份,我不需要拿走所有文件。
要知道该页面,我只需要<或者>对于ts,我有11个朋友,例如>对于我想要的朋友来说,用50和11对所有朋友(例如:50个朋友)进行统计,我可以猜到这个页面。
这个解决方案好吗?
- 我需要一个计数
- 查询以了解>的数量或者<
我可以把朋友列在哪里的页面,保持the sort ts
你可能不明白我为什么要使用计数。我需要因为他们没有存放在同一个文件中。
2编辑:
此解决方案的问题在于,我需要在query object
之外设置update object
和mongo query
(例如:for friends.xxxxxx: {$exists:true}
ps:对于mongodb,使用ts
代替date
有什么好处?
我正在使用ts
,但我想我会存储date
,而不是ts
。
3编辑
我会像Sammaye
那样。存储在单独的文档中。请查看:http://mongly.com/Multiple-Collections-Versus-Embedded-Documents/#1和http://openmymind.net/2012/1/30/MongoDB-Embedded-Documents-vs-Multiple-Collections/
答案 0 :(得分:3)
@Stennie做了一个非常完整的答案。
但是最近我在PHP上为我的网站做了类似的事情。首先要明白的是你是在做一个通知系统还是一个墙(两者是非常不同的),我似乎不清楚,我不确定你的意思:
如何为页面带来?例如,当我点击链接时 在我的stackoverflow的收件箱中,我重定向到页面。但我,我 有一个多重系统例如:我有100个朋友。那里 每页列出30个。所以,当我点击通知我不能 重定向到因为它不可能知道好的页面(用户 可以删除)。
这不是很好的英语,当我阅读它时非常混乱。如果你可以扩展,我相信人们可以更好地回答。
对于通知系统,我发现大量通知对象也有效。所以我有一个类似的架构:
{
_id: {},
to_user: ObjectId{},
user_id: ObjectId{}, // Originating user
custom_text: "has posted a new comment on your wall post",
read: false,
ts: MongoDate()
}
这就是我必须生成通知的文件。每次用户提交生成通知的操作时,它都会向DB写入一个新行,每次填充to_user
时,每个用户都需要通知。对于提交相同操作的多个用户,我实际上会转换user_id
列表中的OjbectId
字段,因此我可以说:
Sam, Dan and Mike all commented on your wall post
然后我通过ts
查询存储用户在其行中查看的最后ts
,允许我每次都对最新的通知进行基于范围的查询。这非常适合我个人经历中的分片和查询。
希望它有所帮助,
答案 1 :(得分:1)
是否embed or link是MongoDB中数据建模的常见问题。如果您的通知数量无限制,您可能会更好地将这些通知保存在单独的集合中。
目前的16Mb文档限制实际上并不像其他一些考虑因素那样多:
通过在单个文档中包含所有通知可能会遇到的性能问题是,快速增长的文档可能还需要更频繁地重新定位到数据库中(请参阅Padding Factor)。
您可能希望在很短的时间内对文档应用多个更新(例如在通知上设置“读取”标志),这意味着更多争用更新同一文档(请参阅{{ 3}})。
为了实现分页,您可以将Atomic Operations与范围查询或limit()结合使用。范围查询(例如,基于索引notificationDate
)将更有效地使用索引,并且随着集合的增长,性能优于skip()
。