2013-12-11 53 views
10

我设计了一个JSON representation of a mailbox so that I can look up mails easily,例如mailjson[UID].BodyJSON设计最佳实践

但是看着Angularjs和灰烬后,模板化MVC JS引擎,它似乎JSON应该是以下格式:

[{ 
    "id": 1, 
    "body": "Blah blah blah..." 
}, 
{ 
    "id": 2, 
    "body": "More blah foo blah" 
}, 
{ 
    "id": 3, 
    "body": "Hopefully you understand this example" 
}] 

然后有一些的findAll(ID)函数来获取项目基础在一个人想要的id上,迭代通过JSON。所以现在我想知道我的JSON设计是否有优点?我做错了吗?为什么人们不使用我用JSON使用的词典查找设计?

任何其他技巧,以确保我有一个良好的数据结构设计,我将不胜感激。

+2

这听起来像你基本上要求哈希表vs列表/数组的(dis)优点。这一切都取决于你主要用你的数据做什么。 –

+0

我这样做是为了生成邮件归档https://github.com/kaihendry/imap2json – hendry

+3

这是错误的答案:-)他的意思是取决于你做什么,而不是你如何存储它。你用什么算法来处理数据。如果您知道要访问存储容器中的第n个元素,请转至数组,如果您知道要使用某个字符串键在大容量存储容器中查找一条信息,请执行散列操作。一个是有序(编号)存储,另一个是无序的。如果您要通过ID检索您的电子邮件,并且ID编号中没有(很大的)空白,则阵列效果会更好。 –

回答

6

在JSON中存储大表的最佳做法是使用数组。

原因是,当将JSON数组解析到内存数组中时,没有构建映射的速度惩罚。如果您需要通过多个字段构建内存索引以便快速访问,则可以在加载期间或加载后执行此操作。但是,如果您像存储JSON那样存储JSON,则无需在构建映射的情况下快速加载,因为JSON解析器将始终必须根据您的结构构建该庞大的ID映射。

将数据存储在内存中的结构不必与磁盘上的存储结构相同,因为无法序列化/反序列化内部JavaScript映射结构。如果可能的话,那么你将序列化和存储索引,就像MS SQL Server存储表和索引一样。

但是,如果您使用的框架强制您在内存和磁盘上具有相同的结构,那么我支持您在一个大对象中使用id作为键的选择,因为这样就更容易将ID传递给服务器和从服务器传递JSON请求假设服务器和浏览器都在内存中保留重要的电子邮件列表,则可以对电子邮件项目执行任何操作或更新其在UI中的状态。