Diferença entre uma junção teta, junção equijoin e junção natural


92

Estou tendo problemas para entender álgebra relacional quando se trata de junções theta, equijoins e junções naturais. Alguém poderia me ajudar a entender melhor? Se eu usar o sinal = em uma junção theta, é exatamente o mesmo que usar uma junção natural?


re a citação em questão do bounty ... ele não está citando Codd, ele está citando minha resposta sob a qual seu comentário aparece.
heisenberg

Respostas:


138

Uma junção theta permite relacionamentos de comparação arbitrários (como ≥).

Um equijoin é uma junção theta usando o operador de igualdade.

Uma junção natural é uma junção equivalente em atributos que têm o mesmo nome em cada relacionamento.

Além disso, uma junção natural remove as colunas duplicadas envolvidas na comparação de igualdade, de forma que apenas 1 de cada coluna comparada permanece; em termos algébricos relacionais aproximados: ⋈ = πR,S-as ○ ⋈aR=aS


13
a junção natural removerá as colunas com o mesmo nome
Bogdan Gavril MSFT

2
Todos eles ou todos menos um?
Christopher Shroba,

Equijoin também removerá a coluna de igualdade se eles tiverem o mesmo nome em ambas as tabelas.
Vishal R

1
@outis, O que significa "theta" em "theta join"?
Pacerier

2
@Pacerier: Historicamente, a thetajunção in theta refere-se a uma condição arbitrária usada como critério para a junção. (ver Database Systems: The Complete Book by Garcia-Molina, Ullman, Widom, capítulo 2, Theta Join)
Ram Rajamony

55

Embora as respostas que explicam as diferenças exatas sejam boas, quero mostrar como a álgebra relacional é transformada em SQL e qual é o valor real dos 3 conceitos.

O conceito principal em sua pergunta é a ideia de uma junção. Para entender uma junção, você precisa entender um Produto Cartesiano (o exemplo é baseado em SQL onde o equivalente é chamado de junção cruzada como onedaywhen aponta);

Isso não é muito útil na prática. Considere este exemplo.

Product(PName, Price)
====================
Laptop,   1500
Car,      20000
Airplane, 3000000


Component(PName, CName, Cost)
=============================
Laptop, CPU,    500
Laptop, hdd,    300
Laptop, case,   700
Car,    wheels, 1000

O produto cartesiano Produto x Componente será - abaixo ou sql fiddle . Você pode ver que há 12 linhas = 3 x 4. Obviamente, linhas como "Laptop" com "rodas" não têm significado, é por isso que na prática o produto cartesiano raramente é usado.

|    PNAME |   PRICE |  CNAME | COST |
--------------------------------------
|   Laptop |    1500 |    CPU |  500 |
|   Laptop |    1500 |    hdd |  300 |
|   Laptop |    1500 |   case |  700 |
|   Laptop |    1500 | wheels | 1000 |
|      Car |   20000 |    CPU |  500 |
|      Car |   20000 |    hdd |  300 |
|      Car |   20000 |   case |  700 |
|      Car |   20000 | wheels | 1000 |
| Airplane | 3000000 |    CPU |  500 |
| Airplane | 3000000 |    hdd |  300 |
| Airplane | 3000000 |   case |  700 |
| Airplane | 3000000 | wheels | 1000 |

JOINs estão aqui para agregar mais valor a esses produtos. O que realmente queremos é "unir" o produto com seus componentes associados, pois cada componente pertence a um produto. A maneira de fazer isso é com uma junção:

Componente JOIN do produto ON Pname

A consulta SQL associada seria assim (você pode brincar com todos os exemplos aqui )

SELECT *
FROM Product
JOIN Component
  ON Product.Pname = Component.Pname

e o resultado:

|  PNAME | PRICE |  CNAME | COST |
----------------------------------
| Laptop |  1500 |    CPU |  500 |
| Laptop |  1500 |    hdd |  300 |
| Laptop |  1500 |   case |  700 |
|    Car | 20000 | wheels | 1000 |

Observe que o resultado tem apenas 4 linhas, pois o Laptop tem 3 componentes, o Carro tem 1 e o Avião nenhum. Isso é muito mais útil.

Voltando às suas perguntas, todas as junções sobre as quais você pergunta são variações do JOIN que acabei de mostrar:

Junção natural = a junção (a cláusula ON) é feita em todas as colunas com o mesmo nome; remove colunas duplicadas do resultado, ao contrário de todas as outras junções; a maioria dos SGBDs (sistemas de banco de dados criados por vários fornecedores, como SQL Server da Microsoft, MySQL da Oracle etc.) nem mesmo se preocupam em oferecer suporte a isso, é apenas uma prática ruim (ou optou propositalmente por não implementá-lo). Imagine que um desenvolvedor venha e altere o nome da segunda coluna em Produto de Preço para Custo. Então, todas as junções naturais seriam feitas em PName E em Cost, resultando em 0 linhas, pois nenhum número corresponde.

