Разница между отношениями «один ко многим» и «многие к одному»
-
25-09-2019 - |
Вопрос
В чем реальная разница между отношениями «один ко многим» и «многие к одному»?Это только наоборот, что ли?
Я не могу найти никакого «хорошего и простого для понимания» руководства по этой теме, кроме этого: SQL для начинающих:Часть 3. Отношения с базой данных
Решение
Да, это наоборот. Это зависит от того, на какой стороне отношений присутствует сущность.
Например, если один отдел может использовать для нескольких сотрудников, затем отдел сотрудника представляет собой один со многими отношениями (1 отдел использует многие сотрудники), а сотрудника к отношениям отделения состоит в том, что многие сотрудники работают в одном отделении).
Больше информации На типы отношений:
Другие советы
Из этого Страница о терминологии базы данных
Большинство отношений между таблицами являются однозначными.
Пример:
- Одна область может быть средой обитания многих читателей.
- Один читатель может иметь много подписок.
- Одна газета может иметь много подписок.
Многим к одному соотношению такое же, как однозначное, но с другой точки зрения.
- Многие читатели живут в одной области.
- Многие подписки могут быть из одного и того же читателя.
- Многие подписки предназначены для одной и той же газеты.
В чем реальная разница между отношениями «один ко многим» и «многие к одному»?
Между этими терминами существуют концептуальные различия, которые помогут вам визуализировать данные, а также возможные различия в сгенерированной схеме, которые следует полностью понять.Хотя в основном разница заключается в перспективе.
В один ко многим В связи с этим в локальной таблице есть одна строка, которая может быть связана со многими строками в другой таблице.В примере из SQL для начинающих, один Customer
может быть связано со многими Order
с.
В противоположность многие к одному отношения, локальная таблица может иметь множество строк, связанных с одной строкой в другой таблице.В нашем примере многие Order
s может быть связан с одним 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
столбец в Bill Smith
идентификатор 1.
Однако возможна и другая таблица, описывающая Customer
и Order
связь, поэтому не нужно добавлять дополнительные поля в Order
стол.Вместо добавления customer_id
поле в Order
стол, там может быть Customer_Order
таблица, содержащая ключи для обоих Customer
и Order
.
customer_id,order_id
1,10
1,11
2,12
В этом случае один ко многим и многие к одному все концептуально, поскольку между ними нет изменений схемы.Какой механизм зависит от вашей схемы и реализации SQL.
Надеюсь это поможет.
Ответ на ваш первый вопрос: оба похожи,
Ответ на ваш второй вопрос: один-ко многим -> человек (стол человека) может иметь более одной жены (столик женщин), многие-к-одному -> больше, чем одна женщина замужем в браке одного человека.
Теперь, если вы хотите связать это отношение с двумя столами человека человека и женщинами, один ряд на столе человека может иметь много отношений со строками в женском столе. Надеюсь, понятно.
Нет никакой разницы. Это просто вопрос языка и предпочтений, как к тому, к какому пути вы указываете отношения.
Пример
Две таблицы с одним соотношением
SQL.
В SQL есть только один вид отношений, он называется ссылкой. (Ваш передний конец может сделать полезные или запутанные вещи [например, в некоторых ответах], но это другая история.)
- А. Внешний ключ в одной таблице ( рефератвспомогательный стол)
использованная литература
а. Первичный ключ в другой таблице ( рефератред стол) В условиях 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 первым объявляется в модели данных, что означает логичную и физическую (намерение), а затем в реализации (намерение реализовано).
Один к нулю-многим
В SQL, что (вышеупомянутое) все, что требуется.
От одного до однозначного
Ты нуждаешься в Сделка Обеспечить принуждение того на ссылке на ссылке.
Один до нуля до одного
Вам нужно Bar
:
CONSTRAINT AK -- constraint name
UNIQUE (Foo) -- unique column, which makes it an Alternate Key
Один к одному
Ты нуждаешься в Сделка Обеспечить принуждение того на ссылке на ссылке.
Много для многих
Там нет такой вещи на физическом уровне (вспомнить, есть только один тип отношения в SQL).
На ранних логических уровнях во время упражнений моделирования это удобный нарисовать такое отношение. Перед тем, как модель приблизится к реализации, лучше использовать только вещи, которые могут существовать. Такое отношение разрешено путем реализации ассоциативной таблицы.
Один-ко многим и много к одному аналогично кратности, но не аспект (то есть направленность).
Сопоставление Ассоциации между классами сущности и Отношения между таблицами. Есть две категории отношений:
- Множество (ER срок: кардинальность)
- Отношения в одну к одному: Пример муж и жена
- Отношения из одной ко многим: Пример матери и дети
- Отношения многих ко многим: Пример студента и предмета
- Направленность : Не влиять на сопоставление, но разница в том, как мы можем получить доступ к данным.
- УНИ-Направленные отношения: Поле отношения или имущество, которое относится к другому объекту.
- Двунаправленные отношения: Каждая сущность имеет поле отношения или свойство, которое относится к другому объекту.
Там нет практической разницы. Просто используйте отношения, которые имеют наибольшее значение, данное, как вы видите свою проблему, как проиллюстрирована Девендра.
- --- Один ко многим --- родители могут иметь два или более детей.
--- Многие до одного --- эти 3 детей могут иметь одиноких родителей.
Оба похожи. Это может быть использовано относится к необходимости. Если вы хотите найти детей для конкретных родителей, то вы можете пойти с однимзначным. Или не хочу найти родителей для близнецов, вы можете пойти со многими на один. Так же....,
один ко многим Имеет родительский класс в количестве детей, так что это сопоставление коллекции.
много до одного имеет n количество детей содержит один родитель, так что это отображение объекта