我已经构建了一个组织应用程序,并且正在重构如何将用户数据存储到后端的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循环获取键,以循环访问每种数据类型,任务等。此外,使用以下命令也很容易将其转换为可用格式JSON.parse。
-
另一方面,我也可以将type和date键组合在一起,以便在顶层也有更多的序列化数据,例如:
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]
}]
所有这些dateKeys都是字符串,就像顶级键是task_2019-02-22 = [...]等
优点:通过直接替换文档而不是较大文档中的子记录来轻松/快速地进行更新?可以同时进行多个原子操作,而不是像上面一样使用多个到更大的文档。
缺点:不那么容易使用,例如,不容易通过所有记录循环并建立任务日期键索引来获取任务的所有日期键。其他任何组件(应用程序,事件等)都相同。在不翻译结构的情况下,在客户端工作就不那么容易了。
我必须想象这是数据库设计,很多记录与更大/更深记录之间的共同关注点。另外,我知道这取决于用例和数据。在这种情况下,它用于用户记录,该记录将具有多个更新以与Web浏览器上的客户端记录同步。
我感谢任何建议, -保罗