Como gerir many-to-many junta no sql para programação css3 html5and

Associações internas são uma maneira perfeita de 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ê fingir. 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.

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 uma relação muitos-para-muitos, não há nenhum lado “um”, então 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.

Aqui é a parte complicada.

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.

Compreender as 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 relacionamentos 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 chave estrangeira. Cada registro nessa tabela vincula uma entrada no herói mesa com um no poder mesa.

  • Ele tem uma relação muitos-para-um juntar-se com cada uma das outras duas tabelas. Esta tabela tem uma relação muitos-para-um relacionamento com o herói mesa. Cada registro de hero_power conecta-se a um registro de herói. Da mesma forma, cada ficha de hero_power conecta-se a um recorde de poder.

  • O um-para muitos de 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 é chamada de 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.

Vincular tabelas não são realmente úteis por conta própria porque não contêm dados reais. Geralmente, você usa uma tabela de ligação 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 tabela com o herói mesa com uma junção interna. A segunda parte vincula-se 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 à 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.

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 fornece dados suficientes para descrever tudo na tabela original. Normalmente, você anexar todos esses dados juntos em seu código PHP.

O código é o acesso a 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-gt; setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION) - // obter mais informações para herói $ herói solicitado = "menino binário"- $ query = lt; lt;
query ($ query) - $ result-gt; setFetchMode (PDO :: FETCH_ASSOC) -foreach ($ resultado como $ row) {foreach ($ row quanto $ field = gt; $ value) {print lt; lt;
$ field
$ value
AQUI-} // fim do campo foreach} // foreachprint linha final "
atribuições
n"-impressão "
n"- // criar outra consulta para pegar os poderes $ query = lt; lt;query ($ query) -print "
    n"-foreach ($ resultado como $ row) {foreach ($ row quanto $ field = gt; $ value) {print "
  • $ value
  • n"-} // foreach final} // fim enquanto loopprint "
n"-impressão "
n"-impressão "
n"-} catch (PDOException $ e) {echo `ERROR:`. $ E-gt; getMessage () -} // fim tentar gt;?

Publicações relacionadas