Qual é a diferença real entre relacionamento um-para-muitos e muitos-para-um?
Existem diferenças conceituais entre esses termos que devem ajudá-lo a visualizar os dados e também possíveis diferenças no esquema gerado que devem ser totalmente compreendidos. A diferença, porém, é principalmente de perspectiva.
Em um relacionamento um-para-muitos , a tabela local possui uma linha que pode ser associada a muitas linhas em outra tabela. No exemplo do SQL para iniciantes , um Customer
pode estar associado a vários Order
s.
No relacionamento oposto muitos para um , a tabela local pode ter muitas linhas associadas a uma linha em outra tabela. Em nosso exemplo, muitos Order
s podem estar associados a umCustomer
. Essa diferença conceitual é importante para a representação mental.
Além disso, o esquema que suporta o relacionamento pode ser representado de forma diferente nas tabelas Customer
e Order
. Por exemplo, se o cliente tiver colunas id
e name
:
id,name
1,Bill Smith
2,Jim Kenshaw
Então, para que um Order
seja associado a a Customer
, muitas implementações SQL adicionam à Order
tabela uma coluna que armazena o id
do associado Customer
(neste esquema customer_id
:
id,date,amount,customer_id
10,20160620,12.34,1
11,20160620,7.58,1
12,20160621,158.01,2
Nas linhas de dados acima, se olharmos para a customer_id
coluna id, vemos que Bill Smith
(customer-id # 1) tem 2 pedidos associados a ele: um de $ 12,34 e outro de $ 7,58. Jim Kenshaw
(ID do cliente # 2) tem apenas 1 pedido por $ 158,01.
O que é importante perceber é que normalmente a relação um-para-muitos não adiciona nenhuma coluna à tabela que é "um". O Customer
não tem colunas extras que descrevem o relacionamento com Order
. Na verdade, o Customer
poder também têm um relacionamento um-para-muitos com ShippingAddress
e SalesCall
mesas e ainda não têm colunas adicionais à Customer
tabela.
No entanto, para que um relacionamento muitos-para-um seja descrito, geralmente uma id
coluna é adicionada à tabela "muitos" que é uma chave estrangeira para a tabela "um" - neste caso, uma customer_id
coluna é adicionada ao Order
. Ao pedido nº 10 associado por $ 12,34 Bill Smith
, atribuímos a customer_id
coluna ao Bill Smith
id 1 de.
No entanto, também é possível que haja outra tabela que descreva o relacionamento Customer
e Order
, de forma que nenhum campo adicional precise ser adicionado à Order
tabela. Em vez de adicionar um customer_id
campo à Order
tabela, pode haver uma Customer_Order
tabela que contém chaves para Customer
e Order
.
customer_id,order_id
1,10
1,11
2,12
Nesse caso, o um-para-muitos e muitos-para-um são todos conceituais, pois não há mudanças de esquema entre eles. Qual mecanismo depende de seu esquema e implementação de SQL.
Espero que isto ajude.