Como gerenciar muitos-para-muitos junta em SQL para HTML5and CSS3 Programação

Associações internas são uma maneira perfeita para implementar relacionamentos um-para-muitos SQL para HTML5 e CSS3 programação. Se você olhar para diagramas ER, você vê frequentemente muitos-para-muitos relacionamentos, também. Claro, você também precisa modelá-los. Aqui está o segredo: Você não pode realmente fazê-lo. O modelo de dados relacional não tem realmente uma boa maneira de fazer muitos-para-muitos junta. Em vez disso, você falsificá-lo. Não é difícil, mas é um pouco sorrateiro.

Você usa muitos-para-muitos une para lidar com dados listados, tais como a relação entre o herói e poder. Cada herói pode ter qualquer número de poderes, e cada poder pode pertencer a qualquer número de heróis.

image0.jpg

A junção interna foi fácil, porque você acabou de colocar uma referência de chave estrangeira para um lado da relação na tabela Muitos. Em muitos-para-muitos, não há # 147-one # 148- lado, para onde você coloca a referência? Deixe isso para os cientistas da computação para chegar a uma solução sorrateira.

Note-se que esta tabela não contém qualquer referência aos poderes. Você vê um monte de poderes, mas nenhuma referência a heróis.

image1.jpg

Aqui é a parte complicada.

image2.jpg

Os resultados desta consulta pode surpreendê-lo. A nova tabela contém nada além de chaves estrangeiras. Não faz muito sentido por conta própria, no entanto, representa uma das ideias mais importantes de dados.

Entendendo tabelas de link

o hero_power tabela é uma marca nova tabela, e é reconhecidamente um pato pouco estranho:

  • Ele não contém dados de seu próprio. Muito pouco aparece dentro da tabela.

  • Não se trata de uma entidade. A maioria das tabelas são cerca de entidades em seus dados. Este não é.

  • Trata-se de um relacionamento. Esta tabela é realmente sobre relações entre herói e poder. Cada entrada desta tabela é uma ligação entre o herói e poder.

  • Ele contém duas referências de chaves estrangeiras. Cada registro nessa tabela vincula uma entrada no herói com uma tabela na poder mesa.

  • Tem muitos um-para-um juntar-se com cada uma das outras duas tabelas. Este quadro tem uma muitos-para-um com o relacionamento herói mesa. Cada registro de hero_power conecta-se a um registro de herói. Da mesma forma, cada registro de hero_power conecta-se a um registro de poder.

  • O one-to many-dois junta-se criar uma relação muitos-para-muitos. Aqui é a parte mágica: Ao criar uma tabela com dois many-to-one junta, você cria uma relação muitos-para-muitos entre as tabelas originais!

  • Este tipo de estrutura é denominada tabela de ligação. Vincular tabelas são usadas para criar muitos-para-muitos relacionamentos entre entidades.

Como usar tabelas de link para fazer muitos-para-muitos junta

Aqui está um diagrama ER full-blown dos dados herói.

image3.jpg

Vincular tabelas não são realmente úteis em seu próprio porque não contêm dados reais. Geralmente, você usa uma tabela de link dentro de uma consulta ou exibição:

SELECThero.name AS 'herói', power.name AS 'power'FROMhero, poder, hero_powerWHEREhero.heroID = hero_power.heroIDANDpower.powerID = hero_power.powerID-

Aqui estão alguns pensamentos sobre este tipo de consulta:

  • Ele combina três tabelas. Essa complexidade parece assustador no começo, mas é realmente bom. O ponto de esta consulta é usar o hero_power tabela para identificar relações entre herói e poder. Note-se que o A PARTIR DE cláusula lista todas as três tabelas.

  • o ONDE cláusula tem dois links. A primeira parte do ONDE cláusula vincula-se a hero_power com a tabela herói mesa com uma junção interna. A segunda parte se liga a poder mesa com outro junção interna.

  • Você pode usar outra cláusula para limitar ainda mais os resultados. Claro, você ainda pode adicionar outras partes para o E cláusula para tornar os resultados resolver um problema particular, mas deixar isso quieto por enquanto.

Agora você tem os resultados que você pode usar.

image4.jpg

Mais uma vez, esta consulta é um lugar óbvio para uma visão:

CREATE VIEW heroPowerView ASSELECThero.name AS 'herói', power.name AS 'power'FROMhero, poder, hero_powerWHEREhero.heroID = hero_power.heroIDANDpower.powerID = hero_power.powerID-

Normalmente, você não vai fazer seus resultados exatamente como este ponto de vista. Em vez disso, você exibir informações para, digamos, Boy Binary, e você quer uma lista de seus poderes. Não é necessário dizer Binary Boy três vezes, então você tende a usar duas consultas (ambos de pontos de vista, se possível) para simplificar a tarefa. Por exemplo, olhar para estas duas consultas:

SELECT * DE heroMissionView onde o herói = "poder boy' SELECT binários de heroPowerView onde o herói = 'boy'- binário

A combinação destas consultas lhe dá dados suficientes para descrever tudo na tabela original. Normalmente, você anexar todos esses dados juntos em seu código PHP.

O código de acesso de dados PHP padrão, exceto que ele faz dois passes para o banco de dados:

showDetails.php? Lt; php // connecttry {$ con = new PDO ( 'mysql: host = localhost-dbname = Haio' ", Haio", "Haio") - $ con-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION ) - // obter mais informações para solicitado herói $ herói = "menino binário" - $ query = lt; lt;
query ($ query) - $ result-> setFetchMode (PDO :: FETCH_ASSOC) -foreach ($ resultar quanto $ row) {foreach ($ row quanto $ field => $ value) {print lt; lt;
$ field
$ value
AQUI-} // fim do campo foreach} // fim de linha foreachprint "
atribuições
N "-print"
N "- // criar outra consulta para agarrar a poderes $ query = lt; lt;query ($ query) -print "
    N "-foreach ($ resultado como $ row) {foreach ($ row quanto $ field => $ value) {print"
  • $ value
  • N "-} // foreach final} // fim enquanto loopprint"
N "-print"
N "-print"
N "-} catch (PDOException $ e) {echo 'ERROR:'. $ E-> getMessage () -} // fim tentar>?

menu