В чем реальная разница между отношениями «один ко многим» и «многие к одному»?
Между этими терминами существуют концептуальные различия, которые должны помочь вам визуализировать данные, а также возможные различия в сгенерированной схеме, которые следует полностью понять. В основном разница заключается в перспективе.
В отношении один-ко-многим в локальной таблице есть одна строка, которая может быть связана со многими строками в другой таблице. В примере из 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