Apa perbedaan antara hubungan yang mengidentifikasi dan yang tidak mengidentifikasi?


800

Saya belum dapat sepenuhnya memahami perbedaan. Bisakah Anda menggambarkan kedua konsep dan menggunakan contoh dunia nyata?


11
jawaban atas pertanyaan ini sangat membingungkan sehingga tidak lucu
Dennis

Pertanyaan bagus, roda tidak dapat diciptakan kembali: Peter Chen. Entity Relationship Model, Menuju Unified View of Data, 1976 § 2.3.2: " Jika hubungan digunakan untuk mengidentifikasi entitas, kita akan menyebutnya hubungan entitas yang lemah. Jika hubungan tidak digunakan untuk mengidentifikasi entitas, kita akan memanggil sebuah hubungan entitas biasa ". Pertanyaan OP bermuara pada: Apa hubungan entitas yang lemah / teratur? .
mnt

Jawaban:


1063
  • Hubungan yang mengidentifikasi adalah ketika keberadaan baris di tabel anak tergantung pada baris di tabel induk. Ini mungkin membingungkan karena ini adalah praktik yang umum hari ini untuk membuat pseudokey untuk tabel anak, tetapi tidak membuat kunci asing ke bagian induk dari kunci utama anak. Secara formal, cara "benar" untuk melakukan ini adalah menjadikan kunci asing bagian dari kunci primer anak. Tetapi hubungan logisnya adalah bahwa anak itu tidak dapat ada tanpa orangtua.

    Contoh: A Personmemiliki satu atau lebih nomor telepon. Jika mereka hanya memiliki satu nomor telepon, kita bisa menyimpannya di kolom Person. Karena kami ingin mendukung beberapa nomor telepon, kami membuat tabel kedua PhoneNumbers, yang kunci utamanya mencakup person_idreferensi Persontabel.

    Kita mungkin menganggap nomor telepon milik seseorang, meskipun mereka dimodelkan sebagai atribut dari tabel yang terpisah. Ini adalah petunjuk kuat bahwa ini adalah hubungan yang mengidentifikasi (bahkan jika kita tidak benar-benar memasukkan person_idkunci utama PhoneNumbers).

  • Hubungan yang tidak mengidentifikasi adalah ketika atribut kunci utama orang tua tidak boleh menjadi atribut kunci primer anak. Contoh yang baik dari ini adalah tabel pencarian, seperti kunci asing pada Person.statereferensi kunci utama States.state. Personadalah meja anak sehubungan dengan States. Tetapi baris dalam Persontidak diidentifikasi oleh stateatributnya. Yaitu statebukan bagian dari kunci utama Person.

    Hubungan yang tidak mengidentifikasi dapat bersifat opsional atau wajib , yang berarti kolom kunci asing masing-masing memungkinkan NULL atau melarang NULL.


Lihat juga jawaban saya untuk Masih Bingung Tentang Mengidentifikasi vs Hubungan Tidak Mengidentifikasi


9
+1: Bill, "hari ini merupakan praktik umum untuk membuat pseudokey untuk tabel anak, tetapi tidak menjadikan kunci asing ke bagian induk dari kunci utama anak" - ada tautan mengapa ini terjadi? Google mengecewakan saya.
hobodave

17
Sepertinya "benar" membangun hubungan identifikasi akan mengarah pada kunci utama besar yang menjengkelkan. mis. Bangunan memiliki Lantai, Kamar memiliki Tempat Tidur. PK untuk Tempat Tidur adalah (bed_id, floor_id, room_id, building_id). Rasanya aneh bahwa saya belum pernah melihat ini dalam praktek, atau mendengarnya menyarankan sebagai cara untuk melakukan apa pun. Itu banyak data yang berlebihan di PK.
hobodave

24
@obodave: Saya telah melihat kunci primer multi-kolom yang bahkan lebih besar. Tapi saya mengerti maksud Anda. Pertimbangkan bahwa kunci utama multi-kolom menyampaikan lebih banyak informasi; Anda dapat query Bedstabel untuk semua tempat tidur di sebuah bangunan tertentu tanpa melakukan apa pun bergabung.
Bill Karwin

