我正在尝试通过一个简单的 RSS 阅读器 Web 应用程序来学习 CouchDB。要求是:
- 允许每个用户将 X 个提要导入他的列表
- 用户可以为每个提要添加标签
为每个提要维护数据库中最近 50 篇文章的列表
每当用户订阅的任何提要添加新项目时,用户都应该得到更新。
阅读各种指南后,Principles for Modeling CouchDB Documents这是一个很好的相关问题,这是我想象的结构:
提要
- 姓名
- 最后更新
文章
- FeedId
- 职位
- 正文
用户
- 编号
- 提要:[feed1, feed2]
- 标签:{funny: [article, article2]}//也许是一个带有#userid #articleid #tagname 的新数据库?
然后我会为每个用户创建一个 View ,其中包含按提要提供的文章,并向其中添加标签以在用户界面中显示它。
我走在正确的轨道上吗?你会如何构建它?
最佳答案
正如您可能已经看到的,NoSQL 完全是基于使用场景的妥协。在某些时候,您将不得不编写 View 和查询,并且没有一种设计适合所有人。
在您的场景中,您说过每个 Feed 将只有最新的 50 篇文章,因此这些文章很快就会变得无关紧要(与它们关联的任何数据也是如此)。因此,如果将标签存储在用户模型中,则必须更新用户对象三次:1
当用户标记文章时,2
当用户删除标签时,和 3
当文章变得陈旧并被删除时。 3
是不可避免的。
最好将标签存储在文章中,以便它们与文章一起被删除。
提要
- 姓名
- 最后更新
文章
- FeedId
- 职位
- 正文
- 标签:{ "tag-1": [ "user1", "user2", ... ], "tag2": [ "user3", "user4", ... ] }
用户
- 编号
- 提要:[feed1, feed2]
您可以看到我正在存储按用户分组的标签。你也可以反过来 { "user1": "tag1", "user2": "tag1", "user3": "tag2", "user4": "tag2", ... }
如果您认为这有助于处理(根据您的过滤要求)。
关于database - Couchdb 架构 : Views or documents?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16510583/