对于MongoDB的To-Do List模式设计,建议使用什么?

时间:2013-10-07 03:36:16

标签: mongodb database-design schema database nosql

主要目的是发布任务,显示为“待办事项”或“完成”,如何更好地构建以下对象的NoSQL DB:

  • 创建的日期时间不为空
  • 任务ID 不为空
  • 任务ID为Str 非空
  • 任务标题不是
  • 任务说明
  • 时间& /或到期日
  • 用户不是
    • ID 不是
    • ID为str 非空
    • 姓名不是
    • 用户名不是
    • 位置
    • 通讯录计数
    • 创建日期不为空
    • UTC偏移不为空
    • 时区不为空
    • 启用地理位置不为空
    • 验证
    • 任务计数不为空
    • 语言不是
  • 地理位置
    • 坐标
    • 放置
  • 与谁分享
  • 任务状态
    • Marked Done
    • 自动移动到完成(因为传递了datetime-due)
    • 标签(真/假)
    • 被修改
    • 编辑计数
    • 编辑日期时间
    • 删除

用户可以发布无限数量的任务,并且可以在用户之间共享任务。如何最好地捕捉这种关系?

任务可以手动“标记完成”,或“自动标记”和“自动移动到完成”,因为日期时间到期了。

编辑&删除也将被记录。

作为起点,以下架构的优点和/或缺点是什么(可扩展性是主要关注点):

{
   "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,
}

1 个答案:

答案 0 :(得分:2)

  

编辑&删除也将被记录。

您是否只需要知道 任务是否被更改,而不是如何或由谁改变?

否则,这可能需要版本控制,即对于每个Task,可能会有一些TaskVersions。或者,您只能存储修改 - 这取决于您的需求。特别是,由于锁定,拥有许多作者并不容易 - 如果两个人试图同时改变同一个对象会怎么样?您可能想要考虑乐观与悲观锁定或mvcc。请注意,必须仔细设计“任务可以在用户之间共享”的要求。

  

作为起点,以下架构的优点和/或缺点是什么(可扩展性是主要关注点):

我猜user是指登录的用户。我不会对该信息进行反规范化。假设用户创建了一千个任务并添加了一个新联系人。现在必须更新1000个文档的contacts_count,否则就会出错。仅归一化真正需要的东西,例如user_name

根据您显示的列表类型,您还可以选择仅存储用户ID,并在需要显示用户名时实际获取用户对象。虽然不支持复杂的连接,但是对50个或100个ID进行$in查询(就像你必须在任务列表中查询一样)非常快。