Lewati ke konten

Letakkan Data di Tempatnya

Juga tersedia dalam 28 bahasa

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

Two identical drawers on a workbench, seen from above: one jammed with everything mixed together, one divided so each kind of thing has its own compartment.
Gambar dibuat dengan AI

Modul 4 dari 6 dalam bab Memodelkan Data Berdasarkan Makna, bab 2 kursus Data Architect. Setiap modul dapat dibaca secara mandiri. Sebelumnya: Bangun Model Logis · Berikutnya: Rancang hingga Bentuk Normal Ketiga, Lalu Mundur Sedikit

Pertanyaan yang dijawab modul ini: Bagaimana normalisasi membantu saya menentukan di mana data sebenarnya seharusnya berada?

Kita sudah punya model logis: entitas, hubungan, atribut, dan kunci. Sekarang saya ingin mengajukan salah satu pertanyaan terpenting dalam pemodelan data: apakah data ini memang seharusnya berada di sini?

Kedengarannya sederhana. Ternyata tidak. Saya sudah melihat banyak sistem di mana setiap bidang masuk akal ketika seseorang membuatnya. Masalahnya bukan bidang-bidangnya konyol; masalahnya fakta-faktanya disimpan di tempat yang salah. Sebuah pengiriman menyimpan informasi yang sebenarnya menggambarkan pusat distribusi. Alamat yang sama muncul di ratusan rekaman. Satu bidang menyimpan tiga nilai yang dipisahkan koma. Perubahan pada satu fakta bisnis berarti memperbarui 10.000 rekaman. Itulah masalah yang dibantu diselesaikan oleh normalisasi, dan sebelum kita tenggelam dalam istilah database, inilah seluruh gagasannya: letakkan sebuah fakta di tempatnya. Semua hal lain dalam modul ini membantu kita melakukannya dengan lebih sistematis.

Normalisasi adalah menata data sehingga setiap fakta disimpan sekali, di tempat yang seharusnya. Ketika satu tabel mengerjakan terlalu banyak tugas, kita memecahnya menjadi tabel-tabel yang masing-masing menggambarkan satu hal, dan kita menghubungkannya dengan kunci.

Mengapa repot-repot? Karena fakta yang disimpan sekali adalah fakta yang kita ubah sekali. Normalisasi mencegah redundansi, yaitu fakta yang sama disalin ke banyak rekaman, dan bersamanya ketidakkonsistenan yang menyusup ketika satu salinan diperbarui sementara yang lain tidak. Itulah sebabnya normalisasi cocok untuk sistem transaksional seperti Salesforce, di mana rekaman dibuat dan diperbarui sepanjang hari.

Kita menormalisasi secara bertahap dalam langkah-langkah yang disebut bentuk normal, dan masing-masing mengajukan satu pertanyaan:

  • Bentuk normal pertama (1NF): satu nilai per bidang, dan sesuatu yang mengidentifikasi setiap baris secara unik.
  • Bentuk normal kedua (2NF): setiap fakta menggambarkan keseluruhan dari apa yang mengidentifikasi baris itu, bukan hanya sebagiannya.
  • Bentuk normal ketiga (3NF): setiap fakta menggambarkan hal ini, bukan sesuatu lain yang berhubungan dengannya.

Masih ada bentuk-bentuk lain setelah yang ketiga. Saya akan menyinggungnya nanti, termasuk mengapa kita biasanya berhenti di bentuk ketiga. Pertama, mari kita lihat ketiga langkah itu terjadi.

Ketika saya mengajarkan ini secara langsung, saya tidak mulai dengan pengiriman. Saya mulai dengan anjing. Semua orang paham anjing, jadi tidak ada yang terganggu oleh urusan bisnisnya, dan kita bisa melihat data berusaha menemukan rumahnya. Lalu kita bawa langkah-langkah yang sama ke Steve Trucking.

Awal: spreadsheet mentah. Saya menampilkan beberapa anjing di layar, lalu peserta di ruangan menambahkan anjing mereka. Dalam beberapa menit kita punya satu daftar besar: anjingnya, tahun lahirnya, siapa pemiliknya, di mana pemiliknya tinggal, rasnya, siapa peternaknya, dan trik yang dikuasainya.

AnjingLahirPemilikKode PosKotaRasPeternakTrik
Bella2017Marcus80202DenverLabradorMaple RidgeDuduk, Diam, Salaman
Milo2019Marcus80202DenverPoodleGolden MeadowDuduk, Berguling
Max2022Ana64105Kansas CityCampuranDuduk, Pura-pura Mati
Luna2020Kenji98101SeattleHuskyCascadeDuduk, Diam, Berputar
Rocky2024Priya30301AtlantaBeagleMaple RidgeDuduk
Coco2014Ana64105Kansas CityChihuahuaLittle PawsSalaman, Berputar

Ini berfungsi. Setiap spreadsheet berfungsi di hari pertama. Tetapi lihat apa yang sudah salah. Bagaimana saya menemukan semua anjing yang bisa Salaman? Kode pos Ana ada di dua baris, begitu juga milik Marcus: apa yang terjadi jika seseorang memperbarui yang satu tetapi tidak yang lain? Maple Ridge muncul dua kali, begitu juga Kansas City. Dan Max berasal dari penampungan hewan, jadi sama sekali tidak punya peternak.

Langkah 1: bentuk normal pertama. Dua aturan. Setiap bidang menyimpan satu nilai saja, jadi daftar trik yang dipisahkan koma harus dihapus. Dan setiap baris butuh sesuatu yang mengidentifikasinya secara unik. Bukan nama anjingnya; ada banyak sekali anjing bernama Max. Sebuah ID: ID yang dibuat otomatis atau GUID. Trik-triknya dikeluarkan ke baris-barisnya sendiri, satu baris untuk setiap anjing dan setiap trik. Dan begitu sebuah trik punya barisnya sendiri, ada ruang untuk hal yang tidak pernah bisa kita sampaikan dalam daftar berkoma: seberapa sulit trik itu, seberapa baik anjing ini melakukannya, dan kapan ia mempelajarinya.

Anjing (diidentifikasi oleh ID Anjing)

ID AnjingNamaLahirPemilikKode PosKotaRasPeternak
D-001Bella2017Marcus80202DenverLabradorMaple Ridge
D-002Milo2019Marcus80202DenverPoodleGolden Meadow
D-003Max2022Ana64105Kansas CityCampuran
D-004Luna2020Kenji98101SeattleHuskyCascade
D-005Rocky2024Priya30301AtlantaBeagleMaple Ridge
D-006Coco2014Ana64105Kansas CityChihuahuaLittle Paws

Trik Anjing (diidentifikasi oleh ID Anjing + Trik)

ID AnjingTrikKesulitanTingkat KeterampilanDipelajari
D-001DudukMudahAhli2017-11
D-001DiamMudahAhli2018-01
D-001SalamanSedangBaik2018-06
D-002DudukMudahAhli2020-02
D-002BergulingSulitBelajar2023-05
D-003DudukMudahBaik2022-06
D-003Pura-pura MatiSulitBelajar2024-03
D-004DudukMudahAhli2020-11
D-004DiamMudahBaik2021-01
D-004BerputarSedangAhli2021-06
D-005DudukMudahBelajar2025-02
D-006SalamanSedangAhli2015-06
D-006BerputarSedangBelajar2025-04

Sekarang “semua anjing yang bisa Salaman” menjadi pertanyaan sederhana. Tetapi perhatikan apa yang mengidentifikasi Trik Anjing: bukan satu hal, melainkan dua hal sekaligus, anjingnya dan triknya. Ingat itu baik-baik.

Langkah 2: bentuk normal kedua. Bentuk normal kedua hanya berlaku ketika sebuah baris diidentifikasi oleh kombinasi, dan Trik Anjing memang begitu. Jadi saya bertanya pada setiap kolom: apakah ia menggambarkan keseluruhan kombinasinya, atau hanya sebagiannya? Tingkat Keterampilan menggambarkan anjing ini melakukan trik ini: Bella ahli dalam Duduk, Rocky masih belajar. Dipelajari, sama saja. Tetapi Kesulitan? Duduk itu mudah, anjing mana pun yang melakukannya. Kesulitan menggambarkan triknya, hanya sebagian dari kuncinya, dan itulah sebabnya “Mudah” diulang di setiap baris Duduk. Jadi trik mendapat tabelnya sendiri, dan yang tersisa adalah pasangannya.

Trik

ID TrikTrikKesulitan
T-01DudukMudah
T-02DiamMudah
T-03SalamanSedang
T-04BergulingSulit
T-05Pura-pura MatiSulit
T-06BerputarSedang

Trik Anjing (ID Anjing + ID Trik)

ID AnjingID TrikTingkat KeterampilanDipelajari
D-001T-01Ahli2017-11
D-001T-02Ahli2018-01
D-001T-03Baik2018-06
D-002T-01Ahli2020-02
D-002T-04Belajar2023-05
D-003T-01Baik2022-06
D-003T-05Belajar2024-03
D-004T-01Ahli2020-11
D-004T-02Baik2021-01
D-004T-06Ahli2021-06
D-005T-01Belajar2025-02
D-006T-03Ahli2015-06
D-006T-06Belajar2025-04

Tabel Trik Anjing itu adalah tabel yang kita temukan di modul 2, dan dalam pemodelan data ia punya nama: penghubung (junction), atau sebutan saya, objek penghubung logis. Seekor anjing menguasai banyak trik; sebuah trik dikuasai banyak anjing. Penghubung itu berada di antara keduanya, dan ia bukan sekadar pipa kosong: ia menyimpan fakta-fakta milik hubungan itu sendiri, yaitu tingkat keterampilan dan tanggalnya. Kita akan bertemu dengannya lagi di modul 6, dan di bab 3 kita akan melihat bahwa Salesforce memakai istilah “junction object” secara lebih sempit: Junction Object Salesforce adalah objek kustom dengan dua hubungan master-detail (bab 3, modul 7).

Langkah 3: bentuk normal ketiga. Sekarang kembali ke tabel Anjing. Semua yang ada di dalamnya diidentifikasi oleh ID Anjing, jadi bentuk normal kedua tidak punya apa-apa untuk dikatakan. Bentuk normal ketiga mengajukan pertanyaan yang berbeda: apakah fakta ini menggambarkan anjingnya, atau sesuatu lain yang berhubungan dengan anjing itu? Ras adalah hal tersendiri: Labrador tetap Labrador, anjing mana pun itu, dan fakta tentangnya, seperti ukurannya, milik rasnya, bukan milik Bella. Kode pos dan kota menggambarkan pemiliknya, bukan anjingnya: di situlah Ana tinggal, anjing mana pun miliknya yang sedang kita lihat. Detail peternak menggambarkan peternaknya. Masing-masing adalah fakta tentang fakta lain, jadi masing-masing pindah ke tabelnya sendiri, dan anjing menunjuk ke sana dengan foreign key:

  • Anjing: ID Anjing, Nama, Lahir, ID Pemilik, ID Ras, ID Peternak
  • Pemilik: ID Pemilik, Nama, Kode Pos, Kota
  • Ras: ID Ras, Ras, Ukuran
  • Peternak: ID Peternak, Nama, Kota
  • Trik dan Trik Anjing, dari langkah 2

Sekarang Ana disimpan sekali, dengan kedua anjingnya menunjuk kepadanya. Maple Ridge disimpan sekali, dan tabel Ras memberi kita tempat untuk fakta tentang setiap ras, seperti ukurannya, yang di spreadsheet tidak punya tempat. Foreign key boleh kosong: Max tidak punya ID Peternak, dan itu jawaban yang jujur, bukan celah. Lalu saya melempar pertanyaan jebakan ke peserta: kapan pemilik mendapatkan anjingnya, di mana tanggal itu diletakkan? Di anjingnya. Dalam model ini seekor anjing hanya punya satu pemilik pada satu waktu, jadi tanggal itu menggambarkan hubungan anjing dengan pemiliknya.

Anda bisa melangkah satu tahap lagi dan memisahkan kota dari kode pos; buku teks melakukannya. Dalam praktiknya, sebuah alamat tetap utuh, dan lagi pula Kansas City terletak di dua negara bagian, pengingat yang bagus bahwa dunia nyata tidak membaca buku teks kita.

