Memigrasikan skema database yang dinormalisasi dari Azure SQL Database ke kontainer denormalisasi Azure CosmosDB

Panduan ini akan menjelaskan cara mengambil skema database normal yang ada di Azure SQL Database dan mengonversinya menjadi skema denormalisasi Azure CosmosDB untuk dimuat ke Azure CosmosDB.

Skema SQL biasanya dimodelkan menggunakan bentuk normal ketiga, menghasilkan skema yang dinormalisasi yang memberikan integritas data tingkat tinggi dan lebih sedikit nilai data duplikat. Kueri dapat menggabungkan entitas bersama di seluruh tabel untuk dibaca. CosmosDB dioptimalkan untuk transaksi super cepat dan kueri dalam koleksi atau kontainer melalui skema denormalisasi dengan data mandiri di dalam dokumen.

Menggunakan Azure Data Factory, kami akan membuat alur yang menggunakan satu Mapping Data Flow untuk dibaca dari dua tabel normal Azure SQL Database yang berisi kunci utama dan asing sebagai hubungan entitas. ADF akan menggabungkan tabel tersebut ke dalam satu aliran menggunakan aliran data mesin Spark, mengumpulkan baris yang digabungkan ke dalam array dan menghasilkan dokumen bersih individu untuk dimasukkan ke dalam kontainer Azure CosmosDB baru.

Panduan ini akan membangun kontainer baru dengan cepat yang disebut "pesanan" yang akan menggunakan tabel SalesOrderHeaderdanSalesOrderDetail dari database sampel SQL Server AdventureWorks standar. Tabel tersebut mewakili transaksi penjualan yang digabungkan oleh SalesOrderID. Setiap rekaman detail unik memiliki kunci utamanya SalesOrderDetailID sendiri. Hubungan antara header dan detail adalah 1:M. Kami akan bergabung SalesOrderID di ADF dan kemudian menggulung setiap rekaman detail terkait ke dalam array yang disebut "detail".

Kueri SQL perwakilan untuk panduan ini adalah:

  SELECT
  o.SalesOrderID,
  o.OrderDate,
  o.Status,
  o.ShipDate,
  o.SalesOrderNumber,
  o.ShipMethod,
  o.SubTotal,
  (select SalesOrderDetailID, UnitPrice, OrderQty from SalesLT.SalesOrderDetail od where od.SalesOrderID = o.SalesOrderID for json auto) as OrderDetails
FROM SalesLT.SalesOrderHeader o;

Kontainer CosmosDB yang dihasilkan akan menyematkan kueri bagian dalam ke dalam satu dokumen dan terlihat seperti ini:

Koleksi

Membuat alur

  1. Pilih +Alur Baru untuk membuat alur baru.

  2. Menambahkan aktivitas aliran data

  3. Dalam aktivitas aliran data, pilih Aliran data pemetaan baru.

  4. Kami akan membuat grafik aliran data ini di bawah ini

Grafik Aliran Data

  1. Tentukan sumber untuk "SourceOrderDetails". Untuk himpunan data, buat himpunan data Azure SQL Database baru yang menunjuk ke SalesOrderDetail tabel.

  2. Tentukan sumber untuk "SourceOrderHeader". Untuk himpunan data, buat himpunan data Azure SQL Database baru yang menunjuk ke SalesOrderHeader tabel.

  3. Di sumber teratas, tambahkan transformasi Kolom Turunan setelah "SourceOrderDetails". Sebut transformasi baru sebagai "TypeCast". Kita perlu membulatkan UnitPrice kolom dan mentransmisikannya ke jenis data ganda untuk CosmosDB. Atur rumus menjadi: toDouble(round(UnitPrice,2)).

  4. Tambahkan kolom turunan lain dan sebut saja "MakeStruct". Di sinilah kita akan membuat struktur hierarkis untuk menahan nilai dari tabel detail. Ingat, detail adalah M:1 relasi dengan header. Beri nama struktur baru orderdetailsstruct dan buat hierarki dengan cara ini, atur setiap subkolom ke nama kolom masuk:

