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.
Querymengembalikan 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:
| PK | SK | attributes |
|---|---|---|
| WS#acme | META | name, plan, seats |
| WS#acme | DOC#a1#META | title, owner, wordCount |
| WS#acme | DOC#a1#CMT#0007 | author, body, createdAt |
| WS#acme | DOC#a1#CMT#0008 | author, 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:
| PK | SK | EntityType | title |
|---|---|---|---|
| WS#acme | META | Workspace | — |
| WS#acme | DOC#a1#META | Document | Q3 Roadmap |
| WS#acme | DOC#a1#CMT#0007 | Comment | — |
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.
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:
| Mendekati | Berapa biayanya | Kapan harus digunakan |
|---|---|---|
FilterExpression pada Tipe | Membaca semua item yang cocok, menagih semuanya, menghapus item yang tidak cocok setelah dibaca | Hasilnya jarang berupa entitas campuran; cepat dikirim |
Indeks renggang (GSI1PK hanya ditulis pada entitas target) | Hanya entitas yang Anda inginkan yang masuk dalam indeks | Satu 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.