我已经构建了一个组织应用程序,并且正在重构如何将用户数据存储到后端的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浏览器上的客户端记录同步的用户记录。
我很感激你的建议,
-保罗