Mostrando postagens com marcador DataBase. Mostrar todas as postagens
Mostrando postagens com marcador DataBase. Mostrar todas as postagens

domingo, 27 de outubro de 2013

MongoDB + Java Course - In progress

MongoDB Course. Home work
=============================

GitHub on
https://github.com/romalopes/hw2-3

- MongoDB Course
Info:
https://education.mongodb.com/courses
Lenght of course: - 7 weeks
Using Maven
to run the project: mvn compile exec:java -Dexec.mainClass=course.BlogController
to test: mvn test
Using Gradle
   to rum the project: gradle run
   to test: gradle test

To create a project with gradle
- copy the directory Gradle to root

1:              - gradle  

2:                  wrapper
3:                      gradle-wrapper.jar
4:                      gradle-wrapper.properties
5:                  ide.gradle
6:          - copy the btch file to root
7:              gradlew (for X)
8:              gradle.bat ( for windows)
9:          - copy settings.gradle to root
10:              Only this inside: rootProject.name = "NAME PROJECT"


- Week 1
- Suports
Based on Json Documents(key, values). It is a document database
In same document Dynamic Schema.  Different collections of data.
- Scalability and performance VS Funcionality
Doesn't support joins and transactions. Documents are hierarchical
- Running
create a directory %MONGO_HOME%\data\db

1:  %MONGO_HOME%/bin/mongo.config  
2:                  ##store data here  
3:                  dbpath=%MONGO_HOME%\data\db  
4:                  ##all output go here  
5:                  logpath=%MONGO_HOME%\log\mongo.log  
6:                  ##log read and write operations  
7:                  diaglog=3  

- Server:
mongod --dbpath data\db
mongod --config %MONGO_HOME%\bin\mongo.config
As a server
mongod --config %MONGO_HOME%\bin\mongo.config --install
net start MongoDB
net stop MongoDB
mongod --remove (remove the service)
- Command line: mongo

Ex:

1:                      mongo test(connects to mongodb already in test collection)  

2:                      use test (switches to test collection)
3:                      show collections
4:                        (collection) (command)
5:                      db.objects.   save({a:1, b:2, c:3})
6:                      db.objects.   save({a:4, b:5, c:6, d:7, e:['a','b']})
7:                      db.objects.find() <- return all documents
8:                      db.objects.find({a:1}) <- Return all documents that have this element
9:                      db.course.hello.save({'name','maths'})
10:                      db.course.hello.find()


