W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
非規(guī)范化數(shù)據(jù)不存儲規(guī)范化的數(shù)據(jù)。換句話說非規(guī)范化意味著相同數(shù)據(jù)的多個拷貝同時存在。
上一章中,我們在帖子中非規(guī)范化評論總數(shù),以避免每次都加載所有的評論。在數(shù)據(jù)建模意義上說這是冗余的,因為我們可以通過計數(shù)每個評論,隨時計算出該總數(shù)(當不考慮運行速度)。
非規(guī)范化通常意味著額外的開發(fā)工作。在例子中,我們每次添加或刪除評論時,還需要同時更新相關的帖子,以確保 commentsCount
字段保持準確。這就是為什么關系型數(shù)據(jù)庫,比如 MySQL,對這種做法不以為然。
但是,規(guī)范化做法也有其缺點:沒有 commentsCount
項,就象開始我們做的那樣,為了計算評論總數(shù),每次我們都需要傳輸_所有_的評論。非規(guī)范化使我們能夠完全避免這種情況。
我們可以創(chuàng)建一個特殊的發(fā)布,送出我們有興趣的的評論數(shù)(通過聚合查詢服務器,我們目前能看到帖子的評論數(shù))。
如果這樣發(fā)布代碼的復雜性不超過由非規(guī)范化造成的難度,它是值得考慮的...
當然,這樣的考慮是和應用相關的:如果你寫的代碼,數(shù)據(jù)完整性是非常重要的,那么避免數(shù)據(jù)的不一致,就比性能提升,更為重要和更有較高優(yōu)先級。
如果您是有 Mongo 的經(jīng)驗,你可能會感到驚奇,我們給評論單獨創(chuàng)建了第二個集合:為什么不直接在帖子文檔中嵌入評論?
事實證明當進行集合操作時,Mongo 提供的許多工具會給我們帶來更好的結(jié)果。例如:
{{#each}}
helper 遍歷游標(collection.find()
的結(jié)果)是非常有效的。但是當它遍歷一個較大文件中的對象數(shù)組時,效率就不高。allow
和 deny
在 document 文檔級別上操作,因此可以很容易地確保每個評論修改的正確性,但是在帖子級別就會變得更復雜。comment
是 post
的一個屬性,每當在帖子上創(chuàng)建一個新評論時,服務器就會將該帖子的整個更新的評論列表發(fā)送到每個連接的客戶端。Mongo 推薦嵌入文檔以減少昂貴的查詢次數(shù)。然而,考慮到 Meteor 的架構(gòu),就不成問題了:大多數(shù)時候我們在客戶端查詢評論,其數(shù)據(jù)庫訪問基本上是沒有的。
也有很好的理由使你不要非規(guī)范化數(shù)據(jù)。為了更好地理解反對非規(guī)范化的情況,我們推薦閱讀 Sarah Mei 寫的為什么你不應該使用 MongoDB。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: