2013-12-11 246 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中的狀態。