Theta Join = esta é a junção geral que todos usam, pois permite que você especifique a condição (a cláusula ON no SQL). Você pode aderir a praticamente qualquer condição que desejar, por exemplo, em Produtos que tenham as 2 primeiras letras semelhantes ou que tenham um preço diferente. Na prática, raramente é o caso - em 95% dos casos, você ingressará em condição de igualdade, o que nos leva a:

Equi Join = o mais comum usado na prática. O exemplo acima é uma junção equi. Os bancos de dados são otimizados para este tipo de junções! O oposto de uma junção equi é uma junção não equi, ou seja, quando você junta em uma condição diferente de "=". Bancos de dados não são otimizados para isso! Ambos são subconjuntos da junção teta geral. A junção natural também é uma junção theta, mas a condição (theta) está implícita.

Fonte da informação: universidade + desenvolvedor certificado em SQL Server + completou recentemente o MOO "Introdução aos bancos de dados" de Stanford, então ouso dizer que tenho álgebra relacional fresca em mente.


1
Você usa o termo 'produto cartesiano' um tanto vagamente. O produto do operador relacional resulta em uma relação (em comum com todos os operadores relacionais!) Uma CROSS JOINoperação em SQL resulta em uma expressão de tabela (linhas de colunas). O produto cartesiano da operação de conjunto resulta em um conjunto de pares.
dia em

1
Quando você diz "Bancos de dados", você realmente quer dizer "SGBDs", uma diferença crucial ao abordar os 'conceitos'.
dia em

2
um dia quando - obrigado por todos os comentários úteis! parece uma revisão de código :). Corrigi o produto cartesiano e problemas de SGBD. Eu mantenho minha opinião de que as junções naturais são apenas de interesse acadêmico e DBMSs importantes, como o SQL Server, não implementam isso de propósito - adicionar uma condição explicitamente leva a uma melhor compreensão e manutenção do código. Uma pergunta relacionada: stackoverflow.com/questions/4826613/natural-join-in-sql-server
Bogdan Gavril MSFT

1
@HLGEM: pode-se fazer argumentos semelhantes contra SELECT * FROM...(e talvez você faça). Mas está na linguagem, está em cada implementação SQL e eu o uso com frequência (e aposto que você também!) Dica nem todo código é código de produção.
quando

1
O verdadeiro problema com a coluna unida "natural" não é sobre a mudança de nomes, mas a adição de novos nomes que não devem conflitar entre todas as tabelas possivelmente unidas no sistema. Pegue colunas muito comuns, como "nome", "descrição", ... O uso de "junção natural" fará com que sejam unidas, ao passo que não faz sentido e mais vai contra a lógica de negócios e leva a erros. Portanto, sim, "junção natural" é perigosa. Isso força você a ter nomes distintos, exceto para colunas de chave (primária / estrangeira) e perder o "espaçamento de nome".
LoganMzz

14

A resposta de @outis é boa: concisa e correta nas relações.

No entanto, a situação é um pouco mais complicada no que diz respeito ao SQL.

Considere os fornecedores usuais e banco de dados de peças, mas implementado em SQL:

SELECT * FROM S NATURAL JOIN SP;

retornaria um conjunto de resultados ** com colunas

SNO, SNAME, STATUS, CITY, PNO, QTY

A junção é realizada na coluna com o mesmo nome em ambas as tabelas SNO,. Observe que o conjunto de resultados possui seis colunas e contém apenas uma coluna para SNO.

Agora, considere um theta eqijoin, em que os nomes das colunas para a junção devem ser especificados explicitamente (além de variáveis ​​de intervalo Se SPsão obrigatórios):

SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;

O conjunto de resultados terá sete colunas, incluindo duas colunas para SNO. Os nomes do conjunto de resultados são o que o padrão SQL chama de "dependente da implementação", mas podem ter a seguinte aparência:

SNO, SNAME, STATUS, CITY, SNO, PNO, QTY

ou talvez isso

S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY

Em outras palavras, NATURAL JOINem SQL pode ser considerado a remoção de colunas com nomes duplicados do conjunto de resultados (mas infelizmente não removerá linhas duplicadas - você deve se lembrar de mudar SELECTpara SELECT DISTINCTvocê mesmo).


** Não sei bem qual é o resultado SELECT * FROM table_expression;. Sei que não é uma relação porque, entre outros motivos, pode ter colunas com nomes duplicados ou uma coluna sem nome. Sei que não é um conjunto porque, entre outros motivos, a ordem das colunas é significativa. Não é nem mesmo uma tabela SQL ou expressão de tabela SQL. Eu chamo isso de conjunto de resultados.


O mesmo vale para JOIN ... USING(...).
Benoit,

Por que você diz "Não sei bem qual é o resultado de SELECT * FROM table_expression;" ?
Pacerier

@Pacerier: erm, porque não sei o que é! Da última vez que olhei, o SQL Standard evitou definir o que é. Eu sei o que não é (nem uma relação, nem um conjunto, nem uma mesa, nem uma expressão de mesa). Portanto, para facilidade de referência, usei meu próprio termo, 'conjunto de resultados'. Observe que no modelo relacional o resultado de uma operação envolvendo duas relações é uma relação. A declaração equivalente não pode ser feita para SQL AFAIK.
dia em

