Perbedaan antara hubungan satu-ke-banyak dan banyak-ke-satu


117

Apa perbedaan nyata antara hubungan satu-ke-banyak dan banyak-ke-satu? Itu hanya terbalik, jenis?

Saya tidak dapat menemukan tutorial 'baik-dan-mudah-dipahami' tentang topik ini selain yang ini: SQL untuk Pemula: Bagian 3 - Hubungan Database


1
Ini adalah penjelasan yang sempurna: en.wikipedia.org/wiki/Many-to-many_(data_model)
RobertPitt

@RobertPitt bagaimana artikel many-to-many relevan dengan pertanyaan? Anda mungkin lebih bermaksud en.wikipedia.org/wiki/One-to-many_(data_model)
TMG

Jawaban:


111

Ya, itu sebaliknya. Itu tergantung pada sisi hubungan mana entitas itu berada.

Misalnya, jika satu departemen dapat mempekerjakan beberapa karyawan, maka departemen ke karyawan adalah hubungan one to many (1 departemen mempekerjakan banyak karyawan), sedangkan hubungan karyawan ke departemen adalah banyak dengan satu (banyak karyawan bekerja di satu departemen).

Info lebih lanjut tentang jenis hubungan:

Hubungan Database - dokumentasi IBM DB2


2
Saya khawatir itu tidak membuat adegan! ( TIDAK YAKIN TAPI ) saya pikir pesanan mewakili ketergantungan! Bukan ?? Misalnya, Pengguna ke Peran mungkin 1 ke banyak tetapi tidak banyak ke satu karena seseorang tidak bisa mendapatkan referensi dari pengguna yang menggunakan peran tersebut! Apakah itu masuk akal?
Amanuel Nega

Mungkin hubungan database sekarang?
fragorl

29

Dari halaman ini tentang Terminologi Database

Kebanyakan hubungan antar tabel adalah satu-ke-banyak.

Contoh:

  • Satu kawasan bisa menjadi habitat banyak pembaca.
  • Satu pembaca dapat memiliki banyak langganan.
  • Satu surat kabar dapat memiliki banyak langganan.

Relasi Banyak ke Satu sama dengan satu-ke-banyak, tetapi dari sudut pandang yang berbeda.

  • Banyak pembaca tinggal di satu area.
  • Banyak langganan bisa dari satu dan pembaca yang sama.
  • Banyak langganan untuk satu surat kabar yang sama.

20

Apa perbedaan nyata antara hubungan satu-ke-banyak dan banyak-ke-satu?

Ada perbedaan konseptual antara istilah-istilah ini yang akan membantu Anda memvisualisasikan data dan juga kemungkinan perbedaan dalam skema yang dihasilkan yang harus dipahami sepenuhnya. Sebagian besar perbedaannya adalah salah satu perspektif.

Dalam hubungan satu ke banyak , tabel lokal memiliki satu baris yang mungkin terkait dengan banyak baris di tabel lain. Dalam contoh dari SQL untuk pemula , satu Customerdapat dikaitkan dengan banyak Orders.

Dalam hubungan banyak-ke-satu yang berlawanan , tabel lokal mungkin memiliki banyak baris yang terkait dengan satu baris di tabel lain. Dalam contoh kita, banyak Orders dapat dikaitkan dengan satu Customer. Perbedaan konseptual ini penting untuk representasi mental.

Selain itu, skema yang mendukung hubungan dapat direpresentasikan secara berbeda dalam tabel Customerdan Order. Misalnya, jika pelanggan memiliki kolom iddan name:

id,name
1,Bill Smith
2,Jim Kenshaw

Kemudian agar a Orderdikaitkan dengan Customer, banyak implementasi SQL menambahkan ke Ordertabel kolom yang menyimpan iddari yang terkait Customer(dalam skema ini customer_id:

id,date,amount,customer_id
10,20160620,12.34,1
11,20160620,7.58,1
12,20160621,158.01,2

Pada baris data di atas, jika kita melihat customer_idkolom id, kita melihat bahwa Bill Smith(customer-id # 1) memiliki 2 pesanan yang terkait dengannya: satu untuk $ 12,34 dan satu untuk $ 7,58. Jim Kenshaw(customer-id # 2) hanya memiliki 1 pesanan seharga $ 158.01.

Yang penting untuk disadari adalah bahwa biasanya hubungan satu-ke-banyak tidak benar-benar menambahkan kolom apa pun ke tabel yang merupakan "satu". Tidak Customermemiliki kolom tambahan yang mendeskripsikan hubungan dengan Order. Bahkan Customerkekuatan juga memiliki hubungan satu-ke-banyak dengan ShippingAddressdan SalesCallmeja dan belum memiliki kolom tambahan ditambahkan ke Customermeja.

Namun, untuk hubungan banyak-ke-satu yang akan dijelaskan, seringkali idkolom ditambahkan ke tabel "banyak" yang merupakan kunci asing ke tabel "satu" - dalam hal ini customer_idkolom ditambahkan ke Order. Untuk pesanan terkait # 10 sebesar $ 12,34 Bill Smith, kami menetapkan customer_idkolom ke Bill Smithid 1.

Namun, mungkin juga ada tabel lain yang menjelaskan hubungan Customerdan Order, sehingga tidak ada bidang tambahan yang perlu ditambahkan ke Ordertabel. Alih-alih menambahkan customer_idbidang ke Ordertabel, mungkin ada Customer_Ordertabel yang berisi kunci untuk Customerdan Order.

customer_id,order_id
1,10
1,11
2,12

Dalam hal ini, one-to-many dan many-to-one semuanya bersifat konseptual karena tidak ada perubahan skema di antara keduanya. Mekanisme mana yang bergantung pada skema dan implementasi SQL Anda.

Semoga ini membantu.


3
Kasus umum disebut ketergantungan inklusi. Batasan kunci asing adalah jenis ketergantungan penyertaan yang paling umum, tetapi tidak semua ketergantungan penyertaan melibatkan kunci asing. Atribut atau atribut umum ("referensi") selalu ada di kedua tabel. Di sisi "satu" atribut tersebut disebut kunci kandidat. Di sisi "banyak", mereka mungkin kunci asing. Istilah "satu-ke-banyak" atau "banyak-ke-satu" dapat diterapkan ke ketergantungan penyertaan apa pun yang melibatkan setidaknya satu kunci kandidat tanpa harus menyiratkan sisi mana yang mungkin opsional.
nvogel

@Sqlvogel menarik. Di Jawa javax.persistence.OneToManyberbeda dengan ManyToOne. Apakah Anda mengatakan bahwa mereka identik atau hanya tergantung pada penerapannya? Apakah jawaban saya salah?
Gray

2
Pertanyaannya adalah tentang database relasional dan SQL, bukan Java. Mungkin Anda benar tentang Java.
nvogel

Saya menggunakannya sebagai contoh @sqlvogel. Apakah Anda mengatakan bahwa "satu-ke-banyak" dan "banyak-ke-satu" itu sama?
Abu

2
Saya mengatakan bahwa itu adalah dua cara untuk menggambarkan hubungan yang persis sama tetapi dari sudut pandang yang berbeda. Dengan cara yang sama bahwa "A adalah himpunan bagian dari B" artinya sama dengan "B adalah superset dari A".
nvogel

4

Tidak ada perbedaan. Ini hanya masalah bahasa dan preferensi tentang cara Anda menyatakan hubungan tersebut.


1
Pasti ada perbedaan, baik secara konseptual maupun skema yang dihasilkan. Lihat jawaban saya: stackoverflow.com/a/37954280/179850
Abu

4
@Abu-abu. Tidak, tidak ada. Jawaban Anda tidak hanya salah, tetapi juga membingungkan para pemula (yang menanyakan pertanyaan ini).
PerformanceDBA

4

Jawaban untuk pertanyaan pertama Anda adalah: keduanya serupa,

Jawaban untuk pertanyaan kedua Anda adalah: satu-ke-banyak -> seorang PRIA (tabel PRIA) dapat memiliki lebih dari satu istri (tabel PEREMPUAN) banyak-ke-satu -> lebih dari satu wanita telah menikah dengan satu PRIA.

Sekarang jika Anda ingin menghubungkan relasi ini dengan dua tabel MAN dan WOMEN, satu baris tabel MAN mungkin memiliki banyak relasi dengan baris pada tabel WOMEN. semoga jelas.


3

Contoh

Dua tabel dengan satu relasi

SQL

Dalam SQL, hanya ada satu jenis relasi, yang disebut Referensi. (Bagian depan Anda mungkin melakukan hal-hal yang membantu atau membingungkan [seperti di beberapa Jawaban], tetapi itu adalah cerita yang berbeda.)

  • Sebuah Key Asing di satu meja (yang referenc ing tabel)
    Referensi
    sebuah Primary Key pada tabel lain ( referenc ed tabel)
  • Dalam istilah SQL, Bar mereferensikan Foo
    Bukan sebaliknya

    CREATE TABLE Foo (
        Foo   CHAR(10)  NOT NULL, -- primary key
        Name  CHAR(30)  NOT NULL
        CONSTRAINT PK             -- constraint name
            PRIMARY KEY (Foo)     -- pk
        )  
    CREATE TABLE Bar (
        Bar   CHAR(10)  NOT NULL, -- primary key
        Foo   CHAR(10)  NOT NULL, -- foreign key to Foo
        Name  CHAR(30)  NOT NULL
        CONSTRAINT PK                -- constraint name
            PRIMARY KEY (Bar),       -- pk
        CONSTRAINT Foo_HasMany_Bars  -- constraint name
            FOREIGN KEY   (Foo)      -- fk in (this) referencing table
            REFERENCES Foo(Foo)      -- pk in referenced table
        )
  • Karena Foo.Foomerupakan Kunci Utama, itu unik, hanya ada satu baris untuk nilai tertentuFoo

  • Karena Bar.Foomerupakan Referensi, Kunci Asing, dan tidak ada indeks unik di atasnya, dapat terdapat banyak baris untuk nilai tertentu dariFoo
  • Oleh karena itu, hubungannya Foo::Baradalah satu-ke-banyak
  • Sekarang Anda dapat melihat (melihat) hubungan sebaliknya, Bar::Foobanyak-ke-satu
    • Tapi jangan biarkan itu membingungkan Anda: untuk satu Barbaris, hanya ada satu Foobaris yang Referensi
  • Di SQL, hanya itu yang kami miliki. Hanya itu yang diperlukan.

Apa perbedaan nyata antara hubungan satu ke banyak dan banyak ke satu?

Hanya ada satu hubungan, oleh karena itu tidak ada perbedaan. Persepsi (dari satu "ujung" atau "ujung" lainnya) atau membacanya secara terbalik, tidak mengubah relasi.

Kardinalitas

Kardinalitas dideklarasikan pertama kali dalam model data, yang artinya Logis dan Fisik (maksud), lalu dalam implementasinya (maksud terealisasi).

Kardinalitas

One to zero-to-many
Dalam SQL hanya itu (di atas) yang diperlukan.

One to one-to-many
Anda memerlukan Transaksi untuk menerapkan yang ada di tabel Referensi.

One to zero-to-one
Anda membutuhkan Bar:

CONSTRAINT AK    -- constraint name
    UNIQUE (Foo) -- unique column, which makes it an Alternate Key

Satu ke satu
Anda memerlukan Transaksi untuk menerapkan yang ada di tabel Referensi.

Banyak ke banyak
Tidak ada hal seperti itu di tingkat Fisik (ingat, hanya ada satu jenis relasi dalam SQL).

Pada level Logika awal selama latihan pemodelan, akan lebih mudah untuk menggambar relasi seperti itu. Sebelum model mendekati implementasi, sebaiknya model ditingkatkan menggunakan hanya hal-hal yang bisa ada. Hubungan seperti itu diselesaikan dengan menerapkan Tabel Asosiatif.

Banyak ke banyak Terselesaikan


1
@Tokopedia Saya dapat mengeditnya agar sesuai dengan kode etik. Tetapi Anda juga telah menghapus (a) penjelasan, dan (b) fakta yang dibuktikan dalam kenyataan. Apa yang harus saya lakukan tentang itu?
PerformanceDBA

3
Temukan cara lain untuk mengungkapkan hal-hal itu tanpa harus mengomel, menyebut nama, dan mencaci-maki kecerdasan atau perilaku profesional siapa pun. Fokus pada teknologi, bukan pada orang yang mungkin salah atau tidak.
Martijn Pieters

2

One-to-Many dan Many-to-One serupa dalam Multiplisitas tapi tidak Aspek (yaitu Directionality).

Pemetaan Asosiasi antara kelas entitas dan Hubungan antar tabel. Ada dua kategori Hubungan:

  1. Multiplisitas (istilah ER: kardinalitas)
    • Hubungan satu-ke-satu : Contoh Suami dan Istri
    • Hubungan Satu-ke-Banyak : Contoh Ibu dan Anak
    • Hubungan Banyak ke Banyak : Contoh Siswa dan Subjek
  2. Arah : Tidak memengaruhi pemetaan tetapi membuat perbedaan tentang cara kami mengakses data.
    • Hubungan Uni-directional : Bidang hubungan atau properti yang merujuk ke entitas lain.
    • Hubungan dua arah : Setiap entitas memiliki bidang hubungan atau properti yang merujuk ke entitas lain.

Tidak ada "arah" dalam database relasional. Setiap hubungan memiliki dua "ujung": Referensi (tabel yang direferensikan) dan Referensi (tabel yang melakukan referensi). SQL / DML memungkinkan tabel apapun untuk direferensikan, dengan cara apapun yang Anda inginkan… satu sisi… sisi lain… kedua sisi… tanpa sisi.
PerformanceDBA

0

Tidak ada perbedaan praktis. Gunakan saja hubungan yang paling masuk akal mengingat cara Anda memandang masalah Anda seperti yang diilustrasikan oleh Devendra.


Pasti ada perbedaan, baik secara konseptual maupun skema yang dihasilkan. Lihat jawaban saya: stackoverflow.com/a/37954280/179850
Abu

3
@Abu-abu. Tidak, tidak ada. Jawaban Anda tidak hanya salah, tetapi juga membingungkan para pemula (yang menanyakan pertanyaan ini).
PerformanceDBA

0
  • --- One to Many --- A Parents dapat memiliki dua anak atau lebih.
  • --- Banyak menjadi satu --- Ketiga anak itu dapat memiliki satu Orang Tua.

    Keduanya mirip. Ini bisa digunakan milik kebutuhan. Jika Anda ingin mencari anak untuk orang tua tertentu, Anda dapat memilih One-To-Many. atau, ingin mencari orang tua untuk anak kembar, Anda bisa memilih Many-To-One. Juga....,


-6

satu-ke-banyak memiliki kelas induk berisi n jumlah anak jadi ini adalah pemetaan koleksi.

many-to-one memiliki n jumlah anak berisi satu orang tua sehingga merupakan pemetaan objek


jawaban ini bagus dan memiliki informasi tambahan tidak mengerti mengapa itu tidak dipilih, dalam konteks searah satu ke banyak dan banyak ke satu tidak akan memberikan kualitas kode yang sama tergantung pada UX: Jika Anda perlu mendapatkan satu set data terkait jadi satu ke banyak lebih bijaksana jika Anda tidak memerlukan pernyataan pilih di mana beberapa kondisi baik-baik saja karena set ada di peta, namun jika pengguna tidak perlu mendapatkan kumpulan data dan tertarik pada setiap baris sebagai unik contoh yang diinginkan begitu Banyak menjadi satu adalah pilihan yang lebih bijak
Mohammed Housseyn Taleb

Ini mungkin jawaban yang bagus, tetapi tidak sama: banyak-ke-satu memiliki kelas induk yang berisi n jumlah anak, satu-ke-banyak memiliki banyak induk ke satu anak. Dalam SQL mungkin tidak membuat perbedaan karena hubungan banyak-ke-satu bisa omni-directional tetapi dalam kerangka kerja seperti Django, ini adalah masalah utama, karena tidak ada hubungan satu-ke-banyak dan kunci asing yang berurusan dengan hubungan Banyak-ke-Satu hanya bekerja secara alami dalam satu arah, ini tidak dapat digunakan secara sebaliknya dengan cara yang sama.
iFungsi
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.