Разница между отношениями "один ко многим" и "многие к одному"

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

Я не могу найти ни одного "хорошего и простого для понимания" руководства по этой теме, кроме этой: SQL для начинающих: часть 3 - Взаимосвязи между базами данных


person Zhaf    schedule 05.01.2011    source источник
comment
Это прекрасное объяснение: en.wikipedia.org/wiki/Many-to- many_ (data_model)   -  person RobertPitt    schedule 05.01.2011
comment
@RobertPitt, какое отношение статья "многие ко многим" имеет к вопросу? Вы, вероятно, имели в виду en.wikipedia.org/wiki/One-to-many_ (модель_данных)   -  person TMG    schedule 16.12.2019


Ответы (13)


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

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

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

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

person Devendra D. Chavan    schedule 05.01.2011
comment
Боюсь, что сцен не устраивает! (НЕ УВЕРЕН, НО) я думаю, что порядок представляет собой зависимость! Не так ли ?? Например, пользователь для роли может быть от 1 до многих, но не от многих к одному, потому что нельзя получить ссылки на пользователя, который использует роль! Имеет ли это смысл? - person Amanuel Nega; 10.11.2014
comment
Возможно, отношения с базами данных сейчас? - person fragorl; 27.07.2017
comment
Но что, если один сотрудник может работать только в одном отделе? Хм? Не бывает таких «Многие к одному». - person Jin Lim; 26.12.2020
comment
Это правильно, но я считаю, что это требует дальнейшего объяснения, обоснования с технической точки зрения. Разработчик должен понимать разницу между РСУБД, ORM и объектно-реляционной СУБД. Смотрите мой ответ. - person Athanassios; 16.04.2021

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

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

Пример:

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

Отношение «многие к одному» аналогично отношению «один ко многим», но с другой точки зрения.

  • Многие читатели живут в одном районе.
  • Многие подписки могут принадлежать одному и тому же читателю.
  • Многие подписки идут на одну и ту же газету.
person nathan gonzalez    schedule 05.01.2011

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

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

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