11

Natural é um subconjunto de Equi, que é um subconjunto de Theta.

Se eu usar o sinal = em uma junção theta, será exatamente o mesmo que usar uma junção natural ??

Não necessariamente, mas seria um Equi. Natural significa que você está combinando em todas as colunas com nomes semelhantes, Equi apenas significa que você está usando '=' exclusivamente (e não 'menos que', como, etc)

No entanto, isso é puro meio acadêmico. Você poderia trabalhar com bancos de dados relacionais por anos e nunca ouvir ninguém usar esses termos.


Eu suspeito que quando você diz "bancos de dados relacionais", eu suspeito que você queira dizer outra coisa, por exemplo, "SQL".
dia em

Trabalho que não é acadêmico com bancos de dados relacionais que não são SQL? Então, quais produtos você quer dizer?
dia em

3
Na álgebra original de Codd, a junção natural é o tipo fundamental de junção, ao passo que uma "junção" equi- ou theta- é uma abreviação para um NJ (por exemplo, produto cruzado) seguido por uma restrição. "Natural é um subconjunto de Equi que é um subconjunto de Theta" presumivelmente o que isso significa é que cada NJ também pode ser expresso como um EJ ou TJ. Suponho que isso seja verdade se σ 1 = 1 (A x B) conta como um equijoin, caso em que cada operação da álgebra relacional poderia ser expressa como um equijoin nessa forma. A ambigüidade aqui é que há mais de um conjunto possível de operadores fundamentais para o RA.
nvogel

2
@EricFail: sqlvogel está apenas citando a resposta de kekekela, ao invés de qualquer coisa de Codd. Se você quiser mais sobre os escritos de Codd sobre joins (θ ou outro), pode tentar "O modelo relacional para gerenciamento de banco de dados" ou trabalhar seu caminho por meio de sua bibliografia .
outis

1
... A pergunta para a qual você vincula tem uma resposta que se aproxima do que você está procurando, provavelmente o mais próximo possível. Ele se vincula a Relational Completeness of Data Base Sublanguages . P. 10 descreve a conexão entre θ, = e junções naturais (embora naturais não sejam estritamente subconjuntos de = na formulação de Codd, mas sim a projeção de = -junções).
outis

7

Junção Theta: Quando você faz uma consulta para junção usando qualquer operador, (por exemplo, =, <,>,> = etc.), então essa consulta de junção vem sob junção Theta.

Equi Join: Quando você faz uma consulta por junção usando apenas o operador de igualdade, essa consulta de junção vem sob a junção Equi.

Exemplo:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID;
> SELECIONE * DE Emp INNER JOIN Dept USING (DeptID)
Isso mostrará:
 _________________________________________________
| Emp.Name | Emp.DeptID | Dept.Name | Dept.DeptID |
| | | | |

Nota: Equi join também é theta join!

Junção natural: um tipo de junção Equi que ocorre implicitamente ao comparar todas as mesmas colunas de nomes em ambas as tabelas.

Nota: aqui, o resultado da junção tem apenas uma coluna para cada par de colunas com o mesmo nome.

Exemplo

 SELECIONE * DO DEpt. Emp NATURAL JOIN
Isso mostrará:
 _______________________________
| DeptID | Emp.Name | Dept.Name |
| | | |

1

O produto cartesiano de duas tabelas fornece todas as combinações possíveis de tuplas, como o exemplo da matemática, o produto vetorial de dois conjuntos. já que muitas vezes existem alguns valores inúteis que ocupam espaço desnecessário na memória também, então aqui vem o resgate de junções que fornecem a combinação apenas daqueles valores de atributo que são necessários e são significativos.

a junção interna fornece o campo repetido na tabela duas vezes, enquanto a junção natural aqui resolve o problema apenas filtrando as colunas repetidas e exibindo-as apenas uma vez. Do contrário, ambos funcionam da mesma forma. a junção natural é mais eficiente, pois preserva a memória. Além disso, as redundâncias são removidas na junção natural.

A junção equi de duas tabelas é tal que exibem apenas as tuplas que correspondem ao valor da outra tabela. por exemplo: sejam new1 e new2 duas tabelas. if sql query select * from new1 join new2 on new1.id = new.id (id é a mesma coluna em duas tabelas) então comece a partir da tabela new2 e join que corresponde ao id na segunda tabela. além disso, non equi join não tem operador de igualdade, eles têm <,> e operador entre.

theta join consiste em todos os operadores de comparação, incluindo igualdade e outros <,> operadores de comparação. quando usa o operador de igualdade (=), é conhecido como junção de equi.


0

Junção natural: a junção natural pode ser possível quando há pelo menos um atributo comum em duas relações.

União Theta: A união Theta pode ser possível quando dois agem em uma condição específica.

Equi Join: Equi pode ser possível quando dois atuam na condição de igualdade. É um tipo de junção theta.

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.