Py学习  »  NoSql

如何组织我的nosql文档模型,序列化与层次结构

paultman • 4 年前 • 461 次点击  

我已经构建了一个组织应用程序,并且正在重构如何将用户数据存储到后端的mongodb数据库中。我通过键值存储(即localstorage)在客户端复制数据。

我的难题是在MongoDB中保存记录,它是应该是一个更为扁平/序列化的结构,包含许多高级文档,还是更深层的完整的层次结构。

例如,在顶层,任务、约会、日记和事件。下面是日期字符串键,即2019-02-22,下面是大量数据。

tasks={}, 
appts={}, 
journal={}, 
events={}

tasks[DateKey]=[{
  descr: (String)
  cDate: (String)
}]

appts[DateKey] = {(time:minutes):{
  descr: “gym”,
  eTime: (number: minutes)
  tZ: (number: minutes)
  rmdrs: [30]
  uID: (string)
}]

journal[DateKey] = [{
  text:(long string),
}]

events[DateKey] = [{
  descr: “6 month Anniversary”,
  duration: (number: days)
  uID: (String)
  rmdrs: [30]
}]

优点:在客户端处理数据时,我可以很容易地使用object.keys或for-of循环获取键,以便在每个数据类型、任务等之间迭代,而且使用json.parse可以很容易地获得可用的格式。

——

另一方面,我还可以将类型键和日期键结合起来,在顶层也可以有更多的序列化数据,例如:

tasks_(DateKey)=[{
  descr: (String)
  cDate: (String)
}]

appts_(DateKey) = {(time:minutes):{
  descr: “gym”,
  eTime: (number: minutes)
  tZ: (number: minutes)
  rmdrs: [30]
  uID: (string)
}]

journal_(DateKey) = [{
  text:(long string),
}]

events_(DateKey) = [{
  descr: “6 month Anniversary”,
  duration: (number: days)
  uID: (String)
  rmdrs: [30]
}]

所有这些日期键都是字符串,就像顶级键是tasks_2019-02-22=[…]等

优点:通过直接替换文档而不是替换较大文档中的子记录,可以轻松/快速地进行更新?对于同时进行多个原子操作很有价值,而对于上面提到的同一个较大的文档,则很有价值。

缺点:不太容易使用,例如,不通过循环查看所有记录并构建任务日期键索引,就不容易获取任务的所有日期键。对于任何其他组件(应用程序、事件等)也是如此。如果不翻译结构,在客户端工作就不那么容易了。

我不得不想象这是数据库设计中的一个共同问题,很多记录与更大/更深的记录相比。另外,我知道这取决于用例和数据。在这种情况下,它是针对将有多个更新与web浏览器上的客户端记录同步的用户记录。

我很感激你的建议, -保罗

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/45531
 
461 次点击