Slide 1

Slide 1 text

jeudi 21 juin 12

Slide 2

Slide 2 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Hibernate OGM JPA for NoSQL Emmanuel Bernard Data Platform Architect but actually doing things JBoss By Red Hat jeudi 21 juin 12

Slide 3

Slide 3 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Before you leave • JPA for NoSQL • Denormalization engine • Use the JPA mapping semantic • Does queries too (gradual ramp up) jeudi 21 juin 12

Slide 4

Slide 4 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Emmanuel Bernard • JBoss: Hibernate, JCP • Ceylon • Podcasts • asylum.jboss.org • lescastcodeurs.com • The rest is at http://emmanuelbernard.com • @emmanuelbernard jeudi 21 juin 12

Slide 5

Slide 5 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. (No)SQL tour jeudi 21 juin 12

Slide 6

Slide 6 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. NoSQL alternatives • Web “giants” needs • Very different Goals • data size / availability • low latency / higher throughput • Optimize some data access patterns jeudi 21 juin 12

Slide 7

Slide 7 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. NoSQL families • Graph oriented databases • Key / value stores • Document based stores • BigTable-style key value 123 Address@23 126 “Booya” { "user" : { "id": "124", "name": "Emmanuel", "addresses" : [ { "city": "Paris", "country": "France" }, { "city": "Atlanta", "country": "USA" } ] } 1 Things A foo B bar C baz 2 Things C bam E coh People A Emmanuel 3 Languages A C B Java C Ceylon jeudi 21 juin 12

Slide 8

Slide 8 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Flexibility at a cost jeudi 21 juin 12

Slide 9

Slide 9 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Flexibility at a cost • Programming model • no common API :( • query (Map Reduce, specific DSL, ...) • no schema => app driven schema • Denormalization at the app layer • Transaction / durability / consistency jeudi 21 juin 12

Slide 10

Slide 10 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. JPA for NoSQL jeudi 21 juin 12

Slide 11

Slide 11 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. What is JPA?! • Java standard for Object/Relational Mapper • Comes from Hibernate and others • You think and define the object state • the ORM does the SQL action • Optimization goodies • first and second level cache • lower lock period jeudi 21 juin 12

Slide 12

Slide 12 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Demo jeudi 21 juin 12

Slide 13

Slide 13 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Goals • Encourage new data usage patterns • volume, types etc • Familiar environment • Full JPA support • easy to jump in (and out!) • Declarative denormalization jeudi 21 juin 12

Slide 14

Slide 14 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. What it does • Today • JPA front end for Infinispan, EHCache and MongoDB • CRUD support for @Entities • Full-text queries • Working on it • JP-QL queries (simple ones) • More NoSQL (Cassandra) • Explore denormalization jeudi 21 juin 12

Slide 15

Slide 15 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Not a silver bullet! • But JPA matches quite nicely jeudi 21 juin 12

Slide 16

Slide 16 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Hibernate Core JPA: programmatic API Infinispan Hibernate Search Search engine searches / indexes stored in Teiid Infinispan Infinispan Infinispan Infinispan distributed key/value store indexes / searches Domain model POJO persists enables complex joins and aggregation Hibernate OGM Core persists into delegates object logic to delegates search to Object/Grid Mapper JP-QL converter jeudi 21 juin 12

Slide 17

Slide 17 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Concepts jeudi 21 juin 12

Slide 18

Slide 18 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Schema or no schema? • Schema-less • developer friendly • data structure migration? • need strict development guidelines • Schema • strong documentation • share with other apps / tooling jeudi 21 juin 12

Slide 19

Slide 19 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. OGM’s approach • Keep what’s best from relational model • as much as possible • Decorrelate object and data structure • object model evolution • Data stored as (self-described) tuples • Limited set of core types • CRUD operations are key lookups jeudi 21 juin 12

Slide 20

Slide 20 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Hibernate OGM’s data structure jeudi 21 juin 12

Slide 21

Slide 21 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Storage - Entities • Each entity in a unique key • table name • id column names and values • Value is Map • String: column name • Object: simple type (serializable) jeudi 21 juin 12

Slide 22

Slide 22 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Storage - Associations • Cannot store exactly like relational DBs • Simulate navigation to associations • one key per navigation • Value is the list of tuples • Focus on speedy reads • writes involve several key lookups jeudi 21 juin 12

Slide 23

Slide 23 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. userId name addresses User addressId city Address userId_pk name tbl_user addressId_pk city tbl_address userId_fk addressId_fk tbl_user_address n n * 1 1 * key value tbl_user,userId_pk,1 {userId_pk=1,name=”Emmanuel”} tbl_address,addressId_pk,3 {addressId_pk=3,city=”Paris”} tbl_user_address,userId_fk,1 { {userId_fk=1, addressId_fk=3}, {userId_fk=1, addressId_fk=5} } tbl_address,addressId_pk,5 {addressId_pk=5,city=”Atlanta”} tbl_user_address,addressId_fk,3 { {userId_fk=1, addressId_fk=3}, {userId_fk=2, addressId_fk=3} } tbl_user,userId_pk,2 {userId_pk=2,name=”Caroline”} tbl_user_address,userId_fk,2 { {userId_fk=2, addressId_fk=3} } tbl_user_address,addressId_fk,5 { {userId_fk=1, addressId_fk=5} } jeudi 21 juin 12

Slide 24

Slide 24 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. userId name addresses User addressId city Address userId_pk name tbl_user addressId_pk city tbl_address userId_fk addressId_fk tbl_user_address n n * 1 1 * key value tbl_user,userId_pk,1 {userId_pk=1,name=”Emmanuel”} tbl_address,addressId_pk,3 {addressId_pk=3,city=”Paris”} tbl_user_address,userId_fk,1 { {userId_fk=1, addressId_fk=3}, {userId_fk=1, addressId_fk=5} } tbl_address,addressId_pk,5 {addressId_pk=5,city=”Atlanta”} tbl_user_address,addressId_fk,3 { {userId_fk=1, addressId_fk=3}, {userId_fk=2, addressId_fk=3} } tbl_user,userId_pk,2 {userId_pk=2,name=”Caroline”} tbl_user_address,userId_fk,2 { {userId_fk=2, addressId_fk=3} } tbl_user_address,addressId_fk,5 { {userId_fk=1, addressId_fk=5} } jeudi 21 juin 12

Slide 25

Slide 25 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. userId name addresses User addressId city Address userId_pk name tbl_user addressId_pk city tbl_address userId_fk addressId_fk tbl_user_address n n * 1 1 * key value tbl_user,userId_pk,1 {userId_pk=1,name=”Emmanuel”} tbl_address,addressId_pk,3 {addressId_pk=3,city=”Paris”} tbl_user_address,userId_fk,1 { {userId_fk=1, addressId_fk=3}, {userId_fk=1, addressId_fk=5} } tbl_address,addressId_pk,5 {addressId_pk=5,city=”Atlanta”} tbl_user_address,addressId_fk,3 { {userId_fk=1, addressId_fk=3}, {userId_fk=2, addressId_fk=3} } tbl_user,userId_pk,2 {userId_pk=2,name=”Caroline”} tbl_user_address,userId_fk,2 { {userId_fk=2, addressId_fk=3} } tbl_user_address,addressId_fk,5 { {userId_fk=1, addressId_fk=5} } jeudi 21 juin 12

Slide 26

Slide 26 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Queries • Hibernate Search indexes entities • Store Lucene indexes in Infinispan • JP-QL to Lucene query • Works for simple-ish queries jeudi 21 juin 12

Slide 27

Slide 27 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. select a from Animal a where a.size > 20 > animalQueryBuilder .range().onField(“size”).above(20).excludeLimit() .createQuery(); select u from Order o join o.user u where o.price > 100 and u.city = “Paris” > orderQB.bool() .must( orderQB.range().onField(“price”) .above(100).excludeLimit().createQuery() ) .must( orderQB.keyword().onField(“user.city”) .matching(“Paris”).createQuery() ) .createQuery(); jeudi 21 juin 12

Slide 28

Slide 28 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Hibernate Search is awesome • Full-text search made simple • fuzzy, ngram, phonetic • faceting, geolocation • Nice and readable Query DSL • Computed on app layer side • Clusterable jeudi 21 juin 12

Slide 29

Slide 29 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Future • More NoSQL families • More JP-QL support • JP-QL to “primitives” • API for operations in bulk • More denormalization options • Hybrid deployment options jeudi 21 juin 12

Slide 30

Slide 30 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. Hibernate OGM • JPA for NoSQL • Denormalization engine • Does queries too • Status • CRUD support for Infinispan, EHCache, MongoDB • queries are the next frontier jeudi 21 juin 12

Slide 31

Slide 31 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. More info • Documentation • http://ogm.hibernate.org • including reference doc • Any good JPA book ;) • Code • come and contribute or you’ll get 7 years of bad sex • https://github.com/hibernate/hibernate-ogm • Q&A jeudi 21 juin 12

Slide 32

Slide 32 text

Copyright 2010-2012 Emmanuel Bernard and Red Hat Inc. References • Pictures under creative commons • http://www.flickr.com/photos/tomsaint/3415333390/ • http://www.flickr.com/photos/anniewong/26473161/ • http://www.flickr.com/photos/jdhancock/5002736203/ • http://www.flickr.com/photos/liutao/280498401 • http://www.flickr.com/photos/ehw/243631365/ jeudi 21 juin 12