如何選擇mongoDB內嵌還是引用

2021-09-25 04:22:20 字數 1003 閱讀 2066

其他參考:

mongodb的正規化化,是將資料分散到不同的集合中,不同的集合之間可以相互引用資料。如果需要修改某一塊資料,只需要修改儲存這塊資料的文件即可,但查詢時,需要在不同集合之間執行連線查詢,需多次查詢實現。 

反正規化化,將每個文件所需的資料都嵌入在文件內部,每個文件都擁有自己的資料副本,而不是所有文件共同引用同乙個資料副本。如果資訊發生了變化,所有相關的文件都要進行更新。但是執行查詢時,只需要一次查詢。 

正規化化可以提高資料寫入速度,反正規化化可以提高資料的讀取速度。 

學生選課的例子(乙個學生選擇多門課程): 

如果建立乙個學生集合,乙個課程集合,乙個關係集合: 

關係表中資料類似這樣結構的:

每個關係,儲存了對應的學生編號,以及課程的編號陣列。實際中,如果想根據某個姓名查詢選擇的課程,需要三次查詢: 

1. 在學生資訊集合中根據學生姓名查詢學生id; 

2. 根據學生id在關係表中查詢對應的課程編號陣列; 

3. 根據課程陣列中的編號查詢對應的課程名。 

如果將課程嵌入到學生文件中,即省去學生表,只保留學生課程關係表,和課程資訊表,如:

這樣,只需要兩次查詢即可,根據姓名查到課程編號,再根據課程編號查出對應的課程名即可。這種方式如果資料不需要隨時訪問,也不需要隨時變化,那麼就非常好。 

如果進一步反正規化化,可以將課程資訊完全內嵌。這樣一次查詢即可,如:

,,]

}

這樣的好處是一次查詢即可得到學生的課程資訊。但是會占用更多的儲存空間,因為每個課程會多次出現在很多學生的選課中。同時,資料更新也困難,如果課程的學分,或者教室更改了,那麼需要更新選了這門課程的所有學生的文件。 

那麼可以混合使用內嵌和引用,將課程中的詳細資訊抽到子文件中,常用資訊仍然保留在內嵌中。

,,]

}

MongoDB 內嵌文件

mongodb是文件型的資料庫系統,doc是mongodb的資料單位,每個doc相當於關係型資料庫的資料行 row doc和row的區別在於field的原子性 row中的column是不和分割的原子物件,而doc中的field可以是原子物件,也可以是內嵌doc embedded doc 陣列等資料型...

MongoDB 內嵌文件

mongodb是文件型的資料庫系統,doc是mongodb的資料單位,每個doc相當於關係型資料庫的資料行 row doc和row的區別在於field的原子性 row中的column是不和分割的原子物件,而doc中的field可以是原子物件,也可以是內嵌doc embedded doc 陣列等資料型...

morphia查詢mongodb內嵌文件

mongodb中儲存的文件格式如下,實現查詢fromdata下did和dvid為指定值的資料 rid 9eec7fbe8a6f4d17b02756fdbcefcc41 rname 測試場景1 username zhaoptest enable 1,fromdata todata 使用db.devic...