我正在尝试使用mongodb / redis进行工作 . 我正在考虑这种情况,例如假设一个博客 .
我计划主要做以下查询:
-
由特定用户列出帖子
-
列出特定用户的评论
-
根据特定类别列出帖子
-
查看单个帖子及其评论
Note: Redis用于存储userid < - >用户名映射 .
这是一个好的/灵活的架构设计吗?未来的计划是增加帖子/评论评级 .
post _id author(db-ref:user._id; index)内容类别(索引)用户_id用户名(唯一索引)passwordhash注释_id post(db-ref:post._id; index)author(db-ref:author . _id;索引)
添加评分/投票
Post _id作者(db-ref:user._id; index)内容类别(索引)投票(编号)用户_id用户名(唯一索引)passwordhash注释_id post(db-ref:post._id; index)author(db- ref:author._id; index)vote(number)CommentVotes _id = author.Id(key)voteed:[comment._id,comment._id,...] PostVotes _id = author.Id(key)voteed:[post . _id,post._id]
你怎么看?或者我只是坚果?
2 回答
我觉得你还在考虑关系 . 我喜欢将文档数据对象视为带有链接(线程?)的俄罗斯娃娃,可以将一个玩偶链接到另一个玩偶 . 在你的情况下:
用户娃娃
用户名
电子邮件
PasswordHash
PostUpvotes(帖子ID列表)
CommentUpvotes(评论ID列表)
帖子娃娃
评论娃娃(评论列表)
评论
用户ID
用户名
TotalVotes(int)
评论ID
TotalVotes(int)
类别ID(列表)(肯定一个帖子可以有多个?)
作者ID
分类娃娃
您可能希望将评论和帖子的投票放入用户对象,然后使用map / reduce每15分钟左右获取一次计数(这是对map / reduce的'规范'使用) . 关于upvotes的重要一点是用户不会做两次,所以将它们保存在User对象中更有意义(没有命中索引以查看用户是否已经在帖子上投票) . 由于每个Post的实际upvotes数量不是很重要,因此可以保留在Post中并定期更新 .
有关解决这些问题的几个示例模式设计,请参阅
http://docs.mongodb.org/manual/use-cases/metadata-and-asset-management/
http://docs.mongodb.org/manual/use-cases/storing-comments/