Diferença entre relacionamento um-para-muitos e muitos-para-um


117

Qual é a diferença real entre relacionamento um-para-muitos e muitos-para-um? É apenas invertido, mais ou menos?

Não consigo encontrar nenhum tutorial 'bom e fácil de entender' sobre este tópico além deste: SQL para iniciantes: Parte 3 - Relacionamentos de banco de dados


1
Esta é a explicação perfeita: en.wikipedia.org/wiki/Many-to-many_(data_model)
RobertPitt

@RobertPitt como o artigo muitos-para-muitos é relevante para a pergunta? Você provavelmente quis dizer en.wikipedia.org/wiki/One-to-many_(data_model)
TMG

Respostas:


111

Sim, é vice-versa. Depende de qual lado do relacionamento a entidade está presente.

Por exemplo, se um departamento pode empregar vários funcionários, então, departamento para funcionário é um relacionamento de um para muitos (1 departamento emprega muitos funcionários), enquanto o relacionamento de funcionário para departamento é de muitos para um (muitos funcionários trabalham em um departamento).

Mais informações sobre os tipos de relacionamento:

Relacionamentos de banco de dados - documentação do IBM DB2


2
Receio que isso não faça cenas! ( NÃO tenho certeza, mas ) eu acho que a ordem representa dependência! Não é ?? Por exemplo, um usuário para função pode ser de 1 para muitos, mas não de muitos para um, porque não é possível obter referências do usuário que usa a função! Isso faz sentido?
Amanuel Nega de


29

Nesta página sobre Terminologia de Banco de Dados

A maioria das relações entre as tabelas é de um para muitos.

Exemplo:

  • Uma área pode ser o habitat de muitos leitores.
  • Um leitor pode ter várias assinaturas.
  • Um jornal pode ter muitas assinaturas.

Uma relação de muitos para um é o mesmo que um para muitos, mas de um ponto de vista diferente.

  • Muitos leitores vivem em uma área.
  • Muitas assinaturas podem ser de um mesmo leitor.
  • Muitas assinaturas são para o mesmo jornal.

20

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 Customerpode estar associado a vários Orders.

No relacionamento oposto muitos para um , a tabela local pode ter muitas linhas associadas a uma linha em outra tabela. Em nosso exemplo, muitos Orders 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 Customere Order. Por exemplo, se o cliente tiver colunas ide name:

id,name
1,Bill Smith
2,Jim Kenshaw

Então, para que um Orderseja associado a a Customer, muitas implementações SQL adicionam à Ordertabela uma coluna que armazena o iddo 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_idcoluna 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 Customernão tem colunas extras que descrevem o relacionamento com Order. Na verdade, o Customerpoder também têm um relacionamento um-para-muitos com ShippingAddresse SalesCallmesas e ainda não têm colunas adicionais à Customertabela.

No entanto, para que um relacionamento muitos-para-um seja descrito, geralmente uma idcoluna é adicionada à tabela "muitos" que é uma chave estrangeira para a tabela "um" - neste caso, uma customer_idcoluna é adicionada ao Order. Ao pedido nº 10 associado por $ 12,34 Bill Smith, atribuímos a customer_idcoluna ao Bill Smithid 1 de.

No entanto, também é possível que haja outra tabela que descreva o relacionamento Customere Order, de forma que nenhum campo adicional precise ser adicionado à Ordertabela. Em vez de adicionar um customer_idcampo à Ordertabela, pode haver uma Customer_Ordertabela que contém chaves para Customere 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.


3
O caso geral é chamado de dependência de inclusão. Uma restrição de chave estrangeira é o tipo mais comum de dependência de inclusão, mas nem todas as dependências de inclusão envolvem uma chave estrangeira. O atributo ou atributos comuns (a "referência") sempre existem em ambas as tabelas. No lado "um", esses atributos são chamados de chave candidata. No lado "muitos", podem ser uma chave estrangeira. Os termos "um para muitos" ou "muitos para um" podem ser aplicados a qualquer dependência de inclusão que envolva pelo menos uma chave candidata sem necessariamente implicar qual lado pode ser opcional.
nvogel