Buat Struktur

  1. Sekarang, mari kita buka sumber header penjualan. Tambahkan transformasi Gabungan. Untuk sisi kanan pilih "MakeStruct". Biarkan diatur ke gabungan dalam dan pilih SalesOrderID untuk kedua sisi kondisi gabungan.

  2. Klik pada tab Pratinjau Data di gabungan baru yang Anda tambahkan sehingga Anda bisa melihat hasil Anda hingga titik ini. Anda akan melihat semua baris header yang digabungkan dengan baris detail. Ini adalah hasil dari penggabungan yang dibentuk dari SalesOrderID. Selanjutnya, kita akan menggabungkan detail dari baris umum ke dalam struct detail dan mengagregasi baris umum.

Bergabung

  1. Sebelum kita dapat membuat array untuk mendenormalisasi baris ini, pertama-tama kita perlu menghapus kolom yang tidak diinginkan dan memastikan nilai data akan cocok dengan jenis data CosmosDB.

  2. Tambahkan transformasi Pilih berikutnya dan atur pemetaan bidang agar terlihat seperti ini:

Scrubber kolom

  1. Sekarang mari kita kembali ke kolom mata uang, kali ini TotalDue. Seperti yang kami lakukan di atas di langkah 7, atur rumus ke: toDouble(round(TotalDue,2)).

  2. Di sinilah kita akan mendenormalisasi baris dengan mengelompokkan berdasarkan kunci umum SalesOrderID. Tambahkan transformasi Agregat dan atur grup menjadi SalesOrderID.

  3. Dalam rumus agregat, tambahkan kolom baru yang disebut "detail" dan gunakan rumus ini untuk mengumpulkan nilai dalam struktur yang kami buat sebelumnya yang disebut orderdetailsstruct: collect(orderdetailsstruct).

  4. Transformasi agregat hanya akan menghasilkan kolom output yang merupakan bagian dari agregat atau grup berdasarkan rumus. Jadi, kita perlu menyertakan kolom dari header penjualan juga. Untuk melakukan hal itu, tambahkan pola kolom dalam transformasi agregat yang sama. Pola ini akan mencakup semua kolom lain dalam output:

instr(name,'OrderQty')==0&&instr(name,'UnitPrice')==0&&instr(name,'SalesOrderID')==0

  1. Gunakan sintaks "ini" di properti lain sehingga kami mempertahankan nama kolom yang sama dan menggunakan fungsi first() sebagai agregat:

Aggregat

  1. Kami siap menyelesaikan alur migrasi dengan menambahkan transformasi sink. Klik "baru" di samping himpunan data dan tambahkan himpunan data CosmosDB yang menunjuk ke database CosmosDB Anda. Untuk koleksi, kami akan menyebutnya "pesanan" dan tidak akan memiliki skema dan dokumen karena akan dibuat dengan cepat.

  2. Dalam Pengaturan Sink, Kunci Partisi ke \SalesOrderID dan aksi pengumpulan untuk "menciptakan kembali". Pastikan tab pemetaan Anda terlihat seperti ini:

Cuplikan layar memperlihatkan tab Pemetaan.

  1. Klik pada pratinjau data untuk memastikan bahwa Anda melihat 32 baris ini diatur untuk disisipkan sebagai dokumen baru ke dalam kontainer baru Anda:

Cuplikan layar memperlihatkan tab Pratinjau data.

Jika semuanya terlihat bagus, Anda sekarang siap untuk membuat alur baru, tambahkan aktivitas aliran data ini ke alur tersebut dan jalankan. Anda dapat menjalankan dari debug atau proses yang dipicu. Setelah beberapa menit, Anda harus memiliki kontainer pesanan baru yang dinormalisasi yang disebut "pesanan" dalam database CosmosDB Anda.

Langkah berikutnya