В противоположном отношении многие-к-одному в локальной таблице может быть много строк, связанных с одной строкой в ​​другой таблице. В нашем примере многие 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 id, мы увидим, что Bill Smith (идентификатор клиента # 1) имеет 2 связанных с ним заказа: один на 12,34 доллара и один на 7,58 доллара. Jim Kenshaw (идентификатор клиента №2) имеет только 1 заказ на сумму 158,01 доллара США.

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

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

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

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

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

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

person Gray    schedule 21.06.2016
comment
Общий случай называется зависимостью включения. Ограничение внешнего ключа является наиболее распространенным типом зависимости включения, но не все зависимости включения включают внешний ключ. Общий атрибут или атрибуты (ссылка) всегда существуют в обеих таблицах. С одной стороны, эти атрибуты называются ключом-кандидатом. Во многих случаях они могут быть внешним ключом. Термины «один ко многим» или «многие к одному» могут применяться к любой зависимости включения, которая включает по крайней мере один ключ-кандидат, не обязательно подразумевая, какая сторона может быть необязательной. - person nvogel; 22.06.2016
comment
Интересный @sqlvogel. В Java javax.persistence.OneToMany отличается от ManyToOne. Вы говорите, что они синонимичны или это зависит от реализации? Мой ответ неверен? - person Gray; 22.06.2016
comment
Речь идет о реляционных базах данных и SQL, а не о Java. Может, насчет Java вы правы. - person nvogel; 22.06.2016
comment
Я использовал это как пример @sqlvogel. Вы хотите сказать, что «один ко многим» и «многие к одному» являются синонимами? - person Gray; 22.06.2016
comment
Я говорю, что это два способа описания одних и тех же отношений, но с разных точек зрения. Точно так же, как A является подмножеством B, означает то же самое, что B является надмножеством A. - person nvogel; 25.06.2016
comment
Грей, последние два абзаца мне показались одинаковыми. Как реализовать many-to-one? Я думал, вы сказали, что он добавляет столбцы к стороне one ... - person Alexander Suraphel; 28.02.2017
comment
Я изменил свой ответ @AlexanderSuraphel. Столбец id часто добавляется в таблицу many. Идентификатор ссылается (указывает на) на one таблицу. - person Gray; 28.02.2017
comment
Грей, я не знаю, упускаю ли я что-то очевидное, но из ОБОИХ случаев я читаю, что на стороне one нет столбца. В чем тогда разница? - person Alexander Suraphel; 01.03.2017
comment
Правильно @AlexanderSuraphel. Итак, разница в том, что на стороне Account у него есть @OneToMany, а на стороне Order есть @ManyToOne, который добавляет accountId к сущности Order. Опять же, разница концептуальная. - person Gray; 01.03.2017

SQL

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

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

  • Внешний ключ в одной таблице (справочная таблица)
    Ссылки
    a Первичный ключ в другой таблице (ссылочная ed таблица)

  • С точки зрения SQL, Bar указывает на 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 - это многие к одному

    • But do not let that confuse you: for any one Bar row, there is just one Foo row that it References
  • В SQL это все, что у нас есть. Это все, что нужно.

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

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

Мощность

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

Количество элементов

От одного к нулю ко многим
В SQL это все, что требуется.

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

Один к нулю к одному
Вам нужно Bar:

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

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

Многие ко многим

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

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

Решено

person PerformanceDBA    schedule 17.02.2019
comment
@Martijn Peters. Я могу отредактировать его в соответствии с кодексом поведения. Но вы также удалили (а) объяснение и (б) факты, подтверждающие реальность. Что мне с этим делать? - person PerformanceDBA; 17.02.2019
comment
Найдите другой способ выразить эти вещи, не прибегая к разглагольствованию, обзывам и клевете на чей-либо интеллект или профессиональное поведение. Сосредоточьтесь на технологиях, а не на людях, которые могут ошибаться или нет. - person Martijn Pieters; 17.02.2019

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

person nvogel    schedule 05.01.2011
comment
Разумеется, разница есть как в концептуальном плане, так и в сгенерированной схеме. См. Мой ответ: stackoverflow.com/a/37954280/179850 - person Gray; 21.06.2016
comment
@Серый. Нет, нет. Ваш ответ не только неверен, он сбивает с толку новичков (задающих этот вопрос). - person PerformanceDBA; 17.02.2019

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

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

  1. Кратность (термин ER: количество элементов)
  • Индивидуальные отношения (сокращенно 1: 1): пример мужа и жены
  • Отношения "один ко многим" (сокращенно 1: N): пример "Мать и дети"
  • Отношения "многие ко многим" (сокращенно M: N): пример ученика и предмет
  1. Направленность: не влияет на отображение, но влияет на то, как мы можем получить доступ к данным.
  • Однонаправленные отношения: поле или свойство отношения, которое относится к другой сущности.
  • Двунаправленные отношения. Каждая сущность имеет поле или свойство отношения, которое ссылается на другую сущность.
person Premraj    schedule 03.09.2017
comment
В реляционной базе данных нет направленности. У каждого отношения есть два конца: Ссылка (ссылка на таблицу) и Ссылка (таблица, на которую ссылаются). SQL / DML позволяет ссылаться на любую таблицу любым способом… с одной стороны… с другой стороны… с обеих сторон… без сторон. - person PerformanceDBA; 17.02.2019
comment
@PerformaceDBA - если отношение имеет ограничение внешнего ключа, то есть направленность, - person Jason210; 29.01.2021
comment
@ Jason210 1) В SQL DDL для установления связи необходимо указать ограничение FOREIGN KEY. Следовательно, все отношения являются ограничениями FK. 2) То есть на физическом уровне DDL, игнорируя логический (вот в чем вопрос). Реляционная модель логична. С логической точки зрения, при кодировании SQL DML связь имеет два конца, она не ограничивается тем, что декларирует DDL. - person PerformanceDBA; 06.05.2021
comment
для получения дополнительной информации relationaldbdesign.com/database-design/module6/ - person Premraj; 20.06.2021

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

Ответ на ваш второй вопрос: один-ко-многим -> МУЖЧИНА (таблица МУЖЧИНА) может иметь более одной жены (ЖЕНСКАЯ таблица) многие-к-одному -> более одной женщины вышли замуж за одного МУЖЧИНА.

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

person pal    schedule 23.11.2012
comment
Если вы проголосовали против, вы должны предложить более подходящий пример, чем полигиния. - person toong; 22.10.2020

Это отличный вопрос, по моему опыту, в диаграммах ERD и реляционных базах данных подразумевается направление. В РСУБД вы всегда определяете отношения «многие-к-одному» (тривиальный случай «Один-к-одному»). Многосторонняя сторона отношений, также известная как дочерние элементы, ссылается на одну сторону, также известную как родитель, и вы реализуете это с помощью ограничения внешнего ключа. С технической точки зрения вам нужно получить доступ к индексу, получить запись первичного ключа на стороне One, а затем посетить эту запись, чтобы получить дополнительную информацию.

