2

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

  • 创建的日期时间不为空
  • 任务 ID不为空
  • 任务 ID 作为 Str Not Null
  • 任务标题不为空
  • 任务描述
  • 到期时间和/或日期
  • 用户不为空
    • ID不为空
    • ID 作为 Str Not Null
    • 名称不为空
    • 用户名不为空
    • 地点
    • 联系人计数
    • 创建日期不为空
    • UTC 偏移量不为空
    • 时区不为空
    • 地理启用不为空
    • 已验证
    • 任务计数不为空
    • 语言不为空
  • 地理位置
    • 坐标
    • 地方
  • 与谁共享
    • ?
  • 任务状态
    • 标记完成
    • 自动移动到完成(因为 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,
}
4

1 回答 1

2

编辑和删除也将被记录。

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

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

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

我想user那是指登录的用户。我不会对这些信息进行非规范化。假设用户创建了一千个任务并添加了一个新联系人。现在contacts_count必须更新 1000 个文档,否则会出错。仅对真正需要的部分进行非规范化,例如user_name.

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

于 2013-10-07T08:42:12.253 回答