Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores

340 views

Published on

Com o grande crescimento da utilização dos Frameworks, muitos Desenvolvedores deixam para que esses resolvam todos os 'problemas' referentes a SQL, mas temos muitos casos que nada melhor que um SQL direto no banco de dados para resolver seu problema da melhor forma. O objetivo dessa palestra é mostrar algumas boas práticas aos desenvolvedores na utilização de SQL que possam aumentar sua produtividade e assertividade no dia a dia.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores

  1. 1. Globalcode – Open4education Fernando Franquini - Capin Profissional da área de TIC a mais de 18 anos, atuando a mais de 10 anos como DBA em projetos de desenvolvimento de Software principalmente com JAVA. Boas Práticas de SQL em Banco Relacional para Devs
  2. 2. Globalcode – Open4education Agenda Apresentação Projeção Chaves Joins Views e Triggers Bind Variables ANSI Exemplo Real
  3. 3. Globalcode – Open4education Apresentação Quem sou? Quem vocês são? Já criou e executou instrução SQL direto no BD Já analisou instrução SQL enviada ao BD Nunca viu SQL! Agora: Que diabos faz um DBA em uma trilha de JAVA?
  4. 4. Globalcode – Open4education Projeção Todos sabem o que é a Projeção do SQL? Conteúdo da Projeção Sub Select na Projeção Função na Projeção
  5. 5. Globalcode – Open4education Projeção /* select t from Team t */ select team0_.id as id1_11_, team0_.arena as arena2_11_, team0_.city as city3_11_, team0_.creationYear as creation4_11_, team0_.division_id as division8_11_, team0_.logo as logo5_11_, team0_.name as name6_11_, team0_.version as version7_11_ from teams team0_
  6. 6. Globalcode – Open4education Chaves Chave candidatas Ex.: CPF e CNPJ Chaves compostas Alguns impactos nos frameworks: Se forem EAGER é um CAOS (balde de Siri) Em alguns casos mesmo sendo LAZY podem gerar problemas Índices do tipo Texto
  7. 7. Globalcode – Open4education Chaves /* select g from Game g where g.dateLegacy = '2016-04-13' */ select game0_.id as id1_5_, game0_.arena_name as arena_na9_5_, game0_.arena_location as arena_l10_5_, game0_.awayPoints as awayPoin2_5_, game0_.awayTeam_id as awayTea11_5_, game0_.date as date3_5_, game0_.dateLegacy as dateLega4_5_, game0_.homePoints as homePoin5_5_, game0_.homeTeam_id as homeTea12_5_, game0_.time as time6_5_, game0_.timeLegacy as timeLega7_5_, game0_.version as version8_5_ from games game0_ where game0_.dateLegacy='2016-04-13'
  8. 8. Globalcode – Open4education Chaves e Joins Chaves Primárias Texto Decimal Junções (Chaves estrangeiras) Indexação da junção
  9. 9. Globalcode – Open4education Chaves e Joins Recente: @Entity @Table(name = "teams", indexes={ @Index(name="TEAM_CITY_NAME_INDEX", unique=true, columnList="CITY,NAME"), @Index(name="TEAM_ID_NAME_INDEX", unique=true, columnList="ID,NAME"), @Index(name="TEAM_DIVISION_NAME_INDEX", unique=true, columnList="DIVISION_ID,NAME") }) public class Team implements Serializable {...
  10. 10. Globalcode – Open4education Chaves e Joins Hibernate: alter table teams add constraint TEAM_CITY_NAME_INDEX unique (city, name) Hibernate: alter table teams add constraint TEAM_ID_NAME_INDEX unique (arena) Hibernate: alter table teams add constraint TEAM_DIVISION_NAME_INDEX unique (division_id, name)
  11. 11. Globalcode – Open4education Views e Triggers Views Para que servem? Quando viram um problema? Triggers Como nascem? Como lembramos?
  12. 12. Globalcode – Open4education Bind Variables Mesma instrução executada N vezes Problema: SQL dinâmicos (montados em código) Ex.: ‘Select * from Pais where Nome = ‘ + ‘Brasil’ Ex.: ‘Select * from Pais where Nome = ‘ :1 Using : ‘Brasil’ Segurança contra SQL INJECTION
  13. 13. Globalcode – Open4education Bind Variables /* select g from Game g where g.date = :date order by g.time */ SELECT Game0_.Id AS Id1_5_, Game0_.Arena_Name AS Arena_Na9_5_, Game0_.Arena_Location AS Arena_L10_5_, Game0_.Awaypoints AS Awaypoin2_5_, Game0_.Awayteam_Id AS Awaytea11_5_, Game0_.Date AS Date3_5_, Game0_.Datelegacy AS Datelega4_5_, Game0_.Homepoints AS Homepoin5_5_, Game0_.Hometeam_Id AS Hometea12_5_, Game0_.Time AS Time6_5_, Game0_.Timelegacy AS Timelega7_5_, Game0_.Version AS Version8_5_ FROM Games Game0_ WHERE Game0_.Date = ? ORDER BY Game0_.Time
  14. 14. Globalcode – Open4education ANSI Funções que são múltiplos Banco de Dados: CASE COALESCE CAST para conversões de tipos de dados Melhor portabilidade de Banco de Dados Usem Dialeto do JAVA
  15. 15. Globalcode – Open4education ANSI /* select distinct e.playerContract, coalesce( ( select sum(ev.value) from GameEvent ev where ev.playerContract = e.playerContract and ev.eventType = org.nba.model.GameEventType.POINTS_MADE), 0) from GameEvent e */ Continuação…
  16. 16. Globalcode – Open4education ANSI SELECT DISTINCT Gameevent0_.Playercontract_Id AS Col_0_0_, Coalesce((SELECT SUM(Gameevent2_.Value) FROM Game_Events Gameevent2_, Player_Contracts Playercont3_ WHERE Gameevent2_.Playercontract_Id = Playercont3_.Id AND Gameevent2_.Playercontract_Id = Gameevent0_.Playercontract_Id AND Gameevent2_.Eventtype = 5), 0) AS Col_1_0_, Playercont1_.Id AS Id1_6_, Playercont1_.Finishdate AS Finishda2_6_, Playercont1_.Player_Id AS Player_I5_6_, Playercont1_.Startdate AS Startdat3_6_, Playercont1_.Team_Id AS Team_Id6_6_, Playercont1_.Version AS Version4_6_ FROM Game_Events Gameevent0_ INNER JOIN Player_Contracts Playercont1_ ON Gameevent0_.Playercontract_Id = Playercont1_.Id
  17. 17. Globalcode – Open4education Função ‘ANSI’ #SQN /* select FUNCTION('DATE_FORMAT', b.date, '%d/%m/%Y'), b.awayTeamName, b.awayPoints, b.homePoints, b.homeTeamName from BoxScore b */ SELECT Date_Format(Boxscore0_.Date, '%d/%m/%Y') as Col_0_0_, Boxscore0_.Awayteamname AS Col_1_0_, Boxscore0_.Awaypoints AS Col_2_0_, Boxscore0_.Homepoints AS Col_3_0_, Boxscore0_.Hometeamname AS Col_4_0_ FROM Boxscoreview Boxscore0_
  18. 18. Globalcode – Open4education Exemplo Real Tabela1: idGlobalTabela1, idTabela1, ... TabelaDeLigacao: idGlobalTabela1, idTabela1, idGlobalTabela2, idTabela2 @ManyToOne(fetch=FetchType.LAZY) @JoinColumns({ @JoinColumn(name="idGlobalTabela2", insertable=false, updatable=false), @JoinColumn(name="idTabela2", insertable=false, updatable=false) }) Tabela2 tabela2; Continuação...
  19. 19. Globalcode – Open4education Exemplo Real ... Tabela2: idGlobalTabela2, idTabela2, nmTabela2 @OneToMany(fetch=FetchType.LAZY, mappedBy="tabela2") collection<TabelaDeLigacao> registros; .... -- Retornar todos os registros da "Tabela2" inseridos na "TabelaDeLigacao" -- Entrada: idGlobalTabela1 e idTabela1 -- Selecionar em Tabela2 -- Fazer join em TabelaDeLigacao -- Adicionar as condições idGlobalTabela1=x e idTabela1=y Continuação...
  20. 20. Globalcode – Open4education Exemplo Real CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder(); CriteriaQuery<Tabela2> criteriaQuery = criteriaBuilder.createQuery(Tabela2.class); Root<Tabela2> root = criteriaQuery.from(Tabela2.class); Join<Tabela2, TabelaDeLigacao> join = root.join(Tabela2_.registros); List<Predicate> predicates = new ArrayList<>(); predicates.add(criteriaBuilder.equal(join.get(TabelaDeLigacao_.tabel aDeLigacaoPK).get(TabelaDeLigacaoPK_.idGlobalTabela1), valorIdGlocalTabela )); Continuação...
  21. 21. Globalcode – Open4education Exemplo Real predicates.add(criteriaBuilder.equal(join.get(TabelaDeLigacao_.t abelaDeLigacaoPK).get(TabelaDeLigacaoPK_.idTabela1), valorIdTabela2)); criteriaQuery.select(root); criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[]{}))); criteriaQuery.orderBy(criteriaBuilder.asc(join.get(TabelaDeLigac ao_.tabela2).get(Tabela2_.nmTabela2))); TypedQuery<Tabela2> typedQuery = entityManager.createQuery(criteriaQuery); List<Tabela2> resultado = typedQuery.getResultList(); Continuação...
  22. 22. Globalcode – Open4education Exemplo Real SELECT Tabela2.Idglobaltabela2, Tabela2.Idtabela2, Tabela2. Nmtabela2 FROM Exxx_Tabela2 Tabela2 INNER JOIN Exxx_Tabela_De_Ligacao Tabeladeligacao ON Tabela2.Id_Tabela2 = Tabeladeligacao.Id_Tabela2 AND Tabela2.Id_Global_Tabela2 = Tabeladeligacao.Id_Global_Tabela2 CROSS JOIN Exxx_Tabela2 Tabela2_2 WHERE Tabeladeligacao.Id_Tabela2 = Tabela2_2.Id_Tabela2 AND Tabeladeligacao.Id_Global_Tabela2 = Tabela2_2.Id_Global_Tabela2 AND Tabeladeligacao.Id_Global_Tabela1 = Valoridglocaltabela AND Tabeladeligacao.Id_Tabela1 = Valoridtabela2 ORDER BY Tabela2_2.nmTabela2 ASC; Continuação...
  23. 23. Globalcode – Open4education Exemplo Real Erro: criteriaQuery.orderBy(criteriaBuilder.asc(join.get(TabelaDeLigac ao_.tabela2).get(Tabela2_.nmTabela2))); Correção: criteriaQuery.orderBy(criteriaBuilder.asc(root.get(Tabela2_.nmTa bela2))); Continuação ...
  24. 24. Globalcode – Open4education Exemplo Real SELECT Tabela2.Idglobaltabela2, Tabela2.Idtabela2, Tabela2.Nmtabela2 FROM Exxx_Tabela2 Tabela2 INNER JOIN Exxx_Tabela_De_Ligacao Tabeladeligacao ON Tabela2.Id_Tabela2 = Tabeladeligacao.Id_Tabela2 AND Tabela2.Id_Global_Tabela2 = Tabeladeligacao.Id_Global_Tabela2 WHERE Tabeladeligacao.Cd_Sistema_Entidade = Valoridglocaltabela AND Tabeladeligacao.Cd_Entidade = Valoridtabela2 ORDER BY Tabela2.Nmtabela2 ASC;
  25. 25. Globalcode – Open4education Encerramento Twitter: @capin79 LinkedIn: https://br.linkedin.com/in/capin fernando.franquini@gmail.com Scripts para base de testes está no Github: https://github.com/vinnyvoffice/tdcfloripa2016
  26. 26. Globalcode – Open4education Encerramento Muito Obrigado! Twitter: @capin79 LinkedIn: https://br.linkedin.com/in/capin fernando.franquini@gmail.com Dúvidas? Agradecimento Especial ao Vinny pelo apoio incansável dos exemplos com JPA!

×