Разница между отношениями один-ко-многим и многие-к-одному - PullRequest
104 голосов
/ 05 января 2011

В чем реальная разница между отношениями один-ко-многим и многие-к-одному?Это только перевернуто, вроде?

Я не могу найти «простой и понятный» учебник по этой теме, кроме этой: SQL для начинающих: Часть 3Отношения с базой данных

Ответы [ 10 ]

95 голосов
/ 05 января 2011

Да, это наоборот.Это зависит от того, на какой стороне отношений присутствует сущность.

Например, если в одном отделе могут работать несколько сотрудников, то отношение отдела к сотруднику является отношением один ко многим (в одном отделе работает много сотрудников), а отношение сотрудника к отделу - многие к одному (многие сотрудники работаютодин отдел).

Дополнительная информация о типах отношений:

Отношения с базами данных - документация IBM DB2

28 голосов
/ 05 января 2011

С этой страницы о терминологии базы данных

Большинство отношений между таблицами один-ко-многим.

Пример:

  • Одна область может быть средой обитания многих читателей.
  • Один читатель может иметь много подписок.
  • Одна газета может иметь много подписок.

A Многие дляОдно отношение такое же, как один ко многим, но с другой точки зрения.

  • Многие читатели живут в одной области.
  • Многие подписки могут иметь одну и ту же читательницу.
  • Многие подписки на одну и ту же газету.
15 голосов
/ 21 июня 2016

В чем реальная разница между отношениями «один ко многим» и «многие к одному»?

Существуют концептуальные различия между этими терминами, которые должны помочь вам визуализировать данные, а такжевозможные различия в сгенерированной схеме, которые должны быть полностью поняты.В большинстве случаев разница только в перспективе.

В отношении один-ко-многим локальная таблица имеет одну строку, которая может быть связана со многими строками в другой таблице.В примере из SQL для начинающих один Customer может быть связан со многими Order s.

В противоположном соотношении «многие к одному» ,в локальной таблице может быть много строк, связанных с одной строкой в ​​другой таблице.В нашем примере многие Order могут быть связаны с одним Customer.Это концептуальное различие важно для умственного представления.

Кроме того, схема, которая поддерживает отношения, может быть представлена ​​по-разному в таблицах Customer и Order.Например, если у клиента есть столбцы id и name:

id,name
1,Bill Smith
2,Jim Kenshaw

Тогда для Order, связанного с Customer, многие реализации SQL добавляют в таблицу Orderстолбец, в котором хранится id связанного Customer (в этой схеме customer_id:

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

В приведенных выше строках данных, если мы посмотрим на столбец идентификатора customer_id, мы увидимчто у Bill Smith (идентификатор клиента # 1) есть 2 связанных с ним заказа: один за 12,34 доллара США и один за 7,58 доллара США. Jim Kenshaw (идентификатор клиента № 2) имеет только 1 заказ на сумму 158,01 доллара США.

ЧтоВажно понимать, что обычно отношение «один ко многим» фактически не добавляет никаких столбцов к таблице, которая является «единым целым». У Customer нет дополнительных столбцов, которые описывают отношение с Order. ФактическиCustomer может также иметь отношение один-ко-многим с таблицами ShippingAddress и SalesCall, но при этом в таблицу Customer не добавляются дополнительные столбцы.

Однако для многиходно отношение, которое нужно описать, часто в таблицу «многие» добавляется столбец ide, который является внешним ключом к таблице "one" - в этом случае к Order добавляется столбец customer_id.Соответствующему заказу № 10 на сумму от $ 12,34 до Bill Smith мы присваиваем столбец customer_id идентификатору Bill Smith 1.

Однако возможно также наличие другой таблицы, описывающей Customer и Order, поэтому в таблицу Order не нужно добавлять дополнительные поля.Вместо добавления поля customer_id в таблицу Order может существовать таблица Customer_Order, содержащая ключи как для Customer, так и Order.

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

В этом случае один-ко-многим и много-к-одному являются концептуальными, поскольку между ними нет изменений схемы.Какой механизм зависит от вашей схемы и реализации SQL.

Надеюсь, это поможет.

6 голосов
/ 23 ноября 2012

Ответ на ваш первый вопрос: оба похожи,

Ответ на второй вопрос: один-ко-многим -> мужчина (таблица MAN) может иметь более одной жены (стол ЖЕНЩИН) много-к-одному -> более одной женщины вышли замуж за одного человека .

Теперь, если вы хотите связать это отношение с двумя таблицами MAN и WOMEN, одна строка таблицы MAN может иметь много связей со строками в таблице WOMEN. надеюсь, это ясно.

4 голосов
/ 05 января 2011

Разницы нет. Это просто вопрос языка и предпочтений относительно того, каким образом вы определяете отношения.

2 голосов
/ 17 февраля 2019

Пример

Две таблицы с одним отношением

SQL

В SQL существует только один тип отношений, он называется Ссылка. (Ваш интерфейс может сделать полезные или запутанные вещи [например, в некоторых Ответах], но это другая история.)

  • A Внешний ключ в одной таблице ( ссылка ing таблица)
    Ссылки
    Первичный ключ в другой таблице ( ссылка ed таблица)
  • В терминах SQL Барные ссылки Foo
    Не наоборот

    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
        )
    
  • Поскольку Foo.Foo является первичным ключом, он уникален, для любого заданного значения Foo

  • Поскольку Bar.Foo является ссылкой, внешним ключом, и уникального индекса в нем нет, может быть много строк для любого заданного значения Foo
  • Следовательно, отношение Foo::Bar одно-ко-многим
  • Теперь вы можете воспринимать (взглянуть на) отношение наоборот, Bar::Foo много-к-одному
    • Но не позволяйте этому сбить вас с толку: для любой строки Bar есть только одна строка Foo, на которую она ссылается
  • В SQL это все, что у нас есть. Это все, что нужно.

В чем реальная разница между отношениями один ко многим и многими к одному?

Существует только одно отношение, поэтому нет никакой разницы. Восприятие (от одного «конца» или другого «конца») или чтение его назад не меняет отношения.

Cardinality

Кардинальность объявляется сначала в модели данных, что означает логическое и физическое (намерение), а затем в реализации (реализованное намерение).

Cardinality

Один ко многим
В SQL это (выше) это все, что требуется.

Один к одному ко многим
Вам нужно Транзакция для обеспечения выполнения в таблице ссылок.

Один-к-одному
Вам нужно в Bar:

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

Один на один
Вам нужна транзакция для принудительного выполнения транзакции в таблице ссылок.

Много ко многим
На физическом уровне такого нет (напомним, в SQL существует только один тип отношений).

На ранних логических уровнях во время упражнения по моделированию удобно проводить такую ​​связь. Прежде чем модель приблизится к реализации, ее лучше всего использовать только для того, чтобы существовать. Такое отношение разрешается путем реализации ассоциативной таблицы.

Решено множество ко многим

2 голосов
/ 03 сентября 2017

Один-ко-многим и многие-к-одному похожи по множественности, но не по аспекту (то есть направленности).

Отображение Ассоциации между классами сущностей и Отношения между таблицами.Существует две категории отношений:

  1. Кратность (термин ER: количество элементов)
    • Отношения один-к-одному : пример мужаи жена
    • отношения один-ко-многим : пример матери и детей
    • отношения многие-ко-многим : пример ученика и субъекта
  2. Направленность : Не влияет на отображение, но влияет на то, как мы можем получить доступ к данным.
    • Однонаправленные отношения : Поле или свойство отношения, которое относится к другому объекту.
    • Двунаправленные отношения : Каждый объект имеетполе отношения или свойство, относящееся к другому объекту.
0 голосов
/ 01 февраля 2018
  • --- Один ко многим --- Родители могут иметь двух или более детей.
  • --- Многие к одному --- У этих трех детей могут быть одни родители.

    Оба схожи.Это может быть использовано относится к необходимости.Если вы хотите найти детей для определенных родителей, то вы можете пойти с One-To-Many.или же, если вы хотите найти родителей для близнецов, вы можете пойти с Многие-к-одному.Аналогично ....,

0 голосов
/ 07 августа 2013

Практической разницы нет.Просто используйте отношения, которые наиболее разумны, учитывая то, как вы видите свою проблему, как иллюстрировала Девендра.

0 голосов
/ 07 января 2013

один-ко-многим имеет родительский класс, содержащий n числа дочерних элементов, поэтому это отображение коллекции.

многие-к-одному имеет n номеровУ детей есть один родитель, поэтому это объектное отображение

...