2
@Eugene, ya saya berharap itu menjadi hubungan yang tidak mengidentifikasi. user_idharus menjadi kunci utama dengan sendirinya, dan updated_bybukan bagian dari kunci utama multi-kolom.
Bill Karwin

4
Saya tidak akan pernah menggunakan ini untuk memodelkan itu. Jawaban terbaik adalah dari "aqsa rao" di bawah ini yang menyatakan sebagai berikut: "Hubungan identifikasi berarti bahwa tabel anak tidak dapat diidentifikasi secara unik tanpa orangtua." Karena definisi Anda menambahkan semantik yang tidak perlu yang dapat membingungkan orang. Ini bukan ketergantungan antara entitas alasan Anda membuat hubungan yang mengidentifikasi atau tidak mengidentifikasi.
Sebastian

888

Ada penjelasan lain dari dunia nyata:

Buku milik pemilik, dan pemilik dapat memiliki banyak buku. Tapi, buku itu bisa ada juga tanpa pemiliknya, dan kepemilikannya bisa berubah dari satu pemilik ke pemilik lainnya. Hubungan antara buku dan pemilik adalah hubungan yang tidak mengidentifikasi.

Namun, sebuah buku ditulis oleh seorang penulis, dan si penulis bisa saja menulis banyak buku. Tapi, buku itu perlu ditulis oleh seorang penulis - buku itu tidak akan ada tanpa penulis. Oleh karena itu, hubungan antara buku dan penulis adalah hubungan yang mengidentifikasi.


2
Sebuah penjelasan yang layak tetapi saya percaya ini juga berguna untuk memperluas contoh sedikit. Sebuah buku memiliki sejumlah halaman. Itu tidak dapat ada tanpa halaman dan oleh karena itu kita dapat menyimpulkan bahwa hubungan antara buku dan jumlah halaman yang dimilikinya juga merupakan hubungan yang mengidentifikasi. Tetapi apakah jumlah atribut halaman akan menjadi bagian dari skema identifikasi (kunci) untuk buku ini? Mungkin tidak. Istilah "mengidentifikasi hubungan" biasanya disediakan untuk hubungan yang melibatkan atribut pengidentifikasi - atribut utama dalam istilah relasional.
nvogel

13
Apa yang terjadi jika buku itu ditulis oleh lebih dari 1 penulis? Itu tidak mengidentifikasi hubungan lagi sebagai tipe M: N, mengapa?
NGix

2
Contoh nyata ini tidak berguna. Ketika Anda menyadari bagaimana Anda membuat tabel di ER dan bagaimana integritas data akan berlaku, Anda kemudian membuang contoh-contoh ini. Jika Anda membuat hubungan yang kuat antara dua entitas, Anda dipaksa untuk membuat kunci utama di tabel entitas yang dikombinasikan dengan PK dari entitas lain. Jika model Anda memungkinkan Anda bahwa buku yang sama dapat memiliki banyak penulis, maka boleh saja menjadi kuat. Tetapi jika model Anda hanya memungkinkan Anda 1 penulis 1 buku, Anda tidak dapat memiliki kendala menggunakan hubungan yang kuat karena PK(Book.id, Book.person_id).
Sebastian

2
tetapi penggunaan sebenarnya adalah "dapatkah buku ada tanpa penulis?". Jawabannya adalah ya dalam kenyataan, karena orang akan mencari buku itu secara langsung. Karena itu dalam praktiknya, untuk kasus ini, mereka harus selalu menjadi "hubungan yang tidak mengidentifikasi".
windmaomao

3
apa yang terjadi kawan !!, ini bukan contoh yang valid untuk the Identifying relationship !!! ya sebuah buku tidak dapat ditulis tanpa penulis tetapi, bidang penulis di tabel buku TIDAK MENGIDENTIFIKASI baris buku !!!
Akuntan م

33

Jawaban Bill benar, tetapi mengejutkan melihat bahwa di antara semua jawaban lain tidak ada yang menunjukkan aspek yang paling signifikan.

Dikatakan berulang-ulang, bahwa dalam dan mengidentifikasi hubungan anak tidak akan ada tanpa orangtua. (mis. user287724 ). Ini benar, tetapi sepenuhnya melenceng. Akan cukup bagi kunci asing untuk menjadi non-nol untuk mencapai ini. Tidak perlu menjadi bagian dari kunci utama.