- Json
Types of Data
- Array -> list of items -> [...]
- Dictionaries ->associative maps  {key:value} -> {name:"value",city:"value", interests:[ ___, ___, ___]
- Embeded data into documents
If the embeded data exceed 16Mb, because each document should have the maximum of 16Mb
Home Work:
1 - 42
2- 2,3,5
3-366
4- 2805
- Week 2
- CRUD
Create=Insert.  Read=Find.  Update=Update.  Delete=Remove
Does not have a language such as SQL.

1:  - db.people.insert( doc )  
2:              - db.people.find()  
3:              - db.people.findOne({"name": "Anderson"}, {"name":true,"_id":false})  


- all object has a primary key called (_id)
- BSON - Binary JSON Object
- Query
- $gt, $lt,

1:  db.people.findOne({name:{$gt:    "B", $lt:"D"}})  
2:                  db.people.findOne({name:{$gt:    "B"}, {name:{$lt:"D"}} }) --Will return all docs less than D. Ignore the first statement.  


- exists
- To verify if a field exists
- db.people.findOne({name:{ $exists : true}})  -- return all documents that has the field name.
- regex
- db.people.find({name: { $regex : "^A"}}) -> returns everything that starts with A.
ex:db.users.find( {name: {$regex:"q"}, email: {$exists:true} } )
- or //ends with e
- db.people.find( { $or : [ {name: { $regex : "e$" } } , {age : {$exists: true}]})
- db.scores.find( {$or : [ {score : {$lt: 50}}, {score : {$gt: 90}} ]})
- and
- all - return the documents that have all the specified elements in a array
db.accounts.find( { favorites : { $all, [ "a", "b", "c" ] } } )
- in - return all documents that has on of the objects IN a array
db.accounts.find( { name : { $in, [ "Anderson", "Cida"] } } ) -- returns the docs that have Anderson and Cida
- Queries
db.users.find( {email : {work: "romalopes@yahoo.com.br" } } )
or
db.users.find( {email.work: "romalopes@yahoo.com.br" } )
- Cursor


1:                  db.people.insert( {name: "Anderson", email : {work:"111", home:"222"}});  

2:                  db.people.insert( {name: "Cida", email : {work:"111", home:"222"}});
3:                  - cur = db.people.find(); null; //NULL avoid the return.
4:                  - cur.limit(5); null; get only 5 elements.
5:                  - cur.sort( {name: -1 }); null;
6:                  - cur.sort( {name: -1 }).limit(5); null;
7:                  - while(cur.hasNext()) printjson(cur.next());
8:                  - db.scores.find( { type : "exam" } ).sort( { score : -1 } ).skip(50).limit(20)

- count
db.score.count({type:"exam"})
- db.scores.count( {"type":"essay", score: {$gt: 90 } } )
- Update
- db.people.update( { name: "Anderson"} , {name:"Anderson Lopes", address:"114 Hargrave"})
- Creates, remove and replace all the attributes.
- $set
db.people.update( { name: "Anderson"} , {$set: {age:30}} )
- set only the values we want to change.
db.people.update( { name: "Anderson"} , {$inc: {age:3} } )
- increment 3 in age.
- ex:

1:                          db.arrays.insert( {_id:0, a:[1,2,3,4]});  

2:                          db.arrays.update( {_id:0, {$set : {"a.2" : 5 }});
3:                              change the third element from 3 to 5.
4:                          db.arrays.update( {_id:0, {$push : {a : 6 }});
5:                              add at the end of array
6:                          db.arrays.update( {_id:0, {$pop : {a : 1 }}); //remove the last element
7:                          db.arrays.update( {_id:0, {$pop : {a : -1 }}); //remove the first element
8:                          db.arrays.update( {_id:0, {$pushAll : {a : [6, 7, 8, 9 }});
9:                          db.arrays.update( {_id:0, {$pull : {a : 3} }); //remove the element that the value is 3
10:                          db.arrays.update( {_id:0, {$pullAll : {a : [6, 7, 8, 9 }}); // remove all elements with the values in the second array


- $unset (remove a field from a collection)
db.people.update( { name: "Anderson"} , {$unset: {age:1} } )
- Multi-update
Update multiple documents
db.people.update( {} , {$set :{"title": "Dr" } }, {multi: true} );
db.scores.update ( { score: {$lt:70} }, {$inc: {score:20}}, {multi:true});
- Remove a database

1:                  use DATABASE  

2:                  db.dropDatabase()

- remove

1:                  db.people.remove() //remove everything from the collection.  

2:                  db.people.drop() //faster than remove
3:                  db.people.remove( {name:"Alice"})
4:                  db.people.remove( {name: {$gt: "M" }} )
5:                  db.scores.remove( {score: { $lt: 60 }})
6:              - db.runCommand( {getLastError:1})

return the last result of a command.  It can be a error, a result of a update and so on.
With Java
CRUD


1:                  INSERT DBOBject(interface) . BasicDBObject with is a LinkedHashMap<String, Object>  

2:                   BasicDBObject doc = new BasicDBObject();
3:                      doc.put("userName", "anderson");
4:                      doc.put("birthDate", new Date(2344242));
5:                      doc.put("programmer", true);
6:                      doc.put("age", 8);
7:                      doc.put("languages", Arrays.asList("Java", "C++"));
8:                      doc.put("address", new BasicDBObject("street", "114 Hargrave")
9:                                  .append("town", "Paddington")
10:                                  .append("zipCode", 2021));
11:                      { "_id" : "user1",
12:                        "interests" : [ "basketball", "drumming"]    }
13:                      new BasicDBObject("_id", "user1").append("interests", Arrays.asList("basketball", "drumming"));

FIND


1:                  DB courseDB = client.getDB("course");  

2:                      DBCollection collection = courseDB.getCollection("findCriteriaTest");
3:                      collection.drop();
4:                      for(int i=0; i<10; i++) {
5:                          collection.insert(new BasicDBObject( "x", new Random().nextInt(2)).
6:                                                            append("y", new Random().nextInt(100)));
7:                      }
8:                      System.out.println("\n Find All");
9:                      DBCursor cursor1 = collection.find();
10:                      try {
11:                          while(cursor1.hasNext()) {
12:                              DBObject all = cursor1.next();
13:                              System.out.println(all);
14:                        }
15:                      } finally {
16:                          cursor1.close();
17:                      }
18:                      DBObject query = new BasicDBObject("x", 0)
19:                                                                          //AND in Y
20:                                      .append("y", new BasicDBObject("$gt", 10).append("$lt", 90));
21:      //OR
22:                      QueryBuilder builder = QueryBuilder.start("x").is(0)
23:                              .and("y").greaterThan(10).lessThan(90);
24:                      System.out.println("\n Count");
25:                      long count = collection.count(query); // builder.get()
26:                      System.out.println(count);
27:                      System.out.println("Find One");
28:                      DBObject one = collection.findOne(query); //builder.get()
29:                      System.out.println(one);
30:                      System.out.println("\n Find All");
31:                      DBCursor cursor = collection.find(query); //builder.get()
32:                      try {
33:                          while(cursor.hasNext()) {
34:                              DBObject all = cursor.next();
35:                              System.out.println(all);
36:                          }
37:                      } finally {
38:                          cursor.close();
39:                      }
40:                      for(int i=0; i<10; i++) {
41:                          collection.insert(new BasicDBObject( "_id", i).
42:                append("start",
43:                    new BasicDBObject("x", new Random().nextInt(90) + 10)
44:                          .append("z", new Random().nextInt(90) + 10)
45:                ).append("end",
46:                  new BasicDBObject("x", new Random().nextInt(90) + 10)
47:                      .append("z", new Random().nextInt(90) + 10)
48:                  )
49:                          );
50:                      }
51:                      //QueryBuilder builder = QueryBuilder.start("start.x").greaterThan(50);
52:                      //DBCursor cursor = collection.find(builder.get(),
53:                      //    new BasicDBObject("start.x", true).append("_id", false).append("end.z", true));
54:                      DBCursor cursor = collection.find()
55:                                  .sort(new BasicDBObject("_id", -1)).skip(5).limit(3);
56:                      DBCursor cursor = collection.find()
57:                                  .sort(new BasicDBObject("start.x", -1).append("end.z",1)).skip(5).limit(3);

UPDATE
REMOVE

1:                                                  //query  
2:                      collection.update(new BasicDBObject("_id", "alice"),  
3:                              new BasicDBObject("age", 35));//update  
4:                      collection.update(new BasicDBObject("_id", "alice"),  
5:                              new BasicDBObject("gender", "Female"));//update  
6:                      //will remove the gender - Female and insert the Title Srs  
7:                      collection.update(new BasicDBObject("_id", "alice"),  
8:                              new BasicDBObject("$set" , new BasicDBObject("Title", "Srs")));//update  
9:                      //To insert, it is needed two last parameters  
10:                      collection.update(new BasicDBObject("_id", "frank"),         //to insert  
11:                              new BasicDBObject("$set" , new BasicDBObject("Title", "Sr")), true, false);//update  
12:                      collection.update(new BasicDBObject(),//every document        //to update  
13:                              new BasicDBObject("$set" , new BasicDBObject("Graduation", "Masters")), false, true);//update  
14:                      //collection.remove(new BasicDBObject());  
15:                      collection.remove(new BasicDBObject("_id", "alice"));  


- About blog
View - ftl - freemarker
controller/model java/spark.

- Home Work -
1 - db.grades.find({score:{$gte:65}}).sort( { score : 1 } ).limit(1)
2 - 124
3 - fhj837hf9376hgf93hf832jf9
- Week 3
- MongoDB Schema Design
Application-Driven Schema
. Features
Rich Documents
Pre join data for fast access
No Joing
No Constraina like MySql
Atomic operations(no transactions)
No Declared Schema

domingo, 1 de setembro de 2013

JPA - Hibernate

JPA (Java Persistence API)

 http://www.marcomendes.com/ArquivosBlog/AloMundoJPA.pdf
 http://www.devmedia.com.br/articles/viewcomp.asp?comp=4590
 http://evandropaes.wordpress.com/2007/06/22/introducao-a-java-persistence-api-%E2%80%93-jpa/
 http://www.slideshare.net/caroljmcdonald/td09jpabestpractices2
 http://www.slideshare.net/guestf54162/jpa-java-persistence-api
 http://www.slideshare.net/rodrigocasca/jpa
 https://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/Server_Configuration_Guide/Java_EE_5_Application_Configuration.html
 http://www.slideshare.net/junyuo/java-persistence-api-jpa-step-by-step-presentation
 
 JPA é um framework utilizado na camada de persistência para obter maior produtividade. Modo padrão de mapeamento Objeto/Relacional.
 O JPA define um caminho para mapear os POJOs para um BD (Java Persistence Metadata). Os pojos são vistos como beans de entidade(Entity Beans).
 Utiliza-se o ORM(Mapeamento Objeto/Relacional) para os entity Beans possam ser portados facilmente de um fabricante para outro.
 
 
 
  Entity: POJO, suporta herança e polimorfismo
 EntityManager: Responsável pelas operações de persistência de objetos.
 PersistenceContext: Área de memória que mantém os objetos que estão sendo manipulados pelos EntityManager
 Provedores: Especificação para framework de persistência.
 Persistence Unit: Configuração do provedor JPA para localizar o banco de dados e estabelecer conexões JDBC.
 
 Exemplo simples:
 package addressbook;
 import javax.persistence.*;
 
 @Entity
 public class Person {
   @Id @GeneratedValue
   public Long id;
   public String first;
   public String middle;
   public String last;
 }
 
 package addressbook;
 import javax.persistence.*;
 
 public class Main {
   EntityManagerFactory factory; //Um factory por aplicação, pois é thread-safe. Mas só é importante para aplicações Web. App desktop só tem 1 usuário mesmo.
   EntityManager manager;       //Um manager por usuário.    
   
   public void init() {
     factory = Persistence.createEntityManagerFactory("sample");//Persistence unit no persistence.xml.
     manager = factory.createEntityManager();
   }
 
   private void shutdown() {
     manager.close();
     factory.close();
   }
   
   public static void main(String[] args) {
     // TODO code application logic here
     Main main = new Main();
     main.init();
     try {
       // do some persistence stuff
     } catch (RuntimeException ex) {
       ex.printStackTrace();
     } finally {
       main.shutdown();
     }
   }
 //Para fazer uma persistência, é só criar uma transação, criar os objetos e salvá-los
   private void create() {
     System.out.println("creating two people");
     EntityTransaction tx = manager.getTransaction(); //Criou a Transação.
     tx.begin();
     try {
       Person person = new Person();
       person.first = "Joshua";
       person.middle = "Michael";
       person.last = "Marinacci";
       manager.persist(person);
 
       tx.commit();
     } catch (Exception ex) {
       tx.rollback();
     }
     System.out.println("created one person");
   }
 }
 
 Chaves compostas usando @EmbeddedId
 @Embeddable
 public class ContactPK implements Serializable {
 
   @Column(name = "FIRSTNAME", nullable = false)
   private String firstname;
 
   @Column(name = "LASTNAME", nullable = false)
   private String lastname;
 }
 A chave primária da classe da Entidade é anotada com a anotação @EmbeddedId.
 @Entity
 public class Contact implements Serializable {
 
   /**
    * EmbeddedId primary key field
    */
   @EmbeddedId
   protected ContactPK contactPK;
 
   public void hashcode(){} // tem que incluir esses dois métodos para garantir que terá só uma chave.
   public void equals() {}
 ...
 }
 
 
 Persistence.xml
 •     Lista as classes a serem persistidas
 •     A conexão do Banco de Dados
 •     E propriedades específicas para a implementação de persistência (ex:Hibernate, Hypersonic)
 •     Deve ficar dentro do META-INF
 
 <?xml version="1.0" encoding="UTF-8"?>
 <persistence xmlns="http://java.sun.com/xml/ns/persistence"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation=
   "http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
   version="1.0">
   <persistence-unit name="sample" transaction-type="RESOURCE_LOCAL"> //Tem o nome da unidade, que tem que ser o mesmo recebido em Persistence.createEntityManagerFactory()
    <class>addressbook.Person</class>
    <properties>
      <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
      <property name="hibernate.connection.username" value="sa"/>
      <property name="hibernate.connection.password" value=""/>
      <property name="hibernate.connection.url"  value="jdbc:hsqldb:hsql://test"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/> //Controla como o hibernate cria e gerencia as suas tabelas
 o     Validate:
 o     Update: Cria as tabelas se elas não existirem, se adicionar novos campos, altera a tabela, deixando os dados intactos.
 o     Create: Cria a tabela na primeira conexão, destruindo todos os dados anteriores. Bom para teste.
 o     Create-drop: como o Create, mas destroy a tabela quando a conexão é fechada. Bom pra teste de unidade.
    </properties>
   </persistence-unit>
 </persistence>
 
 Rodar
 java -classpath lib/hsqldb.jar org.hsqldb.Server //Para rodar o hypersonic
 
 public static void main(String[] args) throws Exception {
    // start hypersonic
    Class.forName("org.hsqldb.jdbcDriver").newInstance();
    Connection c = DriverManager.getConnection(
         "jdbc:hsqldb:file:test", "sa", "");
    // start persistence
    Main main = new Main();
    main.init();
 
    // rest of the program....
 
   // shutdown hypersonic
   Statement stmt = c.createStatement();
   stmt.execute("SHUTDOWN");
   c.close();
 }
 
 Outros exemplos de Persistence.xml
 http://download.oracle.com/docs/cd/B31017_01/web.1013/b28221/cfgdepds005.htm
      Usado para o servidor saber qual DabaBase será usado. Nele é configurado qual engine de mapeamento Objeto/Relacional, cache para melhor performance. Ele dá a flexibilidade completa para configurar o EntityManager.
 
      Colocar em: META-INF dentro do diretorio WEB-INF/classes ou do Jar.
 OpenJPA
 <?xml version="1.0"?>
 <persistence>
   <persistence-unit name="testjpa" transaction-type="RESOURCE_LOCAL">
     <provider>
       org.apache.openjpa.persistence.PersistenceProviderImpl
     </provider>
     <class>entidades.Cliente</class>
     <properties>
       <property name="openjpa.ConnectionURL" value="jdbc:postgresql://localhost:5432/jpateste"/>
       <property name="openjpa.ConnectionDriverName" value="org.postgresql.Driver"/>
       <property name="openjpa.ConnectionUserName" value="postgres"/>
       <property name="openjpa.ConnectionPassword" value="123456"/>
       <property name="openjpa.Log" value="SQL=TRACE"/>
     </properties>
   </persistence-unit>
 </persistence>
 
 Hibernate
 <persistence>
  <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">
 
   <provider>org.hibernate.ejb.HibernatePersistence</provider>
   <jta-data-source>java:/DefaultDS</jta-data-source>
   <properties>
    <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver"/>
    <property name="hibernate.connection.url" value="jdbc:derby:db; create=true"/>
    <property name="hibernate.connection.autocommit" value="true"/>
    <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" ou “DerbyDialect”/>
    <property name="hibernate.connection.username" value="APP" />
    <property name="hibernate.connection.password" value="APP" />
 
   </properties>
  </persistence-unit>
  OU
 <persistence>
  <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">
   <properties>
      <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.ClientDriver" />
      <property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/EmpServDB;create=true" />
      <property name="hibernate.connection.username" value="APP" />
      <property name="hibernate.connection.password" value="APP" />
      <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" />
 </properties>
  </persistence-unit>
 </persistence>
 
 TopLink
 <persistence>
 <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">
  <properties>
      <property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="toplink.jdbc.url" value="jdbc:derby://localhost:1527/EmpServDB;create=true"/>
      <property name="toplink.jdbc.user" value="APP"/>
      <property name="toplink.jdbc.password" value="APP"/>
  </properties>
 </persistence-unit>
 </persistence>
 
 
 
 Tabela:
 create table bug (
 id_bug int(11) not null auto_increment,
 titulo varchar(60) not null,
 data date default null,
 texto text not null,
 primary key (id_bug)
 );
 
 Classe POJO
 @entity
 @table(name=”bug”)
 public class bug implements java.io.serializable {
      private integer id_bug;
      private string titulo;
      private java.util.date data;
      private string texto;
      @Enumerated(EnumType.STRING) → Define que um tipo vem de um enum
      @Conumn(name=”TIPO_MOEDA”, nullable=false, columnDefinition=”CHAR(1)”))
      private TipoMoeda tipoMoeda;
      @Transient → Valor não será gravado.
      private Integer valor = new Integer();
      /** creates a new instance of bug */
      public bug() {}
      /*a notação @generatedvalue(strategy=generationtype.sequence) informa que o id será gerado automaticamente pelo db.*/
      @id
      @generatedvalue(strategy=generationtype.sequence)
      @column(name=”id_bug”)
      public integer getid_bug() {     return id_bug;     }
      public void setid_bug(integer id_bug) {     this.id_bug = id_bug;     }
 
      @column(name=”titulo”, lenght=255, nullable=true)
      public string gettitulo() {     return titulo;     }
      public void settitulo(string titulo) {          this.titulo = titulo;     }
 
      @temporal(temporaltype.date)
      @column(name=”data”)
      public java.util.date getdata() {     return data;     }
      public void setdata(java.util.date data) {     this.data = data;     }
 
      @column(name=”texto”)
      @Lob → Define que o campo armazenará dados do tipo Long Object Binary(texto)
      public string gettexto() {     return texto;     }
      public void settexto(string texto) {     this.texto = texto;     }
      @override
      public string tostring(){     return “id: “+this.id_bug;     }
 }
 
 Query
 •     NamedQuery
 o     Query predefinidaes executadas por nome.
 @NamedQuery cria consulta predefinida (estática) associado com o @Entity
 
 @Entity
 @NamedQuery(name = “ConsultaPorId”, query = “SELECT f FROM Funcionarios f WHERE f.id = :id”)
 public class Funcionario implements Serializable {
 ...
 }
 
 •     Criteria
 o     So do Hibernate, baseado na API Criteria
 •     By Example
 •     JPAQL/ HQL / EJB3-QL
 o     Parecidas com SQL, mas mais objec-centric
 o     Suporta (Seleção de instancias, propriedades, polimorfismo), joining automático para propriedades nested.
 o     Confortável para quem é familiar ao SQL
 o     JPAQL é um subconjunto do HQL (Hibernate suporta ambos)
 o     Para rodar:
      EntityManager.createQuery(String jpaql)
      Session.createQuery(String hql)
 Ex: “from Item i where i.name = “aaa”
   private void search() {
     EntityTransaction tx = manager.getTransaction();
     tx.begin();
     System.out.println("searching for people");
     Query query = manager.createQuery("select p from Person p");
     List<Person> results = (List<Person>)query.getResultList();
     for(Person p : results) {
       System.out.println("got a person: " + p.first + " " + p.last);
     }
     System.out.println("done searching for people");
     tx.commit();
   }
 
 
 •     Native SQL
 o     Session.createSQLQuery(SQL)
 o     EntityManager.createNativeQuery(sql)
 
 
 
 Relacionamento
 •     Um para Um (@OneToOne)
 @OneToOne (mapedBy = “pessoa”)
 private Ramal ramal;
 
 @OneToOne
 @JoinColumn( name = “id_pessoa”)
 private Pessoa pessoa;
 Tabelas.
 ramal                    pessoa
  - numero:Integer                - id:Integer
  - pessoa_id: Integer (FK)           - nome: VARCHAR(50)
 
 
 •     Um para Muitos(@OneToMany)´
 Uma entidade possui uma coleção de outras entidades.
 @OneToMany(mappedBy=”pessoa”, cascade = CascadeType.ALL)
 private List<Ramal> ramais = new ArrayLIst<Ramal>();
 •     Muitos para um (@ManyToOne)
 A entidade faz parte de uma coleção de entidades de outra entidade.
 @ManyToOne(cascade=CascadeType.PERSIST)
 @JoinColumn(name=”id_pessoa”)
 private Pessoa pessoa;
 
 •     Muitos para muitos(@ManyToMany)
 @ManyToMany
 @JoinTable(name=”ramal_pessoa”,
 joinColumns=(@JoinColumn(name = “id_pessoa”)),
 inverseJoinColumns = (@JoinColumn(name = “id_ramal”))
 )
 @Column (name = “id_ramal”);
 private List<Ramal> ramais = new ArrayList<Ramal>();
       
 @ManyToMany
 @JoinTable(name=”ramal_pessoa”,
 joinColumns=(@JoinColumn(name = “id_ramal”)),
 inverseJoinColumns = (@JoinColumn(name = “id_pessoa”))
 )
 @Column(name = “id_pessoa”)
 private List<Ramal> pessoas= new ArrayList<Ramal>();
 
 Tabelas:
 Ramal               pessoa_has_ramal                    pessoa
  - numero:INTEGER     - pessoa_id: INTEGER (FK)                - id:INTEGER
                - ramal_numero: INTEGER                - nome: VARCHAR(50)
 
 Características dos Relacionamentos:
 •     Lazy loading
 o     Otimização de Performance
 o     Itens relacionados não são carregados até que eles sejam acessados pela primeira vez. (acesso a nível de Campo)
 o     Limitado para trabalhar somente com a Sessão ou EntityManager que carregou o objeto pai.
      Pode causar problemas em aplicações web.
 •     Fetch
 o     Fetch Mode
      Lazy
      Eager – desabilita o lazy loading
 o     Modo pode ser configurado em cada relacionamento.
 o     Considerar a performance e usar quando estiver configurando o fetch.
 @Basic(fetch = FetchType.LAZY) //Só vai carregar o objeto quando o método for acessado.
 @Lob      //Permite um BLOB ou CLOB (Bit or Char Large Object transforma valores para charS ou biteS
 public BufferedImage getPhoto() {
   return photo;
 }
 
 
 •     Cascading
 o     Fala do Hibernate o que fazer com o relacionamento nos casos de Insert, Update, Delete, All
 o     Cascade=PERSIST, REMOVE, MERGE, REFRESH, ALL.
 •     Polimorphic
 o     Três abordagens:
      Tabela por hierarquia de classe
 •     Todo dado de todas as propriedades das classes na herança são guardadas na tabela.
 •     Requer que as colunas que representam campos na subclasses permitam NULL.
 •     Usa uma coluna discriminadora para determinar o tipo de objeto representado em uma tupla.
 @Entity
 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
 @DiscriminatorColumn(name=”person_type”)
 public class Person {
      @Id     @GeneratedValue(strategy=GenerationType.AUTO)
      private int id = 0;
      private String name;
 }
 @Entity @DiscriminatorValue(value=”p”
 public class Patient extends Person {
      private boolean insured = false;
 }
 @Entity @DiscriminatorValue(value=”d”)
 public class Physician extends Person {
      private boolean accredited;
 }
 
 create table person {
      patient_id INTEGER,
      person_type varchar(255) not null,
      name varchar(255) not null,
      insured bit
      accredited bit
      primary key (patient_id));
 
      Tabela por sub-classe.
 •     Cada sub-classe tem a sua própria tabela.
 •     Campos da classe Pai estão em outra tabela.
 •     PK na tabela da sub-classe referem à tabela da classe pai.
 •     Usar configuração joined-subclass
 •     Também suporta o uso de discriminator
 @Entity     @Inheritance(strategy=InheritanceType.JOINED)
 public abstract class Payment
      @Id     @Column(name=”payment_id”)
      @GeneratedValue(strategy=GenerationType.AUTO)
      private int id = 0;
 }
 @Entity @Table(name=”check_payment”)
 @PrimaryKeyJoinColumn(name=”payment_id”)
 public class CheckPayment extends Payment{    
      private int check;
 }
 @Entity @Table(name=”credit_card_payment”)
 @PrimaryKeyJoinColumn(name=”payment_id”)
 public class CreditCardPayment extends Payment{    
      @Column(nullable=false)
      private String account;
 }
 create table payment { payment_id INTEGER, amount INTEGER, primary key(payment_id));
 create table check_payment { payment_id INTEGER, check-numer INTEGER, primary key(payment_id));
 create table credit_card_payment { payment_id INTEGER, account INTEGER, primary key(payment_id));
 
      Table por classe concreta
 •     Cada classe na hierarquia tem a sua própria tabela.
 •     O campos da classe pai são duplicadas em cada tabela.
 •     Duas abordagens:
 o     Subclass Union.
      Mapeia a classe pai normalmente, sem discriminador.
      @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
      Papeia cada uma das subclasses
 •     Especifica o nome da tabela
 •     Especifica as propriedades das subclasses
 o     Polimorfismo Implícito
      Class pai não é mapeada usando hibernate (@MappedSuperclass)
      Cada subclasse é mapeada como uma clase normal.
 •     Mapeia todas as propriedades, inclusive as propriedades do pai.
 @MappedSuperclass
 public class Vehicle{               //Class não é mapeada, mas as propriedades são.
      @Id      @Column(name=”vehicle_id”)
      @GeneratedValue(strategy=GenerationType.AUTO)
      private int id;
 }
 @Entity
 public class Car extends Vehicle{
      boolean coupe;
 }
 @Entity
 public class Truck extends Vehicle {
      @Column (name=”Max_weight”)
      private int maxWeight;
 }
 public SUV extends Truck {
      @Column (name=”spinner_wheels”)
      private boolean spinnerWheels;
 }
 create table vehicle ( vehicle_id INTEGER, coupe_ind bit, primary key(vehicle_id));
 create table truck ( vehicle_id INTEGER, max_weight bit, primary key(vehicle_id));
 create table suv ( vehicle_id INTEGER, max_weight bit, primary key(vehicle_id));
 
 
 Sem EJB
 EntityManagerFactory emf = Persistence.createEntityManagerFactory(“myapp);//O que está no persistence-unit
 EntityManager em = emf.createEntityManager();
 EntityTransaction et = em.getTransaction();
 et.begin();
      Insert: em.persist(carro);
      Update: em.merge(carro);
      Remove: em.remove(carro);
      Busca: Carro carro = em.find(Carro.class, id);
 et.commit() ou et.roolback();
 
 Com EJB
 EntityManagerFactory emf = Persistence.createEntityManagerFactory(“myapp);//O que está no persistence-unit
 @PersistenceContext
 EntityManager em = emf.createEntityManager();
 EntityTransaction et = em.getTransaction();
 et.begin();
      Insert: em.persist(carro);
      Update: em.merge(carro);
      Remove: em.remove(carro);
      Busca: Carro carro = em.find(Carro.class, id);
 et.commit() ou et.roolback();
 
  6.4.9.1 Entity Manager
 
 •     No Hibernate
 o     Configuration -> SessionFactoryy -> Session
 o     Session é o gateway para as funções de persistência.
 •     JPA
 o     Persistence -> EntityManagerFactory -> EntityManager
 o     EntityManager é o gateway para as funções de persistência.
 
 Ciclo de Vida de um Objeto
 Um objeto(Entity) pode ter 4 estados que indicam como eles estão conectados ao BD.
 •     New(transient): Objeto foi criado, mas ainda não foi persistido ou associado ao BD. Ao ser salvo com o EntityManager.persist() ele passa ao estado Managed.
 •     Managed(Persistent): O objeto já está associado ao BD. Mudanças no objeto vão, potencialmente gerar mudança no BD. Se necessário pode-se chamar EntityManager.flush() para sincronizar as mudanças, senão somente no commit da transação.
 •     Detached: O objeto já foi associado ao BD, mas não está mais. Um objeto Detached pode ser reatached usando o EntityManager.merge().
 •     Removed: Objeto que recebeu a operação de remoção. EntityManager.remove();
 
 Similar ao Hibernate Session, controla o ciclo de vida das entidades.
 •     new() → Cria uma nova entidade
 •     persist() → Salva ou faz um update em uma entidade
      public Order createNewOrder(Customer customer){
           Order order = new Order(customer);
           entityManager.persist(order);
           return order;          }
 •     refresh() → Atualiza o estado da entidade
 •     remove() → Marca uma entidade para remoção
      public void removeOrder(Long orderId){
           Order order = entityManager.find(Order.class, orderId);
           entityManager.remove(order);      }
 •     merge() → Sincroniza o estado de entidades desacopladas.
      public void updateOrder(Order order){
           entityManager.merge(order);      }
 •     find(Class type, Serializeble id) – Obtém o item de um tipo pelo id
 •     getTransaction
 ◦     Prove um objeto de transação para fazer o commit e rollback.
 
 

quinta-feira, 22 de agosto de 2013

Introduction to DataBase and SQL

Banco de Dados


Modelo Conceitual: Representa ou descreve a realidade do ambiente do problema, construindo-se numa visão global dos principais dados e relacionamentos.  Objetivo é descrever as informações de uma realidade.  Nesse momento não se tem preocupaçao com as operações de manipulação e manutenção dos dados.
Modelo Lógico: Feito a partir do modelo conceitual.  Ex: Relacional, hierárquica e rede  Descreve as estruturas contidas no BD.  Não leva em conta o SGBD.
Modelo Físico: Parte do modelo lógico.  Descreve as estruturas físicas de armazenamento, tais como tamanho de campos, indices, etc.  Utiliza-se a DDL(Data Definition Language) e considera o SGBD.
Projeto de Banco de Dados: É a modelagem através da abordagem Entidade-Relacionamento.

 1.2 Normalização

Top-Down: Após a definição de um modelo de dados, aplica-se a normalização.
Botton-up: Aplica-se a normalização como ferramenta de projeto do modelo de dados.

Objetivos:
   - Evitar que o DB de modificações não esperadas.  (ex: 3 regra)
- Minimizar o redesign do banco de dados quando houver extensões.
- Evitar vantagem de algum padrão de acesso.  NoSql são voltados para aplicações, então são voltados para um padrão específicio.

Primeira forma Normal: Cada ocorrência da chave primária deve corresponder a uma e somente uma informação de cada atributo, a entidade não deve conter grupos repetitivos (multivalorados).  Decompõe-se as entidades não normalizadas em tantas quanto for o número de conjunto de atributos repetitivos.  Nas novas entidades, a chave primária é a concatenação da chave primária da entidade original, mais os atributos do grupo repetitivo.
Dependência Funcional
                Total (completa): Ocorre quanto a chave primária for composta por vários atributos, ou seja, em uma entidade de chave primária composta de um único atributo não ocorre este tipo de dependência.
                Transitiva: Quando um conjunto de atributos A depende de outro atributo B que não pertence à chave primária.  Nesse caso, A é dependente transitivo de B.

Segunda forma Normal: Uma entidade não pode ter atributos com dependência parcial em relação à chave primária.  Deve-se verificar se algum atributo com dependência parcial em relação a algum elemento da chave primária concatenada.

Terceira forma Normal: Nenhum atributo de uma entidade possui dependência transitiva em relação a outro que não participe da chave primária, ou seja, não deve haver nenhum atributo intermediário entre a chave primária e o próprio atributo observado.  Deve-se criar uma nova entidade com esses atributos com dependência transitiva.  Também não deve haver atributo que seja resultado de algum calculo a partir dos atributos da entidade, o que caracterizaria dependência funcional.
Ex:
   Nome            titulo             email
  Anderson        Sr               email1@gmail.com
  Anderson        Sr               email2@gmail.com


SQL

Data Model 


Criação das Tabelas
SET FOREIGN_KEY_CHECKS = 0;
drop table if exists cliente , vendedor, produto, PEDIDO;
drop table if exists item_do_pedido;
SET FOREIGN_KEY_CHECKS = 1;


CREATE TABLE CLIENTE (codigo_cliente smallint not null unique,               nome_cliente   char(20),        endereco  char(30),        cidade   char(15),
   CEP            char(8),              UF             char(2),               CGC            char(14),           IE             char(20));

CREATE TABLE VENDEDOR (codigo_vendedor smallint not null unique, nome_vendedor   char(20),   salario_fixo  decimal,    faixa_comissao  char(1));

CREATE TABLE PRODUTO (codigo_produto    smallint not null unique,          unidade           char(3),           descricao_produto char(30),   valor_unitario    decimal);

CREATE TABLE PEDIDO (num_pedido      int not null unique,      prazo_entrega   smallint not null,           codigo_cliente  smallint not null,
 codigo_vendedor smallint not null,    
FOREIGN KEY (codigo_cliente) REFERENCES CLIENTE(codigo_cliente),
 FOREIGN KEY (codigo_vendedor) REFERENCES VENDEDOR(codigo_vendedor));


CREATE TABLE ITEM_DO_PEDIDO (num_pedido     int not null unique,  codigo_produto smallint not null unique,              quantidade     decimal,        
FOREIGN KEY (num_pedido) REFERENCES PEDIDO(num_pedido),
 FOREIGN KEY (codigo_produto) REFERENCES PRODUTO(codigo_produto));


Comandos
DROP TABLE <tabela>;
Select nome_cliente, endereco, CGC From cliente;
Listar o num_pedido, o codigo_produto e a quantidade dos itens do pedido com a quantidade igual a 35.
·          Select num_pedido, codigo_produto, quantidade from item_pedido where quantidade = 35;
Quais os clientes que moram em Niterói?
·          Select nome_cliente From cliente Where cidade = ‘Niterói’;
Listar os produtos que tenham unidade igual a ‘M’ e valor unitário igual a R$1,05.
·         Select descricao_produto From produto Where unidade = ‘M’ and valor_unitario = 1.05;
Liste os clientes e seus respectivos endereços, que moram em ‘SÃO PAULO’ ou estejam na faixa de CEP entre `30077000’e ‘3007900’.
·          Select nome_cliente, endereço From cliente Where (CEP >= ‘30077000’ and CEP <= ‘30079000’) Or cidade = ‘SÃO PAULO’;
Mostrar todos os pedidos que não tenham prazo de entrega igual a 15 dias.
·          Select num_pedido From pedido Where NOT (prazo_entrega = 15);
Operadores Between e NOT Between: Valores dentro de uma faixa sem o uso de =,<,>. 
Listar o código e a descrição dos produtos que tenham o valor unitário na faixa de R$0,32 até R$2,00.
·          Select codigo_produto, descricao_produto From produto where valor_unitario between 0.32 and 2.00;
Like, Not Like: Só para CHAR. Parecido com = e < >.  Utilizam “%”(substitui uma palavra) e  “_”(substitui um caractere) como papeis de curinga.
Listar todos os produtos que tenham a sua unidade começando por K.
·          Select codigo_produto, descricao_produto From produto Where LIKE ‘K_’;
Listar os vendedores que não começam por ‘Jo’.
·         Select codigo_vendedor, nome_vendedor From vendedor Where nome_vendedor NOT LIKE ‘Jo%’;
IN e NOT IN: Procura registros que estão ou não estão contidos no conjunto de valores fornecidos.  Minimiza o uso de =, <>, AND e OR
Listar os vendedores que são da faixa de comissão A e B
·          Select nome_vendedor From vendedor Where faixa_comissao IN (‘A’, ‘B’);
IS NULL e IS NOT NULL: Problemático por causa da implementação de cada SGDB
Mostrar os clientes que não tenham inscrição estadual.
·          Select * from cliente Where IE is null;
ORDER BY: Para apresentar o resultado ordenado.  Usam ASC e DESC para mostrar a forma de ordenação.
Mostrar em ordem alfabética a lista de vendedores e seus respectivos salários fixos.
·          Select nome_vendedor, salario_fixo From vendedor Order by nome_vendedor;
Listar os nomes, cidades e estados de todos os clientes ordenados por estado e cidade de forma descendente.
·          Select nome_cliente, cidade, UF From cliente Order by UF DESC, cidade DESC;
Cálculos: Criação de campos que não pertencem às tabelas, mas que sejam resultado de cálculo sobre campos.
Mostrar o novo salário fixo dos vendedores, de faixa de comissão ‘C’, calculado com base no reajuste de 75% acrescido de R$120,00 de bonificação. Ordenar pelo nome do vendedor.
·          Select nome_vendedor, novo_salario = (salario_fixo * 1.75) + 120 From vendedor Where faixa_comissao = ‘C’ Order by nome_vendedor;
Mostrar o menor e o maior salário de vendedor
·          Select MIN(salario_fixo), MAX(salario_fixo) from vendedor;
Mostrar a quantidade total pedida para o produto de código ‘78’.
·          Select SUM(quantidade) From item_pedido Where codigo_produto = ‘78’;
Qual a média dos salários fixos dos vendedores?
·          Select AVG(salario_fixo) From vendedor;
Quantos vendedores ganham acima de R$2.500,00 de salário fixo?
·          Select count(*) From vendedor Where salario_fixo > 2500;
Cláusula DISTINCT: Vários registros em uma tabela podem ter os mesmos valores, podendo trazer informações erradas.  Distinct é usada para não permitir que algumas redundâncias causem problemas. 
Quais as unidades de produtos, diferentes, na tabela produto?
·          Select DISTINCT unidade From produto;
Agrupando informações selecionadas (GROUP BY): Para organizar os dados em grupos determinados.  Geralmente é utilizado em operações de COUNT ou AVG.
Listar o número de produtos que cada pedido contém.
·          Select  num_pedido, total_produtos = COUNT(*) From item_pedido Group by num_pedido;
Agrupando de forma condicional (HAVING):
Listar os pedidos que têm mais do que 3 produtos
·          Select num_pedido,total_produtos = COUNT(*) From item_pedido Group by num_pedido Having COUNT(*) > 3;
Recuperando dados de várias tabelas (JOINS):Acesso em várias tabelas.  JOIN faz junção de tabelas
Juntar as tabelas cliente com pedido.  Nessa consulta, poucos valores serão retornados.
·          Select nome_cliente, pedido.cod_cliente, num_pedido From cliente, pedido;
Que clientes fizeram os pedidos? Listar pelo nome de clientes.  O WHERE é chamada de EQUAÇÃO DE JUNÇÃO para obter um resultado contreto.
·          Select nome_cliente, Pedido.cod_cliente, Num_pedido From cliente, pedido Where cliente.cod_cliente = pedido.cod_pedido;
Quais clientes que têm prazo de entrega superior a 15 dias e que pertencem aos estados de São Paulo (‘SP’) ou Rio de Janeiro (‘RJ’)?
·          Select nome_cliente, UF, prazo_entrega From cliente, pedido Where cliente.cod_cliente = pedido.cod_pedido And UF in (‘SP’, ‘RJ’) and prazo_entrega > 15;
Mostrar os clientes e seus respectivos prazos de entrega, ordenados do maior para o menor.
·          Select nome_cliente, prazo_entrega From cliente, pedido Where cliente.cod_cliente = pedido.cod_cliente Order by prazo_entrega desc;
Aliases(sinônimos): Definidos na própria consulta.  Feita na cláusula From e utilizadas nas outras cláusulas (Where, order by, group by, having e select).
Apresentar os vendedores (ordenados) que emitiram pedidos com prazo de entrega superiores a 15 dias e que tenham salários fixos iguais ou superiores a R$1.000,00.
·          Select nome_vendedor, prazo_entrega From vendedor V, pedido P Where V.cod_vendedor = P.cod_vendedor and salario_fixo >= 1000 And prazo_entrega > 15 Order by nome_vendedor;
Mostre os clientes (ordenados) que têm prazo de entrega maior que 15 dias para o produto ‘QUEIJO’ e que sejam do Rio de Janeiro.
·          Select nome_cliente From cliente C, pedido P, item_pedido I, produto PR Where C.cod_cliente = P.cod_cliente And P.num_pedido = I.num_pedido And I.cod_produto = PR.cod_produto And prazo_entrega > 15 And descricao = ‘QUEIJO’ And UF = ‘RJ’ Order by C.nome_cliente;
Mostre todos os vendedores que venderam chocolate em quantidade superior a 10Kg.
·          Select distinct nome_vendedor From vendedor V, pedido P, item_pedido I, produto PR Where C.cod_vendedor = P.cod_vendedor And P.num_pedido = I.num_pedido And I.cod_produto = PR.cod_produto And quantidade > 10 And descricao = ‘CHOCOLATE’;
Quantos clientes fizeram pedido com o vendedor João?
·          Select count(cod_cliente) From cliente C, pedido P, vendedor V Where C.cod_cliente = P.cod_cliente And P.cod_vendedor = V.cod_vendedor And nome_vendedor = João;
Quantos clientes da cidade do Rio de Janeiro, e Niterói tiveram seus pedidos tirados com o vendedor João?
·          Select cidade, número = count(nome_cliente) From cliente C, pedido P, vendedor V Where nom_vendedor = ‘João’ And cidade in (‘Rio de Janeiro’, ‘Niterói’) And V.cod_vendedor = P.cod_vendedor And P.cod_cliente = V.cod_cliente Group by cidade;
Subqueries: Quando o resultado de uma query é usada por outra, de forma concatenada no mesmo comando SQL.
Que produtos participam em qualquer pedido cuja quantidade seja 10?
·          Select descrição From produto Where cod_produto in (select cod_produto From item_pedido Where quantidade = 10);
Quais vendedores ganham um salário fixo abaixo da média?
·          Select nome_vendedor from vendedor Where salário_fixo < (select AVG(salario_fixo) from vendedor);
Quais os produtos que não estão presentes em nenhum pedido?
·          Select cod_produto, descrição From produto P Where not exists (select * from item_pedido Where cod_produto = P.cod_produto);
Quais clientes estão presentes em mais de três pedidos?
·          Select nom_cliente From cliente C Where exists (select count(*) From pedido Where cod_cliente = C.cod_cliente Having count(*) > 3));

In Myqls Left join, cross join e inner join are equivalents
- Left Join
- Gives a extra consideration to the table that is on the left
- Return all rows from the left table, with the matching rows in the right table
- Every items in the left table will show up in result even if there isn't match with other table.



ex:
Return all clients and its "pedidos"
SELECT cliente.nome_cliente, pedido.num_pedido, pedido.prazo_entrega FROM cliente
LEFT JOIN pedido
ON cliente.nome_cliente = pedido.codigo_cliente;
- INNER JOIN
- Return the intersection between two tables




ex: Return all clients and its "pedidos"
SELECT cliente.nome_cliente, pedido.num_pedido, pedido.prazo_entrega FROM cliente
INNER  JOIN pedido
ON cliente.nome_cliente = pedido.codigo_cliente;


- SQL
- Inner Join
- Matches rows in one table with rows in other tables and return the intersection betwenn them.
- Ex:
SELECT column_name(s) FROM table1
INNER JOIN table2 ON table1.column_name=table2.column_name;
INNER JOIN table3 ON table1.column_name=table3.column_name;
...
where WHERE_CONDITIONS
- Criteria
- Specify the main table in the select(FROM)
- Specify the table to join.  Mane tables is bad for performance
- Specify the join conditions.

http://www.w3schools.com/sql/img_innerjoin.gif
- View
Virtual table based on a result-set of a SELECT.
- A View is a "frozen" definition at criation time.  Changes in the original table does not affects the VIEW.
- CREATE VIEW "VIEW_NAME" AS "SQL COMMAND";
- DROP VIEW view_name
- ALTER VIEW (with another select)
 ALTER
[ALGORITHM =  {MERGE | TEMPTABLE | UNDEFINED}]
 VIEW [database_name].  [view_name]
  AS
[SELECT  statement]
- Algorithms
- MERGE: The insert is combined with the SELECT.  More efficient. Only when view represent one-to-one relationship.
- TEMPLATE: First create a temporary table based on the SELECT and then the insert.
- UNDEFINED: MySql decided which algorithm to use.
Benefits
- View can hide complexity
If you have complexy select with join, complexy logic.  Ex: A View with a calculum over two columns.
- View can be used as a security mechanism
- Set permissions to the view instead of table, select a set of columns.  Ex, remove credit card column from a view.
- Views can support legacy code
- If the database changes, you can create a view based with the same schema as the legacy tables that was removed.
Drawback
- Performance specially if a view is created from another view
- The necessity to change the view whenever the database changes.
A view to be updateble
- The SELECT statement must only refer to one database table.
- The SELECT statement must not use GROUP BY or HAVING clause.
- The SELECT statement must not use DISTINCT in the column list of the SELECT clause.
- The SELECT statement must not refer to read-only views.
- The SELECT statement must not contain any expression (aggregates, functions, computed columns…)
- Index
Index is a pointer to data in a Table.
Help to find data easier.  Used speed up data retrieval without reading the whole table, but slow the input.
- Users cannot see index, they are just used by the engine.
- First goes through a index to find a data.
- How to do: Create a index with a name, table and COLUMNS to be indexed.  Also if the index is ASCENDING or DESCENDING.
- CREATE [UNIQUE] INDEX "INDEX1, INDEX2" ON "TABLE" (COLUMN1, COLUMN2);
- Unique INDEX
Does not allow duplicated values to be inserted in the TABLE.
- DROP
- DROP INDEX index_name;
When
- Use
- To improve performance
- Avoid
- In small tables
- Table with many update/insert
- In Columns with high number of NULL value
Stored Procedure
- Declarative SQL statement that encapsulates repetitive tasks.  Can be called by triggers, other stored procedure or application
- It is stored in server.
- Advantages:
- Decrease net traffic(application - database)
- Instead of sending SQL statement, app send just the name and parameters
- increase select performance.
After created it is compiled and stored in database
-  Mysql put it in a cache. Mysql maintaing its own stored procedure for each connection.
- create security mechanism
Admin can grant permissions to application that access SP without giving access to database.
- Simplify application code(no need to keep queries inside the logic)
- Disadvantages
- SP is a function, than it can overuse memory. DB is not designed for logical operations
- Difficult to debug.  MySQL doesn't have this functionaly
- difficult to develop and maintain.
- Ex:
Create
DELIMITER //
CREATE PROCEDURE Method(IN/OUT/INOUT param VARCHAR(255))
BEGIN
DECLARE total INT DEFAULT 0
select count(*) into total from clients;
SELECT * FROM clients;
  END //
DELIMITER ;
Call
CALL STORED_PROCEDURE();
Show
SHOW PROCEDURE STATUS WHERE name LIKE '%clients%'
- Triggers
It is a special type of Stored Procedure. It is not called directly, but automaticaly when some event happens.
Used to validation and data modification
Used for auditing or reflect changes.
Types of triggers:
BEFORE/AFTER  TABLE INSERT/UPDATE/DELETE
Syntax
CREATE TRIGGER Name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON table
FOR EACH ROW
BEGIN
/*code*/
END
Show Trigger
SELECT * FROM Information_Schema.Trigger
WHERE Trigger_schema = 'database_name' AND
Trigger_name = 'trigger_name';
- NEW and OLD
NEW: Access to data already changed
OLD: Access to old data



MySQL
http://downloads.mysql.com/docs/mysql-tutorial-excerpt-5.1-en.pdf