

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 了解文件
<a name="document-database-documents-understanding"></a>

文件資料庫用於將半結構化資料儲存為文件，而不是將多個資料表的資料標準化，每個資料表都有唯一且固定的結構，就像關聯式資料庫中一樣。存放在文件資料庫中的文件會使用巢狀索引鍵值組提供文件的結構或結構描述。不過，不同類型的文件可以存放在相同的文件資料庫中，因此符合處理不同格式的類似資料時的需求。例如，由於每個文件是自我描述的，因此[文件資料庫中的範例文件](#document-database-documents)主題所述線上商店的 JSON 編碼文件可以存放在相同的文件資料庫中。

**Topics**
+ [SQL 與非關聯式術語](#document-database-sql-vs-nosql-terms)
+ [簡易文件](#document-database-documents-simple)
+ [內嵌文件](#document-database-documents-embeded)
+ [文件資料庫中的範例文件](#document-database-documents)
+ [了解文件資料庫中的標準化](#document-database-normalization)

## SQL 與非關聯式術語
<a name="document-database-sql-vs-nosql-terms"></a>

下表比較文件資料庫 (MongoDB) 所用的術語與 SQL 資料庫所用的術語。


|  SQL  |  MongoDB  | 
| --- | --- | 
|  資料表  |  收集  | 
|  Row  |  文件  | 
|  資料行  |  欄位  | 
|  主索引鍵  |  ObjectId  | 
|  索引  |  索引  | 
|  檢視  |  檢視  | 
|  巢狀表格或物件  |  內嵌文件  | 
|  陣列  |  陣列  | 

## 簡易文件
<a name="document-database-documents-simple"></a>

文件資料庫中的所有文件都是自我描述。本文採用類似 JSON 格式的文件，但您可以使用其他編碼方式。

簡易文件有一或多個欄位，這些欄位在文件中全都位於同一層級。在下列範例中，欄位 `SSN`、`LName`、`FName`、`DOB`、`Street`、`City`、`State-Province`、`PostalCode` 和 `Country` 在文件中全都是同級。

```
{
   "SSN": "123-45-6789",
   "LName": "Rivera",
   "FName": "Martha",
   "DOB": "1992-11-16",
   "Street": "125 Main St.",
   "City": "Anytown",
   "State-Province": "WA",
   "PostalCode": "98117",
   "Country": "USA"
}
```

將資訊整理到簡易文件中時，每個欄位都會分別管理。若要擷取人員的地址，您必須擷取 `Street`、`City`、`State-Province`、`PostalCode` 和 `Country` 做為個別資料項目。

## 內嵌文件
<a name="document-database-documents-embeded"></a>

複雜文件會透過在文件中建立內嵌文件的方式組織其資料。內嵌文件有助於管理分組資料和個別資料項目，端看在所指案例中哪一種方式較有效率。使用上述範例可在主文件中內嵌 `Address` 文件。這樣做會產生以下文件結構：

```
{
   "SSN": "123-45-6789",
   "LName": "Rivera",
   "FName": "Martha",
   "DOB": "1992-11-16",
   "Address": 
   {
       "Street": "125 Main St.",
       "City": "Anytown",
       "State-Province": "WA",
       "PostalCode": "98117",
       "Country": "USA" 
   }
}
```

您現在可以以個別欄位 `"SSN":` ()、內嵌文件 `"Address":` () 或內嵌文件 () `"Address":{"Street":}` 的成員身分存取文件中的資料。

## 文件資料庫中的範例文件
<a name="document-database-documents"></a>

如前面所述，由於文件資料庫中每個文件都是自我描述，因此文件資料庫內文件的結構可能各有不同。以下兩個文件，一個用於書籍，另一個用於期刊，兩者結構有所不同。然而兩個文件可以存放在相同文件資料庫中。

以下是範例書籍文件：

```
{
    "_id" : "9876543210123",
    "Type": "book",
    "ISBN": "987-6-543-21012-3",
    "Author": 
    {
        "LName":"Roe",
        "MI": "T",
        "FName": "Richard" 
    },
    "Title": "Understanding Document Databases"
}
```

以下是有兩篇文章的範例期刊文件：

```
{
    "_id" : "0123456789012",
    "Publication": "Programming Today",
    "Issue": 
    {
        "Volume": "14",
        "Number": "09"
    },
    "Articles" : [ 
        {
            "Title": "Is a Document Database Your Best Solution?",
            "Author": 
            {
                "LName": "Major",
                "FName": "Mary" 
            }
        },
        {
            "Title": "Databases for Online Solutions",
            "Author": 
            {
                "LName": "Stiles",
                "FName": "John" 
            }
        }
    ],
    "Type": "periodical"
}
```

比較這兩個文件的結構。使用關聯式資料庫時，您需要使用個別的「期刊」和「書籍」表格，或是單一表格，其中未使用的欄位如「出版品」、「議題」、「文章」和「MI」為 `null` 值。由於文件資料庫為半結構化，每個文件都會定義自己的結構，因此這兩個文件在沒有 `null` 欄位的情況下，可並存於相同文件資料庫中。文件資料庫適合用於處理稀疏資料。

依照文件資料庫進行開發，即可進行快速、重複性的開發。這是因為您可以動態變更文件的資料結構，而不必變更整個集合的結構描述。文件資料庫非常適合靈活的開發工作和動態變化的環境。

## 了解文件資料庫中的標準化
<a name="document-database-normalization"></a>

文件資料庫不會正規化；在某一個文件中找到的資料可在另一個文件中重複找到。此外，文件之間可能存在一些資料差異。例如，假設您在線上商店購買的情境，而您購買的所有詳細資訊都儲存在單一文件中。此文件可能看起來會像下面的 JSON 文件：

```
{
    "DateTime": "2018-08-15T12:13:10Z",
    "LName" : "Santos",
    "FName" : "Paul",
    "Cart" : [ 
        {
            "ItemId" : "9876543210123",
            "Description" : "Understanding Document Databases",
            "Price" : "29.95"
        },
        {
            "ItemId" : "0123456789012",
            "Description" : "Programming Today",
            "Issue": {
                "Volume": "14",
                "Number": "09"
            },
            "Price" : "8.95"
        },
        {
            "ItemId": "234567890-K",
            "Description": "Gel Pen (black)",
            "Price": "2.49" 
        }
    ],
    "PaymentMethod" : 
    {
        "Issuer" : "MasterCard",
        "Number" : "1234-5678-9012-3456" 
    },
    "ShopperId" : "1234567890" 
}
```

這些資訊全都會做為文件儲存到交易集合中。之後您發現自己忘記購買某一個項目。因此，您再次登入同一家商店並再次購買，這次購買也會存放為交易集合中的另一個文件。

```
{
    "DateTime": "2018-08-15T14:49:00Z",
    "LName" : "Santos",
    "FName" : "Paul",
    "Cart" : [ 
        {
            "ItemId" : "2109876543210",
            "Description" : "Document Databases for Fun and Profit",
            "Price" : "45.95"
        } 
    ],
    "PaymentMethod" : 
    {
        "Issuer" : "Visa",
        "Number" : "0987-6543-2109-8765" 
    },
    "ShopperId" : "1234567890" 
}
```

請注意這兩個文件之間的備援：您的姓名和購物者 ID （如果您使用相同的信用卡，則為您的信用卡資訊）。但是，這種情況並無不妥，因為儲存空間並不昂貴，而每個文件會完整記錄單一交易，可利用簡單的索引鍵值查詢快速擷取。不需聯結。

這兩個文件之間也有明顯的差異：您的信用卡資訊。這只是一項明顯的差異，因為您可能每次購買都使用不同的信用卡。每個文件對於它所記載的交易而言都是正確無誤的。