Jadi inilah alasan sebenarnya:

Tujuan dari hubungan identifikasi adalah bahwa kunci asing tidak PERNAH MENGUBAH , karena itu adalah bagian dari kunci utama ... karena itu mengidentifikasi !!!


2
+1 untuk "Ini akan cukup untuk kunci asing menjadi nol, untuk mencapai ini." Ini harus cukup, tapi sayangnya itu tidak ketika datang ke sesuatu seperti Entity Framework, yang tidak bekerja dengan baik kecuali jika Anda menggunakan hubungan mengidentifikasi, tapi kemudian "Id" bidang entitas kehilangan keunikan itu sebagai akibat dari menjadi hanya bagian dari kunci komposit.
Triynko

25

Hubungan Mengidentifikasi menentukan bahwa objek anak tidak dapat ada tanpa objek induk

Hubungan yang tidak mengidentifikasi menentukan hubungan teratur antara objek, 1: 1 atau 1: n kardinalitas.

Hubungan yang tidak mengidentifikasi dapat ditentukan sebagai opsional di mana orang tua tidak diperlukan atau wajib di mana orang tua diperlukan dengan mengatur kardinalitas tabel induk ...


6
Ini kedengarannya lebih seperti deskripsi dari partisipasi total dalam suatu hubungan, daripada hubungan identifikasi.
Thomas Padron-McCarthy

1
Anda benar-benar bersaing dengan seorang pria yang memiliki reputasi 218 ribu. Hanya melempar itu ke luar karena kalian berdua pasti tahu lebih banyak daripada aku.
Marc DiMillo

Saya tidak setuju dengan definisi di atas. Anda mungkin memiliki objek yang bergantung pada induknya dan Anda ingin objek itu dibatasi hanya untuk dihubungkan dengan 1 baris induk. A Housememiliki Walls. Anda menghapus rumah dan Anda tidak punya dinding. Tapi tembok hanya milik rumah. Jadi melakukan hubungan yang kuat tidak akan berhasil: PK(Wall.id, House.id)akan memungkinkan Anda untuk memasukkan ke dalam model dinding yang sama ke rumah lain.
Sebastian

15

Berikut deskripsi yang bagus:

Hubungan antara dua entitas dapat diklasifikasikan sebagai "mengidentifikasi" atau "tidak mengidentifikasi". Identifikasi hubungan ada ketika kunci utama entitas induk dimasukkan dalam kunci utama entitas anak. Di sisi lain, hubungan non-identifikasi ada ketika kunci utama entitas induk dimasukkan dalam entitas anak tetapi bukan sebagai bagian dari kunci primer entitas anak. Selain itu, hubungan yang tidak mengidentifikasi lebih lanjut dapat diklasifikasikan sebagai "wajib" atau "tidak wajib". Hubungan wajib mengidentifikasi tidak ada ketika nilai dalam tabel anak tidak bisa nol. Di sisi lain, hubungan non-wajib non-wajib ada ketika nilai dalam tabel anak bisa nol.

http://www.sqlteam.com/article/database-design-and-modeling-fundamentals

Berikut adalah contoh sederhana dari hubungan identifikasi:

Parent
------
ID (PK)
Name

Child
-----
ID (PK)
ParentID (PK, FK to Parent.ID) -- notice PK
Name

Berikut ini adalah hubungan yang tidak mengidentifikasi:

Parent
------
ID (PK)
Name

Child
-----
ID (PK)
ParentID (FK to Parent.ID) -- notice no PK
Name

1
Jawaban Anda bertentangan dengan yang diberikan oleh Bill Karwin, dalam perbedaan antara apakah Kunci Asing "bukan" atau "tidak boleh" menjadi bagian dari Kunci Utama di baris Anak.
Nicole

@Andy White Tapi bisakah kunci primer dari orang tua dalam hubungan identifikasi menjadi tidak wajib, yaitu, null, ketika itu merupakan bagian dari kunci primer komposit tiga kolom?
Frederik Krautwald

10

jawaban user287724 memberikan contoh hubungan buku dan penulis berikut:

Namun sebuah buku ditulis oleh seorang penulis, dan penulis dapat menulis banyak buku. Tetapi buku itu harus ditulis oleh seorang pengarang. Buku itu tidak bisa ada tanpa seorang pengarang. Oleh karena itu hubungan antara buku dan penulis adalah hubungan yang mengidentifikasi.

Ini adalah contoh yang sangat membingungkan dan jelas bukan contoh yang valid untuk identifying relationship.

Ya, booktidak dapat ditulis tanpa setidaknya satu author, tetapi author(itu kunci asing) dari bookyang tidak MENGIDENTIFIKASI yang bookdi booksmeja!

Anda dapat menghapus author(FK) dari bookbaris dan masih dapat mengidentifikasi baris buku oleh beberapa bidang lain ( ISBN, ID, ... dll), TAPI TIDAK penulis buku !!

Saya pikir contoh yang valid identifying relationshipakan hubungan antara (tabel produk) dan (tabel detail produk tertentu)1:1

products table
+------+---------------+-------+--------+
|id(PK)|Name           |type   |amount  |
+------+---------------+-------+--------+
|0     |hp-laser-510   |printer|1000    |
+------+---------------+-------+--------+
|1     |viewsonic-10   |screen |900     |
+------+---------------+-------+--------+
|2     |canon-laser-100|printer|200     |
+------+---------------+-------+--------+

printers_details table
+--------------+------------+---------+---------+------+
|Product_ID(FK)|manufacturer|cartridge|color    |papers|
+--------------+------------+---------+---------+------+
|0             |hp          |CE210    |BLACK    |300   |
+--------------+------------+---------+---------+------+
|2             |canon       |MKJ5     |COLOR    |900   |
+--------------+------------+---------+---------+------+
* please note this is not real data

Dalam contoh ini, Product_IDdalam printers_detailstabel dianggap sebagai FK referensi products.idtabel dan JUGA PK dalam printers_detailstabel, ini adalah hubungan identifikasi karena Product_ID(FK) di tabel printer MENGIDENTIFIKASI baris di dalam tabel anak, kami tidak dapat menghapus yang product_iddari tabel anak karena kita tidak dapat mengidentifikasi baris lagi karena kami kehilangan itu kunci utama

Jika Anda ingin memasukkannya ke dalam 2 baris:

hubungan yang mengidentifikasi adalah hubungan ketika FK dalam tabel anak dianggap sebagai PK (atau pengidentifikasi) di tabel anak sementara masih referensi tabel induk

Contoh lain mungkin ketika Anda memiliki 3 tabel (impor - produk - negara) dalam impor dan ekspor untuk beberapa basis data negara

The importmeja adalah anak yang memiliki bidang ini (yang product_id(FK), yang country_id(FK), jumlah impor, harga, unit diimpor, cara transportasi (udara, laut)) we may use the (product_id , thecountry_id`) untuk mengidentifikasi setiap deretan impor "jika semuanya pada tahun yang sama" di sini kedua kolom dapat menyusun bersama kunci utama dalam tabel anak (impor) dan juga merujuk pada tabel induknya.

Tolong saya senang saya akhirnya memahami konsep identifying relationshipdan non identifying relationship, jadi tolong jangan katakan saya salah dengan semua suara ini untuk contoh yang benar - benar tidak valid

Ya, secara logis sebuah buku tidak dapat ditulis tanpa penulis, tetapi sebuah buku dapat diidentifikasi tanpa penulis, Bahkan tidak dapat diidentifikasi dengan penulis!

Anda dapat 100% menghapus penulis dari deretan buku dan masih dapat mengidentifikasi buku! .


5
Anda benar, jika Anda hanya memiliki buku tabel dan penulis. Tidak ada hubungan identifikasi di sana. Tetapi jika Anda menggunakan tabel ketiga untuk mewakili hubungan banyak-ke-banyak, kunci utama dari tabel ketiga itu terdiri dari dua kunci asing, referensi tabel buku dan tabel penulis. Tabel itu memiliki hubungan identifikasi dengan buku dan penulis. Lihat contoh saya di stackoverflow.com/questions/2814469/…
Bill Karwin

8

Hubungan yang tidak mengidentifikasi

Hubungan yang tidak mengidentifikasi berarti bahwa seorang anak terkait dengan orang tua tetapi dapat diidentifikasi sendiri.

PERSON    ACCOUNT
======    =======
pk(id)    pk(id)
name      fk(person_id)
          balance

Hubungan antara ACCOUNT dan PERSON tidak mengidentifikasi.

Mengidentifikasi hubungan

Hubungan yang mengidentifikasi berarti bahwa orang tua diperlukan untuk memberikan identitas kepada anak. Anak semata-mata ada karena orangtua.

Ini berarti bahwa kunci asing juga merupakan kunci utama.

ITEM      LANGUAGE    ITEM_LANG
====      ========    =========
pk(id)    pk(id)      pk(fk(item_id))
name      name        pk(fk(lang_id))
                      name

Hubungan antara ITEM_LANG dan ITEM mengidentifikasi. Dan antara ITEM_LANG dan LANGUAGE juga.


2
Bagaimana PERSON dan ACCOUNT tidak mengidentifikasi? Bagaimana ACCOUNT ada tanpa ORANG?
MrRobot9

mengapa tidak ada jawaban untuk komentar sebelumnya? @ MrRobot9
AAEM

4

Jika Anda menganggap bahwa item anak harus dihapus ketika orang tua dihapus, maka itu adalah hubungan yang mengidentifikasi.

Jika item anak harus disimpan meskipun orang tua dihapus, maka itu adalah hubungan yang tidak mengidentifikasi.

Sebagai contoh, saya memiliki database pelatihan dengan peserta pelatihan, pelatihan, diploma dan pelatihan:

  • peserta pelatihan memiliki hubungan identifikasi dengan sesi pelatihan
  • pelatihan memiliki hubungan identifikasi dengan sesi pelatihan
  • tetapi peserta pelatihan memiliki hubungan yang tidak mengidentifikasi dengan ijazah

Hanya sesi pelatihan yang harus dihapus jika salah satu peserta pelatihan, pelatihan atau diploma terkait dihapus.


3

Hubungan yang teridentifikasi berarti entitas anak sepenuhnya tergantung pada keberadaan entitas induk. Contoh tabel akun orang dan akun orang. Tabel akun orang diidentifikasi oleh keberadaan akun dan tabel orang saja.

Hubungan non pengidentifikasian berarti tabel anak tidak diidentifikasi oleh keberadaan tabel induk misalnya ada tabel sebagai tipe akun dan tabel akun. Tipe akun tidak diidentifikasi dengan keberadaan tabel akun.


2

Seperti dijelaskan dengan baik di tautan di bawah ini, hubungan identifikasi agak seperti hubungan tipe entitas yang lemah dengan induknya dalam model konseptual ER. CAD gaya UML untuk pemodelan data tidak menggunakan simbol atau konsep ER, dan jenis hubungannya adalah: mengidentifikasi, tidak mengidentifikasi, dan tidak spesifik.

Yang mengidentifikasi adalah hubungan orang tua / anak di mana anak adalah semacam entitas yang lemah (bahkan pada model ER tradisional yang disebutnya mengidentifikasi hubungan), yang tidak memiliki kunci primer nyata dengan atributnya sendiri dan oleh karena itu tidak dapat diidentifikasi secara unik oleh miliknya sendiri. . Setiap akses ke tabel anak, pada model fisik, akan tergantung (termasuk secara semantik) pada kunci utama orang tua, yang berubah menjadi bagian atau total kunci primer anak (juga menjadi kunci asing), umumnya menghasilkan kunci komposit di sisi anak. Kunci anak yang ada pada akhirnya itu sendiri hanya pseudo atau kunci parsial, tidak cukup untuk mengidentifikasi setiap instance dari tipe Entitas atau Entitas Set tersebut, tanpa PK orang tua.

Hubungan non-identifikasi adalah hubungan biasa (parsial atau total), dari set entitas yang sepenuhnya independen, yang instansnya tidak bergantung pada kunci utama masing-masing untuk diidentifikasi secara unik, meskipun mereka mungkin memerlukan kunci asing untuk hubungan parsial atau total, tetapi tidak sebagai kunci utama anak. Anak memiliki kunci utama sendiri. Idem induk. Keduanya mandiri. Tergantung pada kardinalitas hubungan, PK satu berjalan sebagai FK ke yang lain (sisi N), dan jika parsial, bisa nol, jika total, harus tidak nol. Tetapi, pada hubungan seperti ini, FK tidak akan pernah juga menjadi PK dari anak, seperti ketika hubungan identifikasi adalah kasusnya.

http://docwiki.embarcadero.com/ERStudioDA/XE7/en/Creating_and_Editing_Relationships


2

Do atribut bermigrasi dari orang tua untuk membantu anak mengidentifikasi 1 anak?

  • Jika ya : ketergantungan identifikasi ada, hubungan itu mengidentifikasi dan entitas anak "lemah".
  • Jika tidak : ketergantungan identifikasi tidak ada, hubungannya tidak mengidentifikasi dan entitas anak "kuat".

Perhatikan bahwa ketergantungan-identifikasi menyiratkan ketergantungan-keberadaan, tetapi tidak sebaliknya. Setiap non-NULL FK berarti seorang anak tidak dapat ada tanpa orang tua, tetapi itu saja tidak membuat hubungan mengidentifikasi.

Untuk lebih lanjut tentang ini (dan beberapa contoh), lihat bagian "Mengidentifikasi Hubungan" pada Panduan Metode ERwin .

PS Saya menyadari bahwa saya (sangat) terlambat ke pesta, tetapi saya merasa jawaban lain tidak sepenuhnya akurat (mendefinisikannya dalam hal ketergantungan-keberadaan alih-alih identifikasi-ketergantungan), atau agak berkelok-kelok. Semoga jawaban ini memberikan lebih banyak kejelasan ...


1 FK anak merupakan bagian dari KUNCI UTAMA anak atau kendala UNIK (non-NULL).


1

Contoh yang baik datang dari pemrosesan pesanan. Pesanan dari pelanggan biasanya memiliki Nomor Pesanan yang mengidentifikasi pesanan, beberapa data yang terjadi satu kali per pesanan seperti tanggal pesanan dan ID Pelanggan, dan serangkaian item baris. Setiap item baris berisi nomor item yang mengidentifikasi item baris dalam pesanan, produk yang dipesan, jumlah produk itu, harga produk, dan jumlah untuk item baris, yang dapat dihitung dengan mengalikan kuantitas dengan harga.

Nomor yang mengidentifikasi item baris hanya mengidentifikasinya dalam konteks satu urutan. Item baris pertama dalam setiap pesanan adalah nomor item "1". Identitas lengkap item baris adalah nomor item bersama dengan nomor urut yang merupakan bagiannya.

Hubungan anak induk antara pesanan dan item baris karenanya merupakan hubungan yang mengidentifikasi. Konsep yang terkait erat dalam pemodelan ER disebut dengan nama "subentity", di mana item baris adalah subentitas pesanan. Biasanya, subentity memiliki hubungan wajib identitas anak-orangtua dengan entitas yang menjadi bawahannya.

Dalam desain database klasik, kunci utama tabel LineItems adalah (OrderNumber, ItemNumber). Beberapa desainer saat ini akan memberikan item ItemID terpisah, yang berfungsi sebagai kunci utama, dan ditambahkan secara otomatis oleh DBMS. Saya merekomendasikan desain klasik dalam hal ini.


0

Katakanlah kita memiliki tabel itu:

user
--------
id
name


comments
------------
comment_id
user_id
text

hubungan antara kedua tabel tersebut akan mengidentifikasi hubungan. Karena, komentar hanya bisa menjadi milik pemiliknya, bukan pengguna lain. sebagai contoh. Setiap pengguna memiliki komentar sendiri, dan ketika pengguna dihapus, komentar pengguna ini juga harus dihapus.


0

Hubungan mengidentifikasi adalah antara dua entitas yang kuat. Hubungan yang tidak mengidentifikasi mungkin tidak selalu merupakan hubungan antara entitas yang kuat dan entitas yang lemah. Mungkin ada situasi di mana seorang anak itu sendiri memiliki kunci utama tetapi keberadaan entitasnya dapat bergantung pada entitas induknya.

Misalnya: hubungan antara penjual dan buku tempat buku dijual oleh penjual mungkin ada di mana penjual mungkin memiliki kunci utama sendiri tetapi entitasnya dibuat hanya ketika buku dijual

Referensi berdasarkan Bill Karwin


5
Mungkin membantu untuk mendefinisikan apa yang Anda maksud dengan entitas "kuat" dan "lemah" di sini.
nullability
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.