Bire çok ve çoka bir ilişki arasındaki fark


117

Bire çok ve çoka bir ilişki arasındaki gerçek fark nedir? Sadece tersine mi dönüyor?

Bu konu hakkında bunun dışında 'iyi ve anlaşılması kolay' öğretici bulamıyorum: Yeni Başlayanlar için SQL: Bölüm 3 - Veritabanı İlişkileri



@RobertPitt çoktan çoğa makale soruyla nasıl alakalı? Muhtemelen en.wikipedia.org/wiki/One-to-many_(data_model)
TMG

Yanıtlar:


111

Evet, tam tersi. Varlığın ilişkinin hangi tarafında bulunduğuna bağlıdır.

Örneğin, bir departman birden fazla çalışan için istihdam sağlayabiliyorsa, departmandan çalışana bire bir ilişki olurken (1 departman çok sayıda çalışanı istihdam eder), buna karşın çalışandan departmana ilişki çoktur (birçok çalışan bir departmanda çalışır).

İlişki türleri hakkında daha fazla bilgi :

Veritabanı İlişkileri - IBM DB2 belgeleri


2
Korkarım bu sahneler yaratmaz! ( EMİN DEĞİL, AMA ) Siparişin bağımlılığı temsil ettiğini düşünüyorum! Değil mi? Örneğin, Rolü Kullanan Kullanıcı 1'den çoka kadar olabilir, ancak çoktan bire olmayabilir çünkü rolü kullanan kullanıcının referansları alınamaz! bu mantıklı mı?
Amanuel Nega


29

Veritabanı Terminolojisi hakkında bu sayfadan

Tablolar arasındaki çoğu ilişki bire çoktur.

Misal:

  • Bir alan birçok okuyucunun yaşam alanı olabilir.
  • Bir okuyucunun birçok aboneliği olabilir.
  • Bir gazetenin birçok aboneliği olabilir.

Çoktan Bire ilişkisi bire çok ile aynıdır, ancak farklı bir bakış açısından.

  • Birçok okuyucu tek bir bölgede yaşıyor.
  • Birçok abonelik tek ve aynı okuyucu olabilir.
  • Birçok abonelik tek ve aynı gazete içindir.

20

Bire çok ve çoka bir ilişki arasındaki gerçek fark nedir?

Bu terimler arasında, verileri görselleştirmenize yardımcı olması gereken kavramsal farklılıklar ve ayrıca oluşturulan şemada tam olarak anlaşılması gereken olası farklılıklar vardır. Çoğunlukla fark, perspektifle ilgilidir.

Bir de bire birçok ilişki, yerel tablo başka bir tablodaki sayıda satır ile ilişkili olabilir bir satır vardır. Yeni başlayanlar için SQL'deki örnekte , biri Customerbirçok OrderURL ile ilişkilendirilebilir .

Karşıt çoka bir ilişkide, yerel tablo başka bir tablodaki bir satırla ilişkilendirilmiş birçok satıra sahip olabilir. Örneğimizde, birçok Orders bir ile ilişkilendirilebilir Customer. Bu kavramsal farklılık, zihinsel temsil için önemlidir.

Ayrıca, ilişkiyi destekleyen şema Customerve Ordertablolarında farklı şekilde gösterilebilir . Örneğin, müşterinin sütunları varsa idve name:

id,name
1,Bill Smith
2,Jim Kenshaw

Daha sonra, a Orderile ilişkilendirilmek için Customer, birçok SQL uygulaması Ordertabloya idilişkili olanları depolayan bir sütun ekler Customer(bu şemada customer_id:

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

Yukarıdaki veri satırlarında, customer_idid sütununa bakarsak, Bill Smith(müşteri kimliği # 1) kendisiyle ilişkili 2 siparişin olduğunu görürüz : biri 12,34 $ ve diğeri 7,58 $. Jim Kenshaw(müşteri kimliği # 2) 158,01 ABD doları tutarında yalnızca 1 siparişe sahip.

Gerçekleştirilmesi gereken önemli olan, tipik olarak bire çok ilişkisinin aslında tabloya "bir" olan herhangi bir sütun eklememesidir. Customerİle ilişkisini açıklamak hiçbir ekstra sütun var Order. Aslında, Customeraynı zamanda ShippingAddressve SalesCalltablolarla bire çok ilişkisi olabilir ve yine de Customertabloya ek sütun eklenmemiş olabilir .

Bununla birlikte, çoka bir ilişkinin açıklanması için, genellikle id"çok" tablosuna, "bir" tabloya yabancı anahtar olan bir customer_idsütun eklenir - bu durumda Order. $ 12,34 ile 10 numaralı siparişi ilişkilendirmek için Bill Smith, customer_idsütunu Bill Smith's id 1'e atarız .

Ancak, Customerve Orderilişkisini tanımlayan başka bir tablonun olması da mümkündür , böylece tabloya ek alanların eklenmesine gerek yoktur Order. Tabloya bir customer_idalan eklemek yerine, hem ve hem de için anahtarları içeren bir tablo Orderolabilir . Customer_OrderCustomerOrder

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

Bu durumda, aralarında şema değişikliği olmadığından bire çok ve çoktan bire hepsi kavramsaldır. Hangi mekanizma şemanıza ve SQL uygulamanıza bağlıdır.

Bu yardımcı olur umarım.


3
Genel durum, dahil etme bağımlılığı olarak adlandırılır. Yabancı anahtar kısıtlaması en yaygın dahil etme bağımlılığı türüdür, ancak tüm dahil etme bağımlılıkları bir yabancı anahtar içermez. Ortak öznitelik veya öznitelikler ("başvuru") her zaman her iki tabloda da mevcuttur. "Bir" tarafta bu özniteliklere aday anahtar adı verilir. "Çok" tarafında , bir yabancı anahtar olabilirler. "Birden çoğa" veya "çoktan bire" terimleri, en az bir aday anahtarı içeren herhangi bir dahil etme bağımlılığına, hangi tarafın isteğe bağlı olabileceğini zorunlu olarak ima etmeden uygulanabilir.
nvogel

İlginç @sqlvogel. Java'da javax.persistence.OneToManyfarklı daha ManyToOne. Eşanlamlı olduklarını mı yoksa sadece uygulamaya bağlı olduğunu mu söylüyorsunuz? Cevabım yanlış mı?
Gray

2
Soru, Java ile değil, ilişkisel veritabanları ve SQL ile ilgili. Belki Java konusunda haklısın.
nvogel

Örnek olarak kullanıyordum @sqlvogel. "Bire çok" ve "çoktan bire" nin eş anlamlı olduğunu mu söylüyorsunuz?
Grey

2
Bunların tamamen aynı ilişkiyi farklı bakış açılarından tanımlamanın iki yolu olduğunu söylüyorum. Aynı şekilde "A, B'nin bir alt kümesidir", "B, A'nın bir üst kümesidir" ile aynı anlama gelir.
nvogel

4

Fark yok. Bu sadece bir dil ve tercih meselesi, ilişkiyi hangi yöne çevirdiğinizle ilgili.


1
Hem kavramsal olarak hem de üretilen şema açısından kesinlikle bir fark vardır. Cevabımı görün: stackoverflow.com/a/37954280/179850
Gray

4
@Gri. Hayır yok. Cevabınız sadece yanlış değil, yeni başlayanların (bu soruyu soranların) kafasını karıştırıyor.
PerformanceDBA

4

İlk sorunuzun cevabı: her ikisi de benzer,

İkinci sorunuzun cevabı şudur: bire çok -> bir ERKEK (MAN tablosu) birden fazla karısı olabilir (KADIN masası) çoka bir -> birden fazla kadın bir ADAM ile evlenmiştir.

Şimdi bu ilişkiyi MAN ve WOMEN adlı iki tabloyla ilişkilendirmek isterseniz, bir MAN tablo satırı WOMEN tablosundaki satırlarla birçok ilişkiye sahip olabilir. umarım açık.


3

Misal

Tek ilişkiye sahip iki tablo

SQL

SQL'de sadece bir tür ilişki vardır, buna Referans denir. (Kullanıcı arabiriminiz yararlı veya kafa karıştırıcı şeyler yapabilir [bazı Yanıtlarda olduğu gibi], ancak bu farklı bir hikaye.)

  • Bir yabancı anahtar bir tabloda ( referenc ing tablo)
    Referanslar
    bir birincil anahtar başka tablodaki ( referenc ed tablo)
  • SQL terimlerinde, Bar Foo'ya atıfta bulunur
    Diğer şekilde değil

    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
        )
  • Yana Foo.Foobir birincil anahtar olduğunu, sadece bir satır verilen herhangi bir değeri için, orada tektirFoo

  • Yana Bar.FooReferans, bir yabancı anahtar, ve hiçbir benzersiz bir dizin üzerinde olduğunu, herhangi belirli bir değeri için fazla satır olabilirFoo
  • Bu nedenle ilişki Foo::Barbire çoktur
  • Şimdi ilişkiyi tam tersi şekilde algılayabilirsin (bakabilirsin), çoka Bar::Foobir
    • Ancak bunun kafanızı karıştırmasına izin vermeyin: herhangi bir Barsatır için, sadece bir Foosatır vardır Referanslar
  • SQL'de sahip olduğumuz tek şey bu. Tüm gerekli olan bu.

Birden çoğa ve çoktan bire ilişki arasındaki gerçek fark nedir?

Tek bir ilişki vardır, bu nedenle fark yoktur. Algılama (bir "uçtan" ​​veya diğer "sondan") veya onu geriye doğru okumak, ilişkiyi değiştirmez.

kardinalite

Önemlilik ilk olarak veri modelinde, yani Mantıksal ve Fiziksel (niyet) ve ardından uygulamada (amaç gerçekleştirilen) beyan edilir.

kardinalite

Birden çoka sıfıra
SQL'de (yukarıdakiler) gerekli olan tek şeydir.

Bire-
çoğa Bir İşleme ihtiyacınız var çoğa Referanslama tablosundaki uygulamak için bir İşleme .

Bire sıfıra bire
İhtiyacınız olan Bar:

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

Birine biri
bir ihtiyaç İşlem Referans tablosundaki birini uygulamak.

Çoktan
çoğa Fiziksel düzeyde böyle bir şey yoktur (hatırlayın, SQL'de yalnızca bir tür ilişki vardır).

Modelleme alıştırması sırasında erken Mantıksal seviyelerde, böyle bir ilişki kurmak uygundur . Model uygulamaya yaklaşmadan önce, yalnızca var olabilecek şeyleri kullanmaya yükseltilse iyi olur. Böyle bir ilişki, bir İlişkilendirmeli Tablo uygulanarak çözülür.

Çoktan çoğa Çözümlendi


1
@Martijn Peters. Davranış kurallarına uyacak şekilde düzenleyebilirim. Ancak (a) açıklamayı ve (b) gerçekte kanıtlanmış gerçekleri de kaldırdınız. Bunlarla ilgili ne yapacağım?
PerformanceDBA

3
Bu şeyleri söylemeye, isim takmaya ve herhangi birinin zekasına veya profesyonel davranışına itiraz etmeden ifade etmenin farklı bir yolunu bulun. Yanlış olabilecek veya olmayabilecek insanlara değil, teknolojiye odaklanın.
Martijn Pieters

2

Bire Çok ve Çoktan Bire, Çokluk açısından benzerdir ancak Boyut (Yönlülük) değildir.

Haritalanması Dernekleri varlık sınıfları arasındaki İlişkilerin tablolar arasında. İki İlişki kategorisi vardır:

  1. çokluk (ER terimi: kardinalite)
    • Bire bir ilişkiler : Örnek Karı Koca
    • Bire Çoğa ilişkiler : Örnek Anne ve Çocuklar
    • Çoktan Çoğa ilişkiler : Örnek Öğrenci ve Konu
  2. Yönelmişlik : Haritalamayı etkilemez, ancak verilere nasıl erişebileceğimiz konusunda fark yaratır.
    • Tek yönlü ilişkiler : Diğer varlığa bir ilişki alanı veya özelliği.
    • Çift yönlü ilişkiler : Her varlığın, diğer varlığa başvuran bir ilişki alanı veya özelliği vardır.

İlişkisel bir veritabanında "yönlülük" yoktur. Her ilişkinin iki "sonu" vardır: Referans (referans verilen tablo) ve Referanslama (referansı yapan tablo). SQL / DML herhangi bir tabloya istediğiniz şekilde başvurulmasına izin verir… bir taraf… diğer taraf… her iki taraf… taraf yok.
PerformanceDBA

0

Pratik bir fark yok. Devendra'nın gösterdiği gibi, sorununuzu nasıl gördüğünüze göre en mantıklı olan ilişkiyi kullanın.


Hem kavramsal olarak hem de üretilen şema açısından kesinlikle bir fark vardır. Cevabımı görün: stackoverflow.com/a/37954280/179850
Gray

3
@Gri. Hayır yok. Cevabınız sadece yanlış değil, yeni başlayanların (bu soruyu soranların) kafasını karıştırıyor.
PerformanceDBA

0
  • --- Birden Çoğa --- Bir Ebeveynin iki veya daha fazla çocuğu olabilir.
  • --- Çoktan bire --- Bu 3 çocuğun tek bir Ebeveyni olabilir.

    İkisi de benzer. Bu ihtiyaca göre kullanılabilir. Belirli bir ebeveyn için çocuk bulmak istiyorsanız, One-To-Many ile gidebilirsiniz. ya da ikizler için ebeveyn bulmak istiyorsanız, Çoktan Bire ile gidebilirsiniz. Aynı şekilde ....,


-6

birden çoğa ebeveyn sınıfı n sayıda çocuk içerir, bu nedenle bu bir koleksiyon eşlemesidir.

çoktan bire n sayıda çocuk vardır, bir ebeveyn içerir, bu nedenle bu bir nesne eşlemesidir


bu cevap iyidir ve ek bilgileriniz neden reddedildiğini anlamıyorum, tek yönlü bağlamda bire çok ve bire bir UX'e bağlı olarak aynı kod kalitesini sağlamayacaktır: İlgili bir dizi veriye ihtiyacınız varsa bu nedenle, bazı koşulların uygun olduğu bir seçme ifadesine ihtiyacınız yoksa, çünkü küme haritada yer alıyorsa, ancak kullanıcının veri kümesini alması gerekmiyorsa ve her satırla benzersiz olarak ilgileniyorsa çok fazla bire bir akıllı seçim
Muhammed Housseyn Taleb

Bu iyi bir cevap olabilir, ancak aynı değiller: çoktan bire n sayıda çocuk içeren bir ebeveyn sınıfına sahip, bire çoğa birçok ebeveynden bir çocuğa sahip. SQL'de, çoka bir ilişki çok yönlü olabileceğinden bir fark yaratmayabilir, ancak Django gibi bir çerçevede, bire çok ilişki ve yabancı anahtar olmadığı için bu büyük bir sorundur. Çoktan Bire ilişkisiyle ilgilenir, yalnızca bir yönde doğal olarak çalışır, bu aynı şekilde tersi şekilde kullanılamaz.
iFunction
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.