Różnica między relacją jeden do wielu i wiele do jednego

117

Jaka jest prawdziwa różnica między relacją jeden do wielu i wiele do jednego? To jest tylko odwrócone, jakby?

Nie mogę znaleźć żadnego `` dobrego i łatwego do zrozumienia '' samouczka na ten temat innego niż ten: SQL dla początkujących: Część 3 - Relacje w bazie danych

Zhaf
źródło
1
To jest idealne wyjaśnienie: en.wikipedia.org/wiki/Many-to-many_(data_model)
RobertPitt
@RobertPitt, w jaki sposób artykuł „wiele do wielu” ma związek z pytaniem? Prawdopodobnie miałeś na myśli raczej en.wikipedia.org/wiki/One-to-many_(data_model)
TMG

Odpowiedzi:

111

Tak, to na odwrót. To zależy od tego, po której stronie relacji znajduje się jednostka.

Na przykład, jeśli jeden dział może zatrudniać kilku pracowników, wtedy dział do pracownika to relacja jeden do wielu (1 dział zatrudnia wielu pracowników), podczas gdy relacja między pracownikami to wiele do jednego (wielu pracowników pracuje w jednym dziale).

Więcej informacji o typach relacji:

Relacje z bazą danych - dokumentacja IBM DB2

Devendra D. Chavan
źródło
2
Obawiam się, że to nie tworzy scen! ( NIE PEWNE, ALE ) Myślę, że kolejność reprezentuje zależność! Czy to nie jest ?? Np. Użytkownik do roli może mieć wartość 1 do wielu, ale nie wiele do jednego, ponieważ nie można uzyskać referencji użytkownika, który używa tej roli! Czy to ma sens?
Amanuel Nega
Może teraz relacje z bazą danych ?
fragorl
29

Z tej strony o terminologii baz danych

Większość relacji między tabelami to jeden do wielu.

Przykład:

  • Jeden obszar może być siedliskiem wielu czytelników.
  • Jeden czytelnik może mieć wiele subskrypcji.
  • Jedna gazeta może mieć wiele subskrypcji.

Relacja wiele do jednego to to samo, co jeden do wielu, ale z innego punktu widzenia.

  • Wielu czytelników mieszka w jednej okolicy.
  • Wiele subskrypcji może dotyczyć jednego i tego samego czytelnika.
  • Wiele subskrypcji dotyczy jednej i tej samej gazety.
nathan gonzalez
źródło
20

Jaka jest prawdziwa różnica między relacją jeden do wielu i wiele do jednego?

Istnieją koncepcyjne różnice między tymi terminami, które powinny pomóc w wizualizacji danych, a także możliwe różnice w wygenerowanym schemacie, które należy w pełni zrozumieć. Głównie różnica polega jednak na perspektywie.

W relacji jeden do wielu lokalna tabela ma jeden wiersz, który może być powiązany z wieloma wierszami w innej tabeli. W przykładzie z SQL dla początkujących jeden Customermoże być powiązany z wieloma Orderplikami.

W odwrotnej relacji wiele do jednego tabela lokalna może mieć wiele wierszy powiązanych z jednym wierszem w innej tabeli. W naszym przykładzie wiele Orders może być skojarzonych z jednym Customer. Ta różnica pojęciowa jest ważna dla reprezentacji umysłowej.

Ponadto schemat obsługujący relację może być różnie reprezentowany w tabelach Customeri Order. Na przykład, jeśli klient ma kolumny idi name:

id,name
1,Bill Smith
2,Jim Kenshaw

Następnie, aby a Orderbyło skojarzone z a Customer, wiele implementacji SQL dodaje do Ordertabeli kolumnę, która przechowuje idskojarzone Customer(w tym schemacie customer_id:

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

W powyższych wierszach danych, jeśli spojrzymy na customer_idkolumnę id, zobaczymy, że Bill Smith(identyfikator klienta nr 1) ma 2 powiązane z nim zamówienia: jedno za 12,34 USD i jedno za 7,58 USD. Jim Kenshaw(identyfikator klienta nr 2) ma tylko 1 zamówienie za 158,01 USD.

Ważne jest, aby zdać sobie sprawę, że zazwyczaj relacja jeden do wielu w rzeczywistości nie dodaje żadnych kolumn do tabeli, która jest „jedynką”. Nie Customerma dodatkowych kolumn opisujących relację z Order. W rzeczywistości Customermoże mieć również związek jeden-do-wielu z nich ShippingAddressi SalesCallstoły, a jednocześnie nie mają dodatkowe kolumny dodane do Customertabeli.

Jednak aby opisać relację wiele do jednego, często iddo tabeli „wiele” dodawana jest kolumna, która jest kluczem obcym do tabeli „jedna” - w tym przypadku customer_idkolumna jest dodawana do tabeli Order. Do powiązanego zamówienia nr 10 dla 12,34 USD Bill Smithprzypisujemy customer_idkolumnę do Bill Smithidentyfikatora 1.

Możliwe jest jednak również istnienie innej tabeli opisującej relację Customeri Order, dzięki czemu do Ordertabeli nie trzeba dodawać żadnych dodatkowych pól . Zamiast dodawać customer_idpole do Ordertabeli, może istnieć Customer_Ordertabela zawierająca klucze zarówno dla, jak Customeri Order.

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

W tym przypadku operacje jeden do wielu i wiele do jednego są koncepcyjne, ponieważ nie ma między nimi zmian schematu. Który mechanizm zależy od Twojego schematu i implementacji SQL.

Mam nadzieję że to pomoże.

Szary
źródło
3
Ogólny przypadek nazywa się zależnością włączenia. Ograniczenie klucza obcego jest najpowszechniejszym typem zależności włączania, ale nie wszystkie zależności włączania obejmują klucz obcy. Wspólny atrybut lub atrybuty („odniesienie”) zawsze istnieje w obu tabelach. Po stronie „jednej” atrybuty te nazywane są kluczem kandydującym. Po stronie „wielu” mogą to być klucze obce. Terminy „jeden do wielu” lub „wiele do jednego” można zastosować do dowolnej zależności włączającej, która obejmuje co najmniej jeden klucz kandydujący, niekoniecznie sugerując, która strona może być opcjonalna.
nvogel
Ciekawe @sqlvogel. W Javie javax.persistence.OneToManyinaczej niż w ManyToOne. Mówisz, że są synonimami, czy po prostu zależy to od implementacji? Czy moja odpowiedź jest nieprawidłowa?
Gray
2
Pytanie dotyczy relacyjnych baz danych i języka SQL, a nie Javy. Może masz rację co do Javy.
nvogel
Użyłem go jako przykładu @sqlvogel. Czy chcesz powiedzieć, że „jeden do wielu” i „wiele do jednego” to synonimy?
Gray
2
Mówię, że są to dwa sposoby opisania dokładnie tej samej relacji, ale z różnych perspektyw. W ten sam sposób, że „A jest podzbiorem B” oznacza to samo, co „B jest podzbiorem A”.
nvogel
4

Nie ma różnicy. To tylko kwestia języka i preferencji, w jaki sposób określisz związek.

nvogel
źródło
1
Z pewnością istnieje różnica, zarówno pod względem koncepcyjnym, jak i wygenerowanym schematem. Zobacz moją odpowiedź: stackoverflow.com/a/37954280/179850
Gray
4
@Szary. Nie, nie ma. Twoja odpowiedź jest nie tylko nieprawidłowa, ale także dezorientuje początkujących (tych, którzy zadają to pytanie).
PerformanceDBA
4

Odpowiedź na pierwsze pytanie brzmi: oba są podobne,

Odpowiedź na twoje drugie pytanie brzmi: jeden do wielu -> MĘŻCZYZNA (stół MĘŻCZYZNA) może mieć więcej niż jedną żonę (stół KOBIETA) wiele do jednej -> więcej niż jedna kobieta poślubiła jednego MĘŻCZYZNĘ.

Teraz, jeśli chcesz powiązać tę relację z dwiema tabelami MAN i WOMEN, jeden wiersz tabeli MAN może mieć wiele relacji z wierszami w tabeli WOMEN. mam nadzieję, że to jasne.

kumpel
źródło
3

Przykład

Dwie tabele z jedną relacją

SQL

W SQL istnieje tylko jeden rodzaj relacji, nazywany referencją. (Twój interfejs użytkownika może być pomocny lub dezorientujący [na przykład w niektórych Odpowiedziach], ale to już inna historia).

  • Klucz obcy w jednej tabeli (the referenc ing tabela)
    Referencje
    na klucz podstawowy w innej tabeli (The referenc ed tabela)
  • W języku SQL, Bar odwołuje się do Foo, a
    nie na odwrót

    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
        )
  • Ponieważ Foo.Foojest to klucz podstawowy, jest unikalny, istnieje tylko jeden wiersz dla dowolnej wartościFoo

  • Ponieważ Bar.Foojest to odniesienie, klucz obcy i nie ma na nim unikalnego indeksu, może istnieć wiele wierszy dla dowolnej wartościFoo
  • Dlatego relacja Foo::Bar jest jeden do wielu
  • Teraz możesz dostrzec (popatrzeć) relację na odwrót, Bar::Foojest wiele do jednego
    • Ale niech cię to nie zmyli: w każdym Barwierszu jest tylko jeden Foowiersz, do którego się on odnosi
  • W SQL to wszystko, co mamy. To wszystko, co jest konieczne.

Jaka jest prawdziwa różnica między relacją jeden do wielu i wiele do jednego?

Jest tylko jedna relacja, dlatego nie ma różnicy. Postrzeganie (z jednego „końca” lub drugiego „końca”) lub czytanie go od tyłu nie zmienia relacji.

Kardynalność

Kardynalność jest deklarowana najpierw w modelu danych, czyli logicznym i fizycznym (intencja), a następnie w implementacji (zamiar zrealizowany).

Kardynalność

Jeden do zera do wielu
W SQL to (powyższe) jest wszystkim, czego potrzeba.

Jeden do jednego do wielu
Aby wymusić transakcję z tabeli referencyjnej, potrzebna jest transakcja .

Jeden do zera do jednego
Potrzebujesz Bar:

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

Jeden do jednego
Potrzebujesz transakcji, aby wymusić tę z tabeli referencyjnej.

Wiele do wielu
Na poziomie fizycznym nie ma czegoś takiego (przypomnijmy sobie, w SQL jest tylko jeden typ relacji).

Na wczesnych poziomach logicznych podczas ćwiczenia modelowania wygodnie jest narysować taką relację. Zanim model zbliży się do wdrożenia, lepiej będzie, gdy zacznie używać tylko rzeczy, które mogą istnieć. Taka relacja jest rozwiązywana poprzez implementację tabeli asocjacyjnej.

Wiele do wielu rozwiązanych

WydajnośćDBA
źródło
1
@Martijn Peters. Mogę go edytować, aby był zgodny z kodeksem postępowania. Ale usunąłeś również (a) wyjaśnienie i (b) udokumentowałeś fakty w rzeczywistości. Co mam z nimi zrobić?
PerformanceDBA
3
Znajdź inny sposób wyrażenia tych rzeczy bez uciekania się do narzekania, wyzwisk i rzucania oszczerstw na czyjeś intelekt lub zachowanie zawodowe. Skoncentruj się na technologii, a nie na ludziach, którzy mogą się mylić lub nie.
Martijn Pieters
2

Jeden do wielu i wiele do jednego są podobne pod względem różnorodności, ale nie aspektu (tj. Kierunkowości).

Mapowanie asocjacji między klasami jednostek i relacji między tabelami. Istnieją dwie kategorie relacji:

  1. Wielość (termin ER: liczność)
    • Relacje jeden do jednego : przykład mąż i żona
    • Relacje jeden-do-wielu : przykład matka i dzieci
    • Relacje wiele-do-wielu : przykład ucznia i przedmiotu
  2. Kierunkowość : nie wpływa na mapowanie, ale ma wpływ na sposób, w jaki możemy uzyskać dostęp do danych.
    • Relacje jednokierunkowe : pole lub właściwość relacji, która odwołuje się do innej jednostki.
    • Relacje dwukierunkowe : każda encja ma pole relacji lub właściwość, która odwołuje się do innej encji.
Premraj
źródło
W relacyjnej bazie danych nie ma „kierunkowości”. Każda relacja ma dwa „końce”: odwołanie (tabela, do której się odwołuje) i odniesienie (tabela wykonująca odwołanie). SQL / DML umożliwia odwoływanie się do dowolnej tabeli, w dowolny sposób… jedna strona… druga strona… obie strony… żadnych stron.
PerformanceDBA,
0

Nie ma praktycznej różnicy. Po prostu użyj relacji, która jest najbardziej sensowna, biorąc pod uwagę sposób, w jaki postrzegasz swój problem, jak zilustrował Devendra.

Tom Bell
źródło
Z pewnością istnieje różnica, zarówno pod względem koncepcyjnym, jak i wygenerowanym schematem. Zobacz moją odpowiedź: stackoverflow.com/a/37954280/179850
Gray
3
@Szary. Nie, nie ma. Twoja odpowiedź jest nie tylko nieprawidłowa, ale także dezorientuje początkujących (tych, którzy zadają to pytanie).
PerformanceDBA
0
  • --- Jeden do wielu --- Rodzice mogą mieć dwoje lub więcej dzieci.
  • --- Wiele do jednego --- Te troje dzieci może mieć samotnych rodziców.

    Obie są podobne. To może być wykorzystane należy do potrzeby. Jeśli chcesz znaleźć dzieci dla określonych rodziców, możesz wybrać opcję Jeden do wielu. albo chcesz znaleźć rodziców dla bliźniaków, możesz iść z wieloma do jednego. Również....,

Samuel H.
źródło
-6

jeden do wielu ma klasę nadrzędną zawierającą n liczby potomków, więc jest to mapowanie kolekcji.

wiele do jednego ma n liczba elementów potomnych zawiera jednego rodzica, więc jest to mapowanie obiektów

chandra
źródło
ta odpowiedź jest dobra i masz dodatkowe informacje, nie rozumiem, dlaczego została przegłosowana, w kontekście jednokierunkowym jeden do wielu i wiele do jednego nie zapewni tej samej jakości kodu w zależności od UX: Jeśli chcesz uzyskać zestaw danych związanych więc jeden do wielu jest mądrzejszy, gdybyś nie potrzebował instrukcji select, w której jakiś warunek jest w porządku, ponieważ zestaw znajduje się na mapie, jednak jeśli użytkownik nie musi pobierać zestawu danych i jest zainteresowany każdym wierszem jako unikalnym Pożądana instancja, więc Wiele do jednego to mądrzejszy wybór
Mohammed Housseyn Taleb
Może to być dobra odpowiedź, ale nie są one takie same: klasa „wiele do jednego” ma klasę nadrzędną zawierającą n liczby dzieci, klasa „jeden do wielu” ma wielu rodziców do jednego dziecka. W SQL może to nie robić różnicy, ponieważ relacja wiele do jednego może być wielokierunkowa, ale w środowisku takim jak Django jest to poważny problem, ponieważ nie ma relacji jeden do wielu i klucza obcego, który radzi sobie z relacją wiele do jednego działa naturalnie tylko w jednym kierunku, nie można tego użyć odwrotnie w ten sam sposób.
iFunction