@Sqlvogel interessante. Em Java, é javax.persistence.OneToManydiferente do ManyToOne. Você está dizendo que eles são sinônimos ou apenas que depende da implementação? Minha resposta está incorreta?
Gray

2
A questão é sobre bancos de dados relacionais e SQL, não Java. Talvez você esteja certo sobre Java.
nvogel

Eu estava usando como exemplo @sqlvogel. Você está dizendo que "um para muitos" e "muitos para um" são sinônimos?
Gray

2
Estou dizendo que essas são duas maneiras de descrever exatamente o mesmo relacionamento, mas de perspectivas diferentes. Da mesma forma que "A é um subconjunto de B" significa o mesmo que "B é um superconjunto de A".
nvogel

4

Não há diferença. É apenas uma questão de idioma e preferência para definir o relacionamento.


1
Certamente há uma diferença, tanto conceitualmente quanto no esquema gerado. Veja minha resposta: stackoverflow.com/a/37954280/179850
Gray

4
@Cinzento. Não, não há. Sua resposta não está apenas incorreta, ela confunde os iniciantes (aqueles que fazem esta pergunta).
PerformanceDBA

4

A resposta à sua primeira pergunta é: ambos são semelhantes,

A resposta à sua segunda pergunta é: um para muitos -> um homem (mesa MAN) pode ter mais de uma esposa (mesa MULHERES) muitos para um -> mais de uma mulher se casou com um homem.

Agora, se você deseja relacionar esta relação com duas tabelas MAN e WOMEN, uma linha da tabela MAN pode ter muitas relações com as linhas da tabela WOMEN. espero que esteja claro.


3

Exemplo

Duas tabelas com uma relação

SQL

Em SQL, existe apenas um tipo de relacionamento, é chamado de Referência. (Seu front end pode fazer coisas úteis ou confusas [como em algumas das Respostas], mas isso é uma história diferente.)

  • Uma chave estrangeira em uma tabela (o referenc ing tabela)
    Referências
    a chave primária em outra tabela (o referenc ed tabela)
  • Em termos SQL, Bar faz referência a Foo
    Não o contrário

    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
        )
  • Uma vez que Foo.Fooé uma chave primária, é única, há apenas uma linha para qualquer valor deFoo

  • Como Bar.Fooé uma referência, uma chave estrangeira e não há um índice exclusivo nela, pode haver muitas linhas para qualquer valor deFoo
  • Portanto, a relação Foo::Baré de um para muitos
  • Agora você pode perceber (olhar para) a relação ao contrário,Bar::Foo é de muitos para um
    • Mas não se deixe confundir: para qualquer Barlinha, há apenas uma Foolinha que faz referência
  • Em SQL, é tudo o que temos. Isso é tudo o que é necessário.

Qual é a diferença real entre um para muitos e muitos para um relacionamento?

Existe apenas uma relação, portanto não há diferença. A percepção (de um "fim" ou de outro "fim") ou a leitura de trás para frente não muda a relação.

Cardinalidade

A cardinalidade é declarada primeiro no modelo de dados, o que significa Lógico e Físico (a intenção), e depois na implementação (a intenção realizada).

Cardinalidade

Um para zero para muitos
No SQL, isso (acima) é tudo o que é necessário.

Um para um para muitos
Você precisa de um transação para impor o um na tabela de Referência.

Um para zero para um que
você precisa em Bar:

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

Um para um,
você precisa de uma transação para fazer valer o que está na tabela de referência.

Muitos para muitos
Não existe tal coisa no nível Físico (lembre-se, existe apenas um tipo de relação no SQL).

Nos primeiros níveis lógicos durante o exercício de modelagem, é conveniente traçar tal relação. Antes que o modelo chegue perto da implementação, é melhor que ele seja elevado para usar apenas coisas que podem existir. Essa relação é resolvida com a implementação de uma Tabela Associativa.

