Jika tabel dengan kunci pengganti memiliki kolom yang diketahui memiliki nilai bukan nol yang unik (mis. SSN), apakah itu melanggar 3NF?

8

Seperti yang saya pahami, bentuk normal ketiga (3NF) pada dasarnya berarti harus ada tepat satu kunci.

Jika tabel dengan mengatakan idkolom kenaikan otomatis juga memiliki kolom yang dikenal unik dan bukan nol, misalnya nomor jaminan sosial, kolom lain ini dapat digunakan sebagai kunci.

Mengabaikan masalah-masalah praktis / bisnis (misalnya risiko lingkungan / privasi ketika melewati SSN sebagai kunci / FK), dari aspek desain skema yang ketat, akankah tabel seperti itu tidak berada di 3NF karena ada 2 kunci yang efektif?

Apakah jawabannya bervariasi pada apakah ada kunci unik di kolom lain? Jika demikian, mengapa?

Orang Bohemian
sumber

Jawaban:

8

Relasi R berada dalam bentuk normal ketiga jika setiap atribut non-prime R tidak bergantung secara transitif pada setiap kunci kandidat R

EFCodd, 1971, Normalisasi Lebih Lanjut dari Model Relasional Basis Data

Tersirat dalam definisi relasi bahwa relasi harus memiliki setidaknya satu kunci. Tidak ada apa pun tentang 3NF atau Formulir Normal lainnya yang mengharuskan relasi hanya memiliki satu kunci.

Sayangnya buku tentang desain dan normalisasi database memiliki banyak contoh hubungan dengan hanya satu kunci dan lebih sedikit contoh dengan lebih dari satu kunci. Ini menurut saya aneh mengingat beberapa kunci tampaknya menjadi praktik yang sangat umum akhir-akhir ini. Kelangkaan contoh-contoh praktis dalam literatur non-akademik tampaknya menjadi salah satu penyebab kebingungan tentang peran kunci dalam desain database. Penyebab lain kebingungan adalah mnemonik populer "tidak lain adalah kunci". Frasa itu biasanya dikaitkan dengan Bill Kent tetapi itu bukan definisi yang akurat dari 3NF.

nvogel
sumber
3

Karena pertanyaan didasarkan pada interpretasi aturan, pertama-tama kita harus melihat informasi terkait itu, yaitu (penekanan milikku):

  1. semua atribut dalam tabel ditentukan hanya oleh kunci kandidat dari tabel itu dan bukan oleh atribut non-prima.

Saya pikir kebingungan adalah hasil dari salah menafsirkan istilah "kunci kandidat". Mungkin ada beberapa kunci kandidat dalam tabel. Inilah sebabnya kami memiliki istilah pengubah untuk lebih menentukan di antara grup ini: Utama dan Alternatif. Jika tabel dapat memiliki satu, dan hanya satu, kunci, maka istilah "Primary" Key akan menyesatkan dan seharusnya disebut sesuatu yang lain (mungkin "Induk" atau "Asal" atau "Identifikasi", dll). Tetapi "Primer" menyiratkan bahwa mungkin ada kunci "sekunder", dan itu disebut kunci "Alternatif".

Kunci alternatif ditunjukkan dalam model fisik melalui Batasan Unik atau Indeks Unik. Juga harus dicatat bahwa kedua jenis Kunci Kandidat (Utama dan Alternatif), dapat dirujuk oleh Kunci Asing (meskipun seseorang umumnya tidak / tidak seharusnya melakukan hal seperti itu tanpa alasan yang sangat bagus!).

Apakah jawabannya bervariasi pada apakah ada kunci unik di kolom lain? Jika demikian, mengapa?

Tidak, karena itu adalah masalah pemodelan fisik vs logis. Anda bisa memiliki tabel yang memiliki IDENTITYbidang tetapi belum ada Kunci Utama yang ditentukan. Tabel dan datanya dapat dengan mudah di 3NF, bahkan jika model fisik tidak memberlakukannya. Perbedaan ini mirip dengan apakah Kunci Asing didefinisikan atau tidak. Anda pasti dapat BERGABUNG dengan tabel, dan tidak memiliki catatan yatim, apakah ada PK / FK yang ditentukan. Dan data dapat 100% benar tanpa konstruksi tersebut. Tetapi mendefinisikan PK dan FK adalah perbedaan antara Integritas Referensial (logis) dan Integritas Referensi Deklaratif (fisik). Memiliki kendala dalam model fisik hanya membantu menegakkan aturan model logis.


Berkenaan dengan SSN (" Nomor Jaminan Sosial " bagi mereka yang tidak terbiasa dengan akronim itu), dan itu menjadi Kunci Alternatif, dan memiliki Indeks / Kendala Unik di atasnya:

