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