Resolvido muitos para muitos


1
@Martijn Peters. Posso editá-lo para cumprir o código de conduta. Mas você também removeu (a) explicação e (b) fatos evidenciados na realidade. O que eu faço sobre isso?
PerformanceDBA de

3
Encontre uma maneira diferente de expressar essas coisas sem recorrer a reclamações, xingamentos e calúnias contra o intelecto ou a conduta profissional de ninguém. Concentre-se na tecnologia, não nas pessoas que podem ou não estar erradas.
Martijn Pieters

2

Um-para-Muitos e Muitos-para-Um são semelhantes em Multiplicidade, mas não em Aspectos (ou seja, Direcionalidade).

O mapeamento de associações entre classes de entidade e os relacionamentos entre tabelas. Existem duas categorias de relacionamentos:

  1. Multiplicidade (termo ER: cardinalidade)
    • Relacionamentos um-para-um : exemplo marido e mulher
    • Relacionamentos de um para muitos : exemplo mãe e filhos
    • Relações muitos para muitos : exemplo de aluno e assunto
  2. Direcionalidade : não afeta o mapeamento, mas faz diferença em como podemos acessar os dados.
    • Relacionamentos unidirecionais : um campo ou propriedade de relacionamento que se refere à outra entidade.
    • Relacionamentos bidirecionais : Cada entidade possui um campo ou propriedade de relacionamento que se refere à outra entidade.

Não há "direcionalidade" em um banco de dados relacional. Cada relação tem dois "fins": a Referência (tabela que está sendo referenciada) e a Referência (tabela que faz a referência). SQL / DML permite que qualquer tabela seja referenciada, da maneira que você quiser ... um lado ... o outro lado ... ambos os lados ... nenhum lado.
PerformanceDBA de

0

Não há diferença prática. Apenas use o relacionamento que faz mais sentido, dada a maneira como você vê o seu problema, conforme ilustrado por Devendra.


Certamente há uma diferença, tanto conceitualmente quanto no esquema gerado. Veja minha resposta: stackoverflow.com/a/37954280/179850
Gray

3
@Cinzento. Não, não há. Sua resposta não está apenas incorreta, ela confunde os iniciantes (aqueles que fazem esta pergunta).
PerformanceDBA

0
  • --- Um para muitos --- A Os pais podem ter dois ou mais filhos.
  • --- Muitos para um --- Esses 3 filhos podem ter pais solteiros.

    Ambos são semelhantes. Isso pode ser usado pertence à necessidade. Se você quer encontrar filhos para alguns pais em particular, pode escolher o Um-para-muitos. ou então, quer encontrar pais para gêmeos, você pode ir com o Muitos-para-um. Da mesma forma....,


-6

um-para-muitos tem classe pai contém n número de filhos, portanto, é um mapeamento de coleção.

muitos para um tem n número de filhos contém um pai, então é um mapeamento de objeto


esta resposta é boa e tem informações adicionais não entendo porque foi rejeitada, no contexto unidirecional um para muitos e muitos para um não fornecerá a mesma qualidade de código dependendo da UX: Se você precisar obter um conjunto de dados relacionados então um para muitos é mais sábio se você não precisa de uma instrução select onde alguma condição é boa porque o conjunto está lá no mapa, no entanto, se o usuário não precisar obter o conjunto de dados e estiver interessado em cada linha como um único instância desejada para muitos para um é a escolha mais sábia
Mohammed Housseyn Taleb

Pode ser uma boa resposta, mas eles não são os mesmos: muitos para um tem uma classe pai contendo n número de filhos, um para muitos tem muitos pais para um filho. No SQL pode não fazer diferença, já que o relacionamento muitos-para-um pode ser omnidirecional, mas em um framework como o Django, este é um grande problema, já que não há relacionamento um-para-muitos e a chave estrangeira que lida com o relacionamento Muitos-para-Um só funciona naturalmente em uma direção; isso não pode ser usado da mesma forma ao contrário.
iFunction
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.