DocumentDB - Pemodelan Data
Meskipun database bebas skema, seperti DocumentDB, sangat memudahkan untuk menerima perubahan pada model data Anda, Anda tetap harus meluangkan waktu untuk memikirkan data Anda.
Anda punya banyak pilihan. Biasanya, Anda hanya dapat mengerjakan grafik objek JSON atau bahkan string mentah teks JSON, tetapi Anda juga dapat menggunakan objek dinamis yang memungkinkan Anda mengikat ke properti pada waktu proses tanpa menentukan kelas pada waktu kompilasi.
Anda juga dapat bekerja dengan objek C # nyata, atau Entitas sebagaimana namanya, yang mungkin merupakan kelas domain bisnis Anda.
Hubungan
Mari kita lihat struktur hierarki dokumen. Ini memiliki beberapa properti level teratas seperti id yang diperlukan, serta lastName dan isRegistered, tetapi juga memiliki properti bertingkat.
{
"id": "AndersenFamily",
"lastName": "Andersen",
"parents": [
{ "firstName": "Thomas", "relationship": "father" },
{ "firstName": "Mary Kay", "relationship": "mother" }
],
"children": [
{
"firstName": "Henriette Thaulow",
"gender": "female",
"grade": 5,
"pets": [ { "givenName": "Fluffy", "type": "Rabbit" } ]
}
],
"location": { "state": "WA", "county": "King", "city": "Seattle"},
"isRegistered": true
}
Misalnya, properti orang tua diberikan sebagai larik JSON seperti yang dilambangkan dengan tanda kurung siku.
Kami juga memiliki array lain untuk anak-anak, meskipun hanya ada satu anak dalam array dalam contoh ini. Jadi ini adalah cara Anda memodelkan persamaan hubungan satu-ke-banyak dalam dokumen.
Anda cukup menggunakan array di mana setiap elemen dalam array bisa berupa nilai sederhana atau objek kompleks lainnya, bahkan array lain.
Jadi, satu keluarga dapat memiliki banyak orang tua dan beberapa anak dan jika Anda melihat objek turunan, mereka memiliki properti hewan peliharaan yang merupakan larik bersarang untuk hubungan oneto-many antara anak-anak dan hewan peliharaan.
Untuk properti lokasi, kami menggabungkan tiga properti terkait, negara bagian, kabupaten, dan kota menjadi sebuah objek.
Menyematkan objek dengan cara ini daripada menyematkan larik objek mirip dengan memiliki hubungan satu-ke-satu antara dua baris dalam tabel terpisah dalam database relasional.
Menyematkan Data
Saat Anda mulai membuat model data di penyimpanan dokumen, seperti DocumentDB, coba perlakukan entitas Anda sebagai dokumen mandiri yang direpresentasikan dalam JSON. Saat bekerja dengan database relasional, kami selalu menormalkan data.
Normalisasi data Anda biasanya melibatkan pengambilan entitas, seperti pelanggan, dan memecahnya menjadi potongan-potongan data rahasia, seperti detail kontak dan alamat.
Untuk membaca pelanggan, dengan semua detail kontak dan alamat mereka, Anda perlu menggunakan GABUNG untuk menggabungkan data Anda secara efektif pada waktu proses.
Sekarang mari kita lihat bagaimana kita akan memodelkan data yang sama sebagai entitas mandiri dalam database dokumen.
{
"id": "1",
"firstName": "Mark",
"lastName": "Upston",
"addresses": [
{
"line1": "232 Main Street",
"line2": "Unit 1",
"city": "Brooklyn",
"state": "NY",
"zip": 11229
}
],
"contactDetails": [
{"email": "[email protected]"},
{"phone": "+1 356 545-86455", "extension": 5555}
]
}
Seperti yang Anda lihat bahwa kami telah menormalisasi catatan pelanggan di mana semua informasi pelanggan disematkan ke dalam satu dokumen JSON.
Di NoSQL kami memiliki skema gratis, sehingga Anda dapat menambahkan detail kontak dan alamat dalam format yang berbeda juga. Di NoSQL, Anda dapat mengambil catatan pelanggan dari database dalam satu operasi baca. Demikian pula, memperbarui rekaman juga merupakan operasi tulis tunggal.
Berikut langkah-langkah membuat dokumen menggunakan .Net SDK.
Step 1- Membuat instance DocumentClient. Kemudian kita akan menanyakan database myfirstdb dan juga query untuk koleksi MyCollection, yang kita simpan dalam koleksi variabel pribadi ini sehingga dapat diakses di seluruh kelas.
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
database = client.CreateDatabaseQuery("SELECT * FROM c WHERE c.id =
'myfirstdb'").AsEnumerable().First();
collection = client.CreateDocumentCollectionQuery(database.CollectionsLink,
"SELECT * FROM c WHERE c.id = 'MyCollection'").AsEnumerable().First();
await CreateDocuments(client);
}
}
Step 2 - Buat beberapa dokumen dalam tugas CreateDocuments.
private async static Task CreateDocuments(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create Documents ****");
Console.WriteLine();
dynamic document1Definition = new {
name = "New Customer 1", address = new {
addressType = "Main Office",
addressLine1 = "123 Main Street",
location = new {
city = "Brooklyn", stateProvinceName = "New York"
},
postalCode = "11229", countryRegionName = "United States"
},
};
Document document1 = await CreateDocument(client, document1Definition);
Console.WriteLine("Created document {0} from dynamic object", document1.Id);
Console.WriteLine();
}
Dokumen pertama akan dibuat dari objek dinamis ini. Ini mungkin terlihat seperti JSON, tetapi tentu saja tidak. Ini adalah kode C # dan kami membuat objek NET nyata, tetapi tidak ada definisi kelas. Sebaliknya, properti disimpulkan dari cara objek diinisialisasi. Anda juga dapat melihat bahwa kami belum menyediakan properti Id untuk dokumen ini.
Step 3 - Sekarang mari kita lihat CreateDocument dan terlihat seperti pola yang sama yang kita lihat untuk membuat database dan koleksi.
private async static Task<Document> CreateDocument(DocumentClient client,
object documentObject) {
var result = await client.CreateDocumentAsync(collection.SelfLink, documentObject);
var document = result.Resource;
Console.WriteLine("Created new document: {0}\r\n{1}", document.Id, document);
return result;
}
Step 4- Kali ini kita memanggil CreateDocumentAsync yang menetapkan Tautan Otomatis dari koleksi yang ingin kita tambahkan dokumennya. Kami mendapatkan kembali respons dengan properti sumber daya yang, dalam hal ini, mewakili dokumen baru dengan properti yang dihasilkan sistem.
Dalam tugas CreateDocuments berikut, kami telah membuat tiga dokumen.
Di dokumen pertama, objek Dokumen adalah kelas yang ditentukan dalam SDK yang diwarisi dari sumber daya sehingga memiliki semua properti sumber daya umum, tetapi juga menyertakan properti dinamis yang menentukan dokumen bebas skema itu sendiri.
private async static Task CreateDocuments(DocumentClient client) {
Console.WriteLine();
Console.WriteLine("**** Create Documents ****");
Console.WriteLine();
dynamic document1Definition = new {
name = "New Customer 1", address = new {
addressType = "Main Office",
addressLine1 = "123 Main Street",
location = new {
city = "Brooklyn", stateProvinceName = "New York"
},
postalCode = "11229",
countryRegionName = "United States"
},
};
Document document1 = await CreateDocument(client, document1Definition);
Console.WriteLine("Created document {0} from dynamic object", document1.Id);
Console.WriteLine();
var document2Definition = @" {
""name"": ""New Customer 2"",
""address"": {
""addressType"": ""Main Office"",
""addressLine1"": ""123 Main Street"",
""location"": {
""city"": ""Brooklyn"", ""stateProvinceName"": ""New York""
},
""postalCode"": ""11229"",
""countryRegionName"": ""United States""
}
}";
Document document2 = await CreateDocument(client, document2Definition);
Console.WriteLine("Created document {0} from JSON string", document2.Id);
Console.WriteLine();
var document3Definition = new Customer {
Name = "New Customer 3",
Address = new Address {
AddressType = "Main Office",
AddressLine1 = "123 Main Street",
Location = new Location {
City = "Brooklyn", StateProvinceName = "New York"
},
PostalCode = "11229",
CountryRegionName = "United States"
},
};
Document document3 = await CreateDocument(client, document3Definition);
Console.WriteLine("Created document {0} from typed object", document3.Id);
Console.WriteLine();
}
Dokumen kedua ini hanya berfungsi dengan string JSON mentah. Sekarang kita melangkah ke dalam kelebihan untuk CreateDocument yang menggunakan JavaScriptSerializer untuk melakukan de-serialisasi string menjadi objek, yang kemudian diteruskan ke metode CreateDocument yang sama yang kita gunakan untuk membuat dokumen pertama.
Di dokumen ketiga, kami telah menggunakan objek C # Pelanggan yang didefinisikan dalam aplikasi kami.
Mari kita lihat pelanggan ini, ia memiliki properti Id dan alamat di mana alamatnya adalah objek bersarang dengan propertinya sendiri termasuk lokasi, yang merupakan objek bertingkat lainnya.
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentDBDemo {
public class Customer {
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
// Must be nullable, unless generating unique values for new customers on client
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "address")]
public Address Address { get; set; }
}
public class Address {
[JsonProperty(PropertyName = "addressType")]
public string AddressType { get; set; }
[JsonProperty(PropertyName = "addressLine1")]
public string AddressLine1 { get; set; }
[JsonProperty(PropertyName = "location")]
public Location Location { get; set; }
[JsonProperty(PropertyName = "postalCode")]
public string PostalCode { get; set; }
[JsonProperty(PropertyName = "countryRegionName")]
public string CountryRegionName { get; set; }
}
public class Location {
[JsonProperty(PropertyName = "city")]
public string City { get; set; }
[JsonProperty(PropertyName = "stateProvinceName")]
public string StateProvinceName { get; set; }
}
}
Kami juga memiliki atribut properti JSON karena kami ingin mempertahankan konvensi yang tepat di kedua sisi pagar.
Jadi saya hanya membuat objek Pelanggan Baru saya bersama dengan objek anak bersarangnya dan memanggil ke CreateDocument sekali lagi. Meskipun objek pelanggan kami memiliki properti Id, kami tidak memberikan nilai untuknya sehingga DocumentDB membuatnya berdasarkan GUID, seperti yang dilakukannya untuk dua dokumen sebelumnya.
Ketika kode di atas dikompilasi dan dijalankan, Anda akan menerima output berikut.
**** Create Documents ****
Created new document: 575882f0-236c-4c3d-81b9-d27780206b2c
{
"name": "New Customer 1",
"address": {
"addressType": "Main Office",
"addressLine1": "123 Main Street",
"location": {
"city": "Brooklyn",
"stateProvinceName": "New York"
},
"postalCode": "11229",
"countryRegionName": "United States"
},
"id": "575882f0-236c-4c3d-81b9-d27780206b2c",
"_rid": "kV5oANVXnwDGPgAAAAAAAA==",
"_ts": 1450037545,
"_self": "dbs/kV5oAA==/colls/kV5oANVXnwA=/docs/kV5oANVXnwDGPgAAAAAAAA==/",
"_etag": "\"00006fce-0000-0000-0000-566dd1290000\"",
"_attachments": "attachments/"
}
Created document 575882f0-236c-4c3d-81b9-d27780206b2c from dynamic object
Created new document: 8d7ad239-2148-4fab-901b-17a85d331056
{
"name": "New Customer 2",
"address": {
"addressType": "Main Office",
"addressLine1": "123 Main Street",
"location": {
"city": "Brooklyn",
"stateProvinceName": "New York"
},
"postalCode": "11229",
"countryRegionName": "United States"
},
"id": "8d7ad239-2148-4fab-901b-17a85d331056",
"_rid": "kV5oANVXnwDHPgAAAAAAAA==",
"_ts": 1450037545,
"_self": "dbs/kV5oAA==/colls/kV5oANVXnwA=/docs/kV5oANVXnwDHPgAAAAAAAA==/",
"_etag": "\"000070ce-0000-0000-0000-566dd1290000\"",
"_attachments": "attachments/"
}
Created document 8d7ad239-2148-4fab-901b-17a85d331056 from JSON string
Created new document: 49f399a8-80c9-4844-ac28-cd1dee689968
{
"id": "49f399a8-80c9-4844-ac28-cd1dee689968",
"name": "New Customer 3",
"address": {
"addressType": "Main Office",
"addressLine1": "123 Main Street",
"location": {
"city": "Brooklyn",
"stateProvinceName": "New York"
},
"postalCode": "11229",
"countryRegionName": "United States"
},
"_rid": "kV5oANVXnwDIPgAAAAAAAA==",
"_ts": 1450037546,
"_self": "dbs/kV5oAA==/colls/kV5oANVXnwA=/docs/kV5oANVXnwDIPgAAAAAAAA==/",
"_etag": "\"000071ce-0000-0000-0000-566dd12a0000\"",
"_attachments": "attachments/"
}
Created document 49f399a8-80c9-4844-ac28-cd1dee689968 from typed object