Saya akan merekomendasikan untuk tidak mempertimbangkan SSN sebagai Kunci Alternatif dan menempatkan Batasan atau Indeks Unik di atasnya, bahkan jika itu biasa dilakukan (SSN sering dianggap sebagai Kunci "Alami" - kunci yang ada di dunia nyata) . Ada dua alasan utama:

  1. Akurasi: Sebagian besar waktu, nilai-nilai ini dimasukkan ke dalam sistem oleh seseorang yang mengisi formulir, baik di atas kertas atau online. Orang-orang membuat kesalahan saat melakukan entri data sepanjang waktu, terutama jika sumbernya adalah formulir kertas yang sedang dimasukkan oleh seseorang yang sedang membaca tulisan tangan orang lain yang ceroboh (seperti milik saya, yang nyaris tidak terbaca).

    Bahkan jika data berasal dari sistem lain, dapatkah Anda yakin bahwa sistem sumber memvalidasi info? Bisakah Anda yakin tidak ada bug dalam ekspor data mereka? Bagaimana jika ada bug dalam impor data Anda?

  2. Keunikan: Sekalipun Administrasi Jaminan Sosial utama tidak pernah mengeluarkan duplikat ID, itu tidak berarti bahwa duplikasi belum terjadi. Di luar masalah pencurian identitas, saya ingat pernah mendengar dari seseorang bertahun-tahun yang lalu yang bekerja sebagai DBA untuk Departemen Pendapatan negara bagian (saya percaya) dan yang harus berurusan dengan tunjangan Jaminan Sosial, bagaimana mereka mengalami "masalah" berurusan dengan apa yang merupakan praktik yang lebih tua untuk menugaskan kembali SSN orang yang meninggal ke pasangan yang selamat (biasanya janda) sehingga lebih mudah bagi pasangan yang masih hidup untuk terus mengumpulkan pembayaran tunjangan. Saya yakin praktik ini berakhir beberapa saat yang lalu, tetapi data "duplikat" masih ada di sistem.
Solomon Rutzky
sumber
3

Seperti yang saya pahami, bentuk normal ketiga (3NF) pada dasarnya berarti harus ada tepat satu kunci.

2NF, 3NF, dan Boyce Codd Normal Form (BCNF) berurusan dengan dependensi fungsional . Tabel di 2NF berarti tidak ada dependensi kunci parsial di mana kolom non-kunci tergantung pada beberapa subset yang tepat dari kunci multi-kolom. Tabel seperti yang ada dalam contoh kita sudah ada di 2NF karena setiap kunci kandidat adalah satu kolom. Tabel dalam 3NF berarti setiap kolom non-kunci juga tidak secara fungsional bergantung pada beberapa kolom non-kunci lainnya, dan dengan demikian menciptakan ketergantungan transitif. Tidak masalah jika ada satu atau seratus kunci kandidat. Sebenarnya itu adalah BCNF, bukan 3NF, yang merupakan bentuk normal "final" berkenaan dengan ketergantungan fungsional. Ini karena sebuah tabel bisa di 3NF namun tidak di BCNF karena mungkin ada beberapa kunci kandidat yang tumpang tindih. Jadi, ketika kita menggunakan istilah 3NF untuk berarti "sepenuhnya dinormalisasi" sehubungan dengan dependensi fungsional, yang kita maksud sebenarnya adalah BCNF.

Jika tabel dengan mengatakan kolom id kenaikan otomatis juga memiliki kolom yang dikenal unik dan bukan nol, misalnya nomor jaminan sosial, kolom lain ini dapat digunakan sebagai kunci.

Tidak hanya itu, harus jika kita ingin memastikan data yang disimpan dalam database tetap konsisten dengan aturan yang telah kita identifikasi di dunia nyata!

Mengabaikan masalah-masalah praktis / bisnis (misalnya risiko lingkungan / privasi ketika melewati SSN sebagai kunci / FK), dari aspek desain skema yang ketat, akankah tabel seperti itu tidak berada di 3NF karena ada 2 kunci yang efektif?

Seperti dijelaskan di atas, apakah tabelnya ada dalam 3NF (atau lebih penting BCNF) adalah ortogonal terhadap berapa banyak kunci kandidat yang dikandungnya.

Apakah jawabannya bervariasi pada apakah ada kunci unik di kolom lain? Jika demikian, mengapa?

Tidak, hanya karena menentukan apakah tabelnya ada atau tidak dalam 3NF tidak ada hubungannya dengan berapa banyak kunci kandidat yang dimilikinya. Alih-alih, semuanya terkait dengan memastikan semua kolom non-kunci sepenuhnya berfungsi tergantung pada kunci kandidat tersebut.

Tapi ini tidak memunculkan hal yang menarik. Perhatikan bahwa kunci unik ketika didefinisikan sebagai kendala dalam DBMS tidak sama dengan pengidentifikasi unik yang didefinisikan sebagai aturan bisnis dalam model bisnis konseptual. Mungkin di dunia kita, kita selalu tahu SSN seseorang dan karenanya berfungsi sebagai kunci kandidat untuk seseorang, dan mungkin kita juga memperkenalkan kunci pengganti dalam skema logis yang kita sebut Person Id . Model bisnis kami mencakup aturan yang menyatakan bahwa SSN adalah pengidentifikasi unik untuk seseorang di dunia kita. Ini menyiratkan ketergantungan fungsionaldari semua atribut deskriptif pada atribut identitas ini. Aturan ini tidak berubah hanya karena kami lupa atau memilih untuk tidak memberi tahu DBMS. Inilah sebabnya mengapa sangat penting kendala dinyatakan - sehingga DBMS dapat memastikan data yang disimpan konsisten dengan aturan model bisnis! Jika kami tidak membuat batasan unik pada SSN, kami sekarang dapat secara tidak sengaja membuat lebih dari satu baris untuk orang yang sama dengan SSN yang sama; setiap baris memiliki Id Orang yang berbeda!

Primer yang sangat baik pada topik ini adalah Seri Yayasan Basis Data Praktis Fabian Pascal dan Desain Basis Data Chris Date dan Teori Relasional , dari mana jawaban ini diperoleh. Sementara setiap makalah dari Fabian's harus dibaca, makalah # 1 (yang jelas mendefinisikan perbedaan antara tingkat konseptual, logis, dan fisik) dan kertas # 4 (yang jelas mendefinisikan berbagai jenis kunci) secara khusus membahas pertanyaan ini. Demikian juga, seluruh buku Chris adalah harus dibaca sementara Bagian II adalah bagian yang ditujukan untuk normalisasi sehubungan dengan ketergantungan fungsional.

Todd Everett
sumber