Itulah alurnya: sebuah spreadsheet, lalu tiga pertanyaan, dan setiap fakta berakhir di satu tempat. Mundur sejenak dan lihat apa yang telah kita bangun. Satu daftar yang berantakan menjadi enam tabel, masing-masing menggambarkan satu hal, dihubungkan oleh kunci:

Model anjing setelah bentuk normal ketiga Enam kotak yang dihubungkan garis. Seorang Pemilik memiliki satu atau banyak Anjing. Seekor Anjing punya satu Pemilik, adalah satu Ras, dan dibiakkan oleh nol atau satu Peternak (seorang Peternak membiakkan satu atau banyak Anjing). Di antara Anjing dan Trik ada Trik Anjing: seekor Anjing menguasai nol atau banyak Trik Anjing, sebuah Trik dikuasai dalam nol atau banyak Trik Anjing, dan setiap Trik Anjing milik tepat satu Anjing dan satu Trik. memiliki membiakkan adalah menguasai dikuasai dalam Pemilik Peternak Anjing Ras Trik Anjing Trik tepat satu nol atau satu satu atau banyak nol atau banyak © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Tidak ada yang butuh satu kata Salesforce pun untuk mengikutinya. Hanya anjing-anjing itu, orang-orang di sekitarnya, dan apa yang mereka kuasai.

Anjing-anjing itu membuat langkah-langkahnya mudah dilihat. Bisnis nyata membuatnya penting, karena kesalahan yang sama menghabiskan uang sungguhan dalam skala besar. Jadi mari kita bawa tiga pertanyaan yang sama ke Steve Trucking. Bayangkan perusahaan itu menyimpan pengirimannya seperti ini:

PengirimanMitra RitelPusat DistribusiKota DCKruTruk
1001KeystoneKeystone Phoenix DCPhoenixKru 12117
1002KeystoneKeystone Phoenix DCPhoenixKru 8122
1003KeystoneKeystone Phoenix DCPhoenixKru 12117

Sekilas tidak ada yang rumit di sini. Tetapi lihat pusat distribusinya. Kita mengulang “Keystone Phoenix DC, Phoenix” di setiap pengiriman yang berangkat dari sana: Steve Trucking melakukan sekitar 3.300 pengiriman sehari dari sembilan DC, jadi beberapa ratus sehari dari masing-masing DC. Apa yang terjadi jika DC itu pindah? Berapa banyak rekaman yang kita ubah, dan apa yang terjadi jika satu terlewat? Sekarang data mengatakan DC itu berada di dua kota sekaligus. Itulah anomali pembaruan. Bagaimana jika kita ingin menyiapkan DC baru sebelum pengiriman pertamanya? Bagaimana jika kita menghapus pengiriman terakhir dari sebuah DC: apakah kita baru saja menghapus satu-satunya tempat kita menyimpan informasi tentang DC itu?

Ini gejala-gejala berbeda dari masalah yang sama: kita mencampur fakta tentang hal-hal yang berbeda. Fakta pusat distribusi milik pusat distribusi. Fakta pengiriman milik pengiriman. Fakta kru milik kru. Itulah normalisasi dalam istilah praktis.

Bentuk Normal Pertama: Jangan Menyembunyikan Struktur Berulang

Section titled “Bentuk Normal Pertama: Jangan Menyembunyikan Struktur Berulang ”

Mari mulai dengan Bentuk Normal Pertama, atau 1NF, tempat orang kadang membuat normalisasi lebih sulit dari yang seharusnya.

Misalkan sebuah pengiriman punya bidang bernama Item: “Kulkas, kit pembuat es, angkut barang lama.” Kita memasukkan tiga informasi ke satu bidang. Kelihatannya praktis, sampai seseorang bertanya, “Berapa kali kita mengangkut barang lama bulan lalu?” Atau bayangkan bidang bernama Item 1, Item 2, dan Item 3. Itu berfungsi, sampai ada pengiriman dengan empat item. Masalahnya bukan kita memilih jumlah bidang Item yang salah. Masalahnya kita tidak mengenali struktur yang berulang. Sebuah pengiriman bisa punya beberapa item. Itu data yang seharusnya kita modelkan: Item Pengiriman yang kita temukan di modul 2.

Item sebuah pengiriman, tiga cara Tiga kartu menunjukkan item dari pengiriman yang sama, disimpan dengan tiga cara. Satu bidang: pengiriman 1001 punya bidang Item berisi “Kulkas, kit pembuat es, angkut barang lama”, yang tidak bisa menjawab berapa kali angkut barang lama dilakukan bulan lalu. Bidang berulang: Item 1 kulkas, Item 2 kit pembuat es, Item 3 angkut barang lama, yang tidak bisa menampung pengiriman dengan empat item. Rekaman anak, disorot: pengiriman 1001 punya tiga Item Pengiriman, yaitu kulkas, kit pembuat es, dan angkut barang lama, dan item berikutnya adalah rekaman baru, bukan bidang baru. Catatan di bawahnya: jika sesuatu bisa terjadi berkali-kali, mungkin ada entitas lain yang ingin keluar. Satu bidang tiga fakta tersembunyi dalam satu nilai PENGIRIMAN 1001 Item: Kulkas, kit pembuat es, angkut barang lama PERTANYAAN YANG TAK BISA DIJAWABNYA Berapa kali angkut barang lama bulan lalu? Bidang berulang Item 1, Item 2, Item 3 PENGIRIMAN 1001 Item 1: Kulkas Item 2: Kit pembuat es Item 3: Angkut barang lama PENGIRIMAN YANG TAK BISA DITAMPUNGNYA Yang berisi empat item Rekaman anak satu Item Pengiriman untuk masing-masing PENGIRIMAN 1001 Item Pengiriman: Kulkas Item Pengiriman: Kit pembuat es Item Pengiriman: Angkut barang lama ITEM BERIKUTNYA Rekaman baru, bukan bidang baru Jika sesuatu bisa terjadi berkali-kali, mungkin ada entitas lain yang ingin keluar. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Pelajaran praktis dari 1NF: jangan menyembunyikan struktur berulang di dalam bidang. Jika bisnis memberi tahu Anda bahwa sesuatu bisa terjadi berkali-kali, dengarkan. Mungkin ada entitas lain yang sedang berusaha keluar.

Anda akan melihat ini di org nyata setiap saat. Seseorang butuh deskripsi dalam beberapa bahasa, jadi mereka membuat bidang bernama Description_English, lalu Description_French, lalu Description_German. Atau sebuah persetujuan butuh beberapa orang, jadi muncullah Penyetuju 1, Penyetuju 2, Penyetuju 3. Ketika saya menemukan itu dalam sebuah review, tangannya saya tepuk: perbaiki model datamu. Satu atau dua, mungkin, jika bisnis memang hanya pernah punya satu atau dua. Lebih dari itu seharusnya menjadi objek anak: Terjemahan dengan bahasanya, Langkah Persetujuan dengan penyetujunya. Bahasa berikutnya, atau penyetuju keempat, menjadi rekaman baru, bukan bidang baru plus deployment.

Bentuk Normal Kedua: Gambarkan Keseluruhannya

Section titled “Bentuk Normal Kedua: Gambarkan Keseluruhannya ”

Bentuk Normal Kedua, atau 2NF, penting ketika sebuah rekaman diidentifikasi oleh kombinasi beberapa hal. Ambil Item Pengiriman. Ia punya record ID sendiri, tetapi masing-masing unik berdasarkan Pengiriman + Produk. Misalkan kita menyimpan pengirimannya, produknya, jumlahnya, dan deskripsi produknya.

Jumlah masuk akal di sini: ia menggambarkan produk ini pada pengiriman ini. Tetapi deskripsi produk tidak menggambarkan kombinasinya; ia menggambarkan produknya. Taruh di setiap Item Pengiriman, dan kita mengulangnya setiap kali model kulkas itu berangkat di truk lain. Itulah petunjuk bahwa fakta tersebut seharusnya berada di tempat lain.

Jadi pertanyaan 2NF adalah: apakah atribut ini menggambarkan keseluruhan hal yang saya identifikasi, atau hanya sebagiannya? Jika hanya menggambarkan produk, ia ikut ke Produk. Jika menggambarkan posisi produk pada pengiriman tertentu ini (jumlahnya, apakah dipasang), ia milik Item Pengiriman. Banyak admin tidak akan pernah secara sadar berkata, “Sekarang saya sedang menerapkan Bentuk Normal Kedua.” Tidak apa-apa. Saya jauh lebih peduli Anda belajar bertanya: apa yang sebenarnya digambarkan oleh fakta ini?

Bentuk Normal Ketiga: Jangan Menyimpan Fakta tentang Fakta Lain

Section titled “Bentuk Normal Ketiga: Jangan Menyimpan Fakta tentang Fakta Lain ”

Sekarang yang paling saya pedulikan untuk pemodelan sehari-hari: Bentuk Normal Ketiga, atau 3NF.

Setiap pusat distribusi punya manajer di pihak Mitra Ritel, seseorang yang memakai portal mitra. Misalkan kita menaruh nama manajer DC langsung di setiap pengiriman. Apa yang terjadi ketika DC itu mendapat manajer baru? Kita memperbarui setiap pengiriman dari DC itu. Itu gejala yang sama lagi: kita mengulang fakta yang seharusnya berada di tempat lain. Pengiriman berangkat dari sebuah DC; DC punya manajer. Itu dua hubungan, dan nama manajer seharusnya berada di DC.

Versi klasik di buku teks adalah alamat: kode pos, kota, dan negara bagian disimpan bersama di setiap rekaman, padahal kota dan negara bagian biasanya sudah bisa diketahui dari kode posnya. Bentuknya sama, pertanyaannya sama.

Fakta tentang fakta lain: manajer DC Dua panel. Di setiap pengiriman: sebuah rekaman Pengiriman dengan record ID, tanggal pengiriman, pusat distribusi, serta kota dan manajer DC, keduanya ditandai berulang. Disimpan sekali, bersama DC: Pengiriman menyimpan record ID, tanggal pengiriman, dan ID Pusat Distribusi, lalu berangkat dari sebuah Pusat Distribusi, yang menyimpan record ID, nama, kota, dan manajernya sendiri. Catatan di bawahnya: manajer DC baru berarti ratusan pembaruan di kiri dan satu di kanan. DI SETIAP PENGIRIMAN DISIMPAN SEKALI, BERSAMA DC berangkat dari Pengiriman ID Pengiriman RECORD ID Tanggal Pengiriman Pusat Distribusi Kota DC BERULANG Manajer DC BERULANG Pengiriman ID Pengiriman RECORD ID Tanggal Pengiriman ID Pusat Distribusi Pusat Distribusi ID Pusat Distribusi RECORD ID Nama Kota Manajer Manajer DC baru: ratusan pembaruan di kiri, satu di kanan. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Pertanyaan praktis 3NF adalah: apakah fakta ini menggambarkan hal ini, atau sesuatu lain yang berhubungan dengan hal ini? Saya ingin Anda terus-menerus menanyakannya.

Sekarang mundur sejenak, seperti yang kita lakukan dengan anjing-anjing tadi. Tabel pengiriman yang kita mulai telah menjadi lima hal, masing-masing menyimpan faktanya sendiri: Item Pengiriman keluar di bentuk normal pertama, Produk di bentuk kedua, dan kota serta manajer Pusat Distribusi pindah ke Pusat Distribusi di bentuk ketiga.

Steve Trucking setelah normalisasi Lima kotak yang dihubungkan garis. Sebuah Mitra Ritel mengoperasikan nol atau banyak Pusat Distribusi. Sebuah Pengiriman berangkat dari tepat satu Pusat Distribusi dan berisi satu atau banyak Item Pengiriman. Setiap Item Pengiriman adalah tepat satu Produk, dan sebuah Produk muncul di nol atau banyak Item Pengiriman. mengoperasikan berangkat dari berisi muncul di Mitra Ritel Pengiriman Item Pengiriman Produk Pusat Distribusi tepat satu nol atau satu satu atau banyak nol atau banyak © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Tiga pertanyaan yang sama, hasil yang sama: setiap fakta di satu tempat.

Cara Sederhana Memikirkan 1NF, 2NF, dan 3NF

Section titled “Cara Sederhana Memikirkan 1NF, 2NF, dan 3NF ”

Anda bisa menghabiskan satu kursus database penuh untuk normalisasi. Kita tidak akan melakukannya. Untuk kursus ini, saya ingin Anda punya pemahaman praktis seorang arsitek:

  • 1NF: apakah saya menyembunyikan beberapa nilai atau struktur berulang di dalam sebuah bidang atau rekaman?
  • 2NF: apakah fakta ini menggambarkan keseluruhan hal yang saya identifikasi?
  • 3NF: apakah fakta ini benar-benar menggambarkan entitas ini, atau sesuatu yang berhubungan dengannya?

Itu bukan definisi untuk buku teks database. Itu pertanyaan yang benar-benar bisa saya pakai saat sedang merancang.

Ya, normalisasi masih berlanjut: Boyce-Codd Normal Form (BCNF) memperketat aturan di sekitar 3NF untuk model dengan kunci yang lebih rumit, dan ada Bentuk Normal Keempat, Kelima, bahkan Keenam. Bentuk-bentuk itu menangani jenis pengulangan yang lebih jarang, yang lebih banyak muncul dari struktur kunci yang tidak biasa daripada dari rekaman bisnis sehari-hari. Banyak teori, dan menurut pengalaman saya tidak sepadan dengan pusingnya untuk jenis sistem yang kita bangun di Salesforce. Dalam sistem bisnis, tekanannya biasanya justru ke arah sebaliknya: kita jauh lebih mungkin mundur dari bentuk normal ketiga, demi pengguna, pelaporan, dan kinerja, daripada melampauinya. Itu modul berikutnya. Ketahuilah bahwa bentuk-bentuk lanjutan itu ada, tetapi untuk sebagian besar pekerjaan kita, 1NF hingga 3NF memberi kita alat berpikir yang kita butuhkan.

Inilah posisi saya. Ketika saya berusaha memahami sebuah bisnis dan merancang model logisnya, saya ingin memulai dengan bersih: fakta pengiriman bersama pengiriman, fakta pusat distribusi bersama DC, fakta truk bersama truk, konsep yang berulang dimodelkan sebagai konsep. Saya tidak ingin sebuah fakta bisnis disalin ke seluruh model hanya karena mungkin membuat sebuah layar atau laporan lebih mudah. Belum.

Tetapi normalisasi bukan agama. Tujuannya bukan model yang paling murni secara akademis. Saya pernah melihat arsitek begitu terpaku pada kemurnian sampai modelnya menyiksa bagi semua orang yang harus memakainya. Kita tidak sedang berusaha memenangkan lomba normalisasi; kita sedang membangun sebuah sistem, dan sistem itu punya pengguna, laporan, integrasi, kebutuhan kinerja, skala, dan, semakin sering, AI yang membaca datanya. Semua itu mungkin menginginkan data dalam bentuk yang berbeda.

Jadi titik awal saya adalah rancang hingga Bentuk Normal Ketiga jika memungkinkan, lalu mundur sedikit jika perlu: pahami dulu di mana setiap fakta seharusnya berada. Lalu, jika kita akan menyimpang darinya, saya ingin tahu alasannya. Jika jawabannya “karena saya tidak tahu harus menaruh bidang itu di mana lagi,” itu tidak cukup baik. Jika jawabannya “kami sengaja menyalin nilai ini karena membuat scorecard mitra menjadi sederhana, dan kami punya cara yang andal untuk menjaganya tetap sinkron,” barulah kita sedang melakukan percakapan arsitektur.

Saat menormalisasi model logis, saya mencari:

  • Nilai atau struktur berulang yang seharusnya dimodelkan secara terpisah.
  • Atribut yang menggambarkan entitas yang berbeda dari entitas tempat atribut itu disimpan.
  • Fakta yang diduplikasi tanpa perlu di banyak rekaman, dan ketergantungan yang membuatnya menjadi tidak konsisten.
  • Konsep bisnis yang tersembunyi di dalam bidang.
  • Model yang bersih yang mewakili kebenaran sebelum ada kompromi implementasi apa pun.

Bukan karena setiap sistem fisik harus tetap ternormalisasi sempurna. Justru sebaliknya. Di modul berikutnya kita akan sengaja menyimpang dari model yang bersih, demi pengguna, pelaporan, skala, analitik, dan AI, dan kita akan melakukannya dengan tahu persis apa yang kita pertukarkan.