主要目的是发布任务,显示为“待办事项”或“完成”,如何更好地构建以下对象的NoSQL DB:
用户可以发布无限数量的任务,并且可以在用户之间共享任务。如何最好地捕捉这种关系?
任务可以手动“标记完成”,或“自动标记”和“自动移动到完成”,因为日期时间到期了。
编辑&删除也将被记录。
作为起点,以下架构的优点和/或缺点是什么(可扩展性是主要关注点):
{
"created_at":"Day Mon ## 00:00:00 +0000 20##",
"id":#####,
"id_str":"#####",
"title":"This is a title",
"description":"The description goes here..",
"date_due":"Day Mon ## 00:00:00 +0000 20##",
"user":{
"id":####,
"id_str":"####",
"name":"Full Name",
"user_name":"Username",
"location":"",
"contacts_count":101,
"created_at":"Day Mon ## 00:00:00 +0000 20##",
"utc_offset":####,
"time_zone":"Country",
"geo_enabled":true,
"verified":false,
"task_count":101,
"lang":"en",
},
"geo":?,
"coordinates":?,
"place":?,
"shared_with":?,
"moved_done":false,
"marked_done":false,
"edited":false,
"deleted":false,
}
答案 0 :(得分:2)
编辑&删除也将被记录。
您是否只需要知道 任务是否被更改,而不是如何或由谁改变?
否则,这可能需要版本控制,即对于每个Task
,可能会有一些TaskVersions
。或者,您只能存储修改 - 这取决于您的需求。特别是,由于锁定,拥有许多作者并不容易 - 如果两个人试图同时改变同一个对象会怎么样?您可能想要考虑乐观与悲观锁定或mvcc。请注意,必须仔细设计“任务可以在用户之间共享”的要求。
作为起点,以下架构的优点和/或缺点是什么(可扩展性是主要关注点):
我猜user
是指登录的用户。我不会对该信息进行反规范化。假设用户创建了一千个任务并添加了一个新联系人。现在必须更新1000个文档的contacts_count
,否则就会出错。仅归一化真正需要的东西,例如user_name
。
根据您显示的列表类型,您还可以选择仅存储用户ID,并在需要显示用户名时实际获取用户对象。虽然不支持复杂的连接,但是对50个或100个ID进行$in
查询(就像你必须在任务列表中查询一样)非常快。