mongodb以BSON格式表示文檔結構,它是一個基于分布式文件存儲的開源數據庫系統,它的特點是高性能、易部署、易使用,存儲數據非常方便。
具體內容如下:
文檔是 MongoDB 的核心概念,是數據的基本單元,與關系數據庫中的行十分類似,但是比行要復雜。文檔是一組有序的鍵值對集合。文檔的數據結構與 JSON 基本相同,所有存儲在集合中的數據都是 BSON 格式。
BSON 是一種類 JSON 的二進制存儲格式,是 Binary JSON 的簡稱。 一個簡單的文檔例子如下:
{"country" : "China", "city": "BeiJing"}
MongoDB 中的數據具有靈活的架構,集合不強制要求文檔結構。但數據建模的不同可能會影響程序性能和數據庫容量。文檔之間的關系是數據建模需要考慮的重要因素。文檔與文檔之間 的關系包括嵌入和引用兩種。
下面舉一個關于顧客 patron 和地址 address 之間的例子,來說明在某些情況下,嵌入優于引用。
{_id: "joe",
name: "Joe Bookreader"
}
{
patron_id: "joe",
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: "2345"
}
關系數據庫的數據模型在設計時,將 patron 和 address 分到兩個表中,在查詢時進行關聯, 這就是引用的使用方式。如果在實際查詢中,需要頻繁地通過 _id 獲得 address 信息,那么就需要頻繁地通過關聯引用來返回查詢結果。在這種情況下,一個更合適的數據模型就是嵌入。
將 address 信息嵌入 patron 信息中,這樣通過一次查詢就可獲得完整的 patron 和 address 信息,如下所示:
{_id: "joe",
name: "Joe Bookreader",
address: {
street: "123 Fake Street",
city: "Faketon”,
state: nMAnz
zip: T2345”
}
}
如果具有多個 address,可以將其嵌入 patron 中,通過一次查詢就可獲得完整的 patron 和多個 address 信息,如下所示:
{_id: "joe",
name: "Joe Bookreader",
addresses:[
{
street: "123 Fake Streetn,
city: "Faketon",
state: "MA",
zip: "12345"
},
{
street: "l Some Other Street",
city: "Boston",
state: "MA",
zip: "12345"
}
]
}
但在某種情況下,引用用比嵌入更有優勢。下面舉一個圖書出版商與圖書信息的例子,代碼如下:
{title: "MongoDB: The Definitive Guide",
author: [ "Kristina Chodorow", "Mike Dirolfn"],
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English",
publisher: {
name: "O'Reilly Media",
founded: 1980,
location: "CA"
}
}
{
title: "50 Tips and Tricks for MongoDB Developer",
author: "Kristina Chodorow",
published_date: ISODate("2011-05-06"),
pages: 68,
language: "English",
publisher: {
name: "O'Reilly Media",
founded: 1980,
location: "CA"
}
}
從上邊例子可以看出,嵌入式的關系導致出版商的信息重復發布,這時可采用引用的方式描述集合之間的關系。使用引用時,關系的增長速度決定了引用的存儲位置。如果每個出版商的圖書數量很少且增長有限,那么將圖書信息存儲在出版商文檔中是可行的。
通過 books 存儲每本圖書的 id 信息,就可以查詢到指定圖書出版商的指定圖書信息,但如果圖書出版商的圖書數量很多, 則此數據模型將導致可變的、不斷增長的數組 books,如下所示:
{name: "O'Reilly Media",
founded: 1980,
location: "CA",
books: [123456789, 234567890, …]
}
{
_id: 123456789,
title: "MongoDE: The Definitive Guide",
author: ["Kristina Chodorow", "Mike Dirolf"],
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English"
}
{
_id: 234567890,
title: "50 Tips and Tricks for MongoDB Developer",
author: "Kristina Chodorow",
published_date: ISODate("2011-05-06"),
pages: 68,
language: "English"
}
為了避免可變的、不斷增長的數組,可以將出版商引用存放到圖書文檔中,如下所示:
{_id: "oreilly",
name: "O'Reilly Media",
founded: 1980,
location: "CA"
}
{
_id: 123456789,
title: "MongoDB: The Definitive Guiden,
author: [ "Kristina Chodorow", "Mike Dirolf"],
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English",
publisher_id: "oreilly"
}
{
_id: 234567890,
title: "50 Tips and Tricks for MongoDB Developer",
author: "Kristina Chodorow",
published date: ISODate("2011-05-06"),
pages: 68,
language: "English",
publisher_id: "oreilly"
}