Menengah6 menit baca

Atribut Tipe di DynamoDB

Di SQL, tabel baris adalah tipenya — baris di documents adalah dokumen. Satu tabel tunggal DynamoDB menggabungkan setiap entitas dalam satu skema, sehingga item tidak punya jawaban bawaan untuk "apa ini?".

Atribut Type mengembalikan jawaban itu: string biasa pada setiap item menamai entitas yang diwakilinya.

Apa atribut Type di DynamoDB?

Atribut Type adalah string biasa yang Anda cap pada setiap item — seperti EntityType: "Document" — yang memberi nama entitas yang diwakili item tersebut. Karena tabel tunggal menggabungkan banyak entitas dalam satu skema, item tidak memiliki tipe bawaan. Tipe mengembalikannya, sehingga kode Anda mengidentifikasi baris, memfilter GSI ke satu entitas, dan bertahan dalam migrasi.

  • Cetak Tipe pada setiap penulisan. Satu atribut — EntityType: "Document" — pada setiap item, tanpa pengecualian. Biayanya beberapa byte dan menghemat Anda nanti.
  • Ini mengidentifikasi entitas dalam partisi campuran. Query mengembalikan ruang kerja, dokumen, dan komentar bersama; Type memberi tahu kode Anda yang mana tanpa mengurai awalan kunci.
  • Ini mendukung pemfilteran entitas tunggal pada . Memproyeksikan Tipe ke dalam indeks dan Anda dapat mempersempit indeks yang kelebihan beban menjadi satu jenis entitas saja.
  • Ini adalah palka escape Anda untuk migrasi. Saat Anda mengekspor untuk memodelkan ulang atau memindahkan suatu entitas ke tabelnya sendiri, Tipe adalah kolom yang Anda pisahkan.

Mengapa tabel campuran kehilangan tipenya

Desain tabel tunggal menyimpan setiap entitas dalam satu tabel di belakang kunci generik seperti PK dan SK. Itulah intinya — satu Query mengembalikan orang tua dan anak-anaknya bersama-sama. Tapi itu berarti partisi heterogen.

Ambil aplikasi kolaborasi dokumen SaaS. Satu partisi ruang kerja menampung ruang kerja catatannya, dokumen-dokumennya, dan komentar-komentar terhadap dokumen-dokumen itu:

PKSKattributes
WS#acmeMETAname, plan, seats
WS#acmeDOC#a1#METAtitle, owner, wordCount
WS#acmeDOC#a1#CMT#0007author, body, createdAt
WS#acmeDOC#a1#CMT#0008author, body, createdAt

Query PK = "WS#acme" mengembalikan keempat item dalam satu pembacaan tagihan. Sekarang milikmu kode memiliki daftar item mentah dan tidak ada cara yang dapat diandalkan untuk mengatakan mana yang merupakan dokumen dan yang merupakan komentar — kependekan dari pencocokan string dengan SK, yaitu brittle the saat format kunci Anda berubah.

Stempel Jenis pada setiap item

Perbaikannya adalah satu atribut pada setiap penulisan, yang memberi nama entitas:

PKSKEntityTypetitle
WS#acmeMETAWorkspace
WS#acmeDOC#a1#METADocumentQ3 Roadmap
WS#acmeDOC#a1#CMT#0007Comment

Percabangan pada item.EntityType === "Document" adalah pemeriksaan kesetaraan yang stabil. Parsing SK.startsWith("DOC#") && SK.includes("#CMT#") adalah tebakan yang gagal ketika Anda memutar kuncinya. Type memisahkan logika baca Anda dari pengkodean kunci Anda — itulah kemenangan sesungguhnya.

Permintaan PK = 'WS#acme'Partisi campuranTipe Entitas:'Ruang Kerja'Tipe Entitas:'Dokumen'Jenis Entitas:'Komentar'Rute berdasarkan Jenis

Satu pembacaan mengembalikan tiga tipe entitas; atribut Type merutekan setiap item ke pawang yang tepat tanpa menyentuh tuts.

Filter GSI ke satu entitas

Tipe earn tetap pada indeks. Katakanlah Anda menambahkan tombol GSI GSI1PK = WS#acme, GSI1SK = updatedAt untuk mencantumkan "semuanya baru saja berubah ruang kerja ini, yang terbaru terlebih dahulu". Indeks yang kelebihan beban menyapu dokumen dan komentar — tetapi UI feed mungkin hanya menginginkan dokumen.

Dua cara untuk mempersempitnya, dan perbedaannya adalah uang:

MendekatiBerapa biayanyaKapan harus digunakan
FilterExpression pada TipeMembaca semua item yang cocok, menagih semuanya, menghapus item yang tidak cocok setelah dibacaHasilnya jarang berupa entitas campuran; cepat dikirim
Indeks renggang (GSI1PK hanya ditulis pada entitas target)Hanya entitas yang Anda inginkan yang masuk dalam indeksSatu entitas mendominasi; Anda ingin tidak ada limbah

Sesuai permintaan di us-east-1, GSI Query mengembalikan 100 item campuran dengan ukuran 2 KB setiap tagihan kira-kira 100 RCU pada akhirnya konsisten — dan FilterExpression aktif EntityType masih mengukur setiap baris sebelum menghapus komentar. Indeks yang jarang itu tidak pernah mengindeks komentar hanya menagih baris dokumen. Modelkan kedua bentuk di kalkulator harga.

FilterExpression berjalan setelah item dibaca dan setelah kapasitasnya dikonsumsi — AWS secara eksplisit menyatakan bahwa pemfilteran tidak mengurangi biaya baca (Panduan Pengembang DynamoDB: FilterExpression). Memfilter berdasarkan Type itu jujur, tidak gratis: Anda membayar untuk komentar yang Anda buang.

Untuk mempersempit umpan ke dokumen, kueri membawa kondisi pada Tipe atribut. Rakit FilterExpression, nama, dan nilai dengan Pembuat ekspresi DynamoDB — ia memancarkan Placeholder #t = :doc sehingga Anda tidak terlalu mempermasalahkan kata yang dilindungi undang-undang.

KeyConditionExpression     GSI1PK = :ws
FilterExpression           #t = :doc
ExpressionAttributeNames   { "#t": "EntityType" }
ExpressionAttributeValues  { ":ws": "WS#acme", ":doc": "Document" }

Ingin indeks membawa hanya dokumen dan melewatkan filter sepenuhnya? Menulis GSI1PK hanya pada item dokumen — . Item tanpa kunci GSI tidak pernah direplikasi ke dalam indeks, sehingga pembacaannya menyentuh dokumen saja. Atribut Type adalah yang memberi tahu penulis item mana memenuhi syarat.

Jaga agar nilainya tetap stabil dan tunggal

Pilih nilainya satu kali dan perlakukan sebagai enum. Document, terkadang tidak pernah Doc dan terkadang document — nilai yang melayang lebih buruk daripada tidak ada nilai, karena nilai Anda pemeriksaan kesetaraan melewati satu casing dan secara diam-diam melewatkan casing lainnya.

Satu Jenis per item. Jika suatu item terasa seperti dua entitas, biasanya itu adalah pemodelan bau — harus terdiri dari dua item, masing-masing dalam koleksi atau rentang kunci sortirnya sendiri, tidak satu baris memakai dua topi.

Imbalan migrasi

Alasan untuk mencap Tipe sebelum Anda membutuhkannya: pemodelan ulang. Yang direkomendasikan jalur model ulang adalah ekspor, transformasi, impor ulang — dan dokumen AWS diekspor secara massal S3 untuk reshaping offline semacam ini (Mengekspor DynamoDB ke S3).

Ketika hari itu tiba, Type adalah kolom Anda GROUP BY. Ingin mengangkat komentar ke dalam tabel mereka sendiri, atau normalisasi ulang ekspor menjadi file per-entitas untuk gudang analitik? Anda membagi dump pada EntityType. Tanpa itu, Anda kembali untuk merekayasa balik kunci di jutaan baris.

Langkah selanjutnya

Atribut Type adalah asuransi murah: mengidentifikasi entitas dalam filter baca campuran GSI yang kelebihan beban, dan terbelah dengan rapi saat Anda memodelkan ulang. Stempel pada setiap tulisan sejak hari pertama — memasangnya kembali ke tabel langsung berarti penimbunan kembali secara penuh.

Bacaan terkait: desain tabel tunggal untuk pola partisi campuran yang disajikan, GSI vs LSI untuk memilih bentuk indeks di belakang indeks renggang, dan Query vs Scan mengapa FilterExpression tidak pernah menyimpan Anda membaca biaya.

Bangun filter pada Type dengan Pembuat ekspresi DynamoDB, dan coba DynoTable untuk menelusuri tabel entitas campuran nyata dan melihat Jenisnya kolom berbaris di setiap item.

Diperbarui