我正在重新设计组织应用程序的数据结构问题是试图提出最佳结构,并归结为建立索引和保持结构灵活。它基于JSON结构,从对象映射或对象数组问题开始。 [{}]与{{}}。应该使用关键字为每个顶级对象建立索引,还是应该将关键字放置在对象内部,并分别生成索引。)
该应用程序包含用户任务,约会,事件和注释。我在客户端上使用了Localstorage,在服务器上使用了mongoDB。对于客户端,我将改用IndexedDB,并将借此机会重新设计本地JSON数据结构。
使用Google日历api时,我注意到许多结果只是日历事件的随机列表。该列表是具有相关事件信息的对象数组。当然,这些是REST请求的结果,而不是实际的数据存储结构本身,但是让我开始思考...以前,我的数据是所有键:值对,有时是嵌套的,但始终以键开头。 {{}}
例如,使用以一个时代号(或者可以是isoDateTime字符串)表示的startTime键: {{}}
"events": {
(EPOCH NUMBER): {
creationDate: (EPOCH NUMBER),
UID: (STRING),
summary: (STRING),
endDateTime: (EPOCH NUMBER)
}
...
}
vs [{}]
"events": [{
startDateTime: (EPOCH NUMBER)
creationDate: (EPOCH NUMBER),
UID: (STRING),
summary: (STRING),
endDateTime: (EPOCH NUMBER)
}
...
]
首先,我可以轻松获取事件的日期范围,测试是否存在某天的事件,获取所有密钥等。我可以使用我的唯一密钥直接保存到localstorage或mongodb。我也有一个密钥生成器,可以增加isoDateTime密钥(在它们可能重叠的情况下,javascript epoch使用毫秒,因此每秒有1000次差异,因此我不关心重叠的密钥)。问题:如果更改事件开始时间,则需要更改密钥或使用正确的密钥生成新对象。总体上看似有效,但方法比较脆弱。
在第二个应用程序初始化中,我可以运行一个索引函数,该函数按startDateTime进行排序,每个索引都指向关联的对象。要保存到存储,由于我没有明显的键/值对,因此会更加有趣。我可以将数组保存在关键的“事件”下,但是我不确定更新如何工作,除非我还要在所有数组位置上保留索引。这样可以更加灵活,因为我可以轻松更改startTime字段,并且可以有多个索引,也可以轻松更改。
有两个问题:首先,在两个选项{{}}和[{}]之间,这是用于保存需要索引的嵌套数据的更推荐方法。其次,我将所有dateTime数据保存为UTC(渲染到本地时区时在客户端上更改),我应该使用isoDateTime字符串还是仅使用Epoch数字?
任何建议或反馈都非常感谢,我几天来一直在研究不同的场景和算法。我真的很想正确。
谢谢, 保罗
答案 0 :(得分:0)
我的第一个直觉是基本上创建事件的对象存储。为每个事件提供一个自动递增的ID。对于每个事件,请确保您存储了一些基本属性,例如开始日期,结束日期等。然后,对于希望运行的特定查询并希望它们快速完成,请在所涉及的属性上创建索引。>
在商店上迭代时,事件将根据id进行排序,但是在索引上进行迭代时,事件将按日期或其他排序。
如果要导出为json,则将导出包含事件对象数组的对象。
对于nosql,每个事件具有相同的属性并不重要。仅对象类型本身以及最少的属性集(如键路径)都很重要。其余属性是完全可变的,应将其理解为只是“杂物包”。道具。
如果这没有帮助,那么我想我误解了这个问题。