Вы не можете сделать это наоборот, если мы не говорим об объектно-реляционных СУБД, таких как Postgres, Intersystems Cache и т. Д. Эти СУБД позволяют вам определять двунаправленную связь между двумя объектами (таблицами). В этом случае доступ к записям осуществляется наоборот, то есть One - To - ›Many достигается за счет использования массива ссылок (дочерних элементов). В ORM у вас есть классы, которые ссылаются друг на друга так же, как мы описали здесь.

ВНИМАНИЕ: Большинство СУБД на ИТ-рынке НЕ являются системами управления реляционными базами данных в строгом смысле слова, подумайте о нулевых значениях, дублированных записях и т. Д., Многие из этих разрешенных функций нарушают определение того, что такое отношение.

person Athanassios    schedule 16.04.2021
comment
Коммерческие SQL-платформы СУБД (кроме Oracle) являются реляционными. Бесплатная программа не является реляционной (допускает использование запрещенных объектов, таких как циклические ссылки) и не совместима с SQL. - person PerformanceDBA; 06.05.2021

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

person Tom Bell    schedule 07.08.2013
comment
@Серый. Нет, нет. Ваш ответ не только неверен, он сбивает с толку новичков (задающих этот вопрос). - person PerformanceDBA; 17.02.2019

Отношения «один ко многим» и «многие к одному» говорят об одних и тех же логических отношениях, например, у владельца может быть много домов, но у дома может быть только один владелец.

Итак, в этом примере владелец - один, а дома - множество. У каждого дома всегда есть owner_id (например, внешний ключ) в качестве дополнительного столбца.

Разница в реализации между этими двумя вариантами заключается в том, какая таблица определяет взаимосвязь. В «Один ко многим» отношения определяются именно владельцем. Например, owner1.homes перечисляет все дома с идентификатором owner_id owner1. В Many-to-One отношение определяется домом. Например, home1.owner перечисляет owner1's owner_id.

На самом деле я не знаю, в каком случае вы бы реализовали схему «многие к одному», потому что это кажется немного избыточным, поскольку вы уже знаете owner_id. Возможно, это связано с чистотой удалений и изменений.

person james    schedule 15.10.2020

  • --- Один ко многим --- Родитель может иметь двух или более детей.

  • --- Многие к одному --- У этих трех детей может быть один родитель

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

person Samuel H    schedule 01.02.2018

Самым простым объяснением этих отношений я могу дать evendra D. Chavan'sanswer.

Использование отношений отдела и сотрудников

В отделе может быть несколько сотрудников, поэтому со стороны сотрудников это one-to-many отношения, а со стороны отдела это many-to-one relationship

Но если сотрудник может принадлежать более чем к одному отделу, мы также можем сказать со стороны сотрудника, что теперь он many, а не one, поэтому отношение становится many-to-many

Проще говоря, можно сказать, что мы можем заявить, что отношения many-to-many, если one-to-many можно рассматривать с обеих сторон, то есть если;

  • один сотрудник может принадлежать к нескольким отделам (one-to-many)
  • в одном отделе может быть много сотрудников (one-to-many)
person Onengiye Richard    schedule 13.06.2021

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

many-to-one имеет n дочерних элементов, содержит одного родительского элемента, поэтому это сопоставление объектов

person chandra    schedule 07.01.2013
comment
этот ответ хорош, и у вас есть дополнительная информация, не понимаю, почему он был отклонен, в однонаправленном контексте один ко многим и многие к одному не обеспечат одинакового качества кода в зависимости от UX: если вам нужно получить набор данных, связанных так что один ко многим мудрее, если вам не нужен оператор выбора, где какое-то условие в порядке, потому что набор есть на карте, однако, если пользователю не нужно получать набор данных и он интересуется каждой строкой как уникальной желаемый экземпляр, поэтому многие к одному - более разумный выбор - person Mohammed Housseyn Taleb; 14.02.2019
comment
Это может быть хороший ответ, но это не одно и то же: многие-к-одному имеют родительский класс, содержащий n детей, а один-ко-многим - много родительских классов для одного ребенка. В SQL это может не иметь значения, поскольку отношение «многие к одному» может быть всенаправленным, но в такой структуре, как Django, это серьезная проблема, поскольку нет отношения «один ко многим» и внешнего ключа, который имеет дело с отношением "многие-к-одному", естественно, работает только в одном направлении, это не может быть использовано таким же образом в обратном направлении. - person iFunction; 29.07.2019
comment
То, что пишет @MohammedHousseynTaleb, верно для объектно-реляционных СУБД и ORM, см. Мой ответ для обоснования. Несправедливо понижать его в рейтинге, не оправдав должным образом своих действий. - person Athanassios; 16.04.2021