Leveraging your
Knowledge of ORM
Towards Performance-
based N SQL T h l
b   d NoSQL Technology

By Robert Greene




 Versant Corporation U.S. Headquarters
 255 Shoreline Dr Suite 450 Redwood City CA 94065
               Dr.      450,          City,
 www.versant.com | 650-232-2400




                                                    #NoSQLVersant
Overview   NoSQL at it’s Core
             SQ          C

           Pole-Position – Overview

           About the Code

              Circuits Description

              RDB JPA Code

              MongoDB Code

              Versant JPA Code
              V     t     C d

           Results – Winners of the Race

           Developer Challenge




                                      #NoSQLVersant
NoSQL
at its core

              #NoSQLVersant
Traditional DBMS Scale Architecture
  INEFFICIENT
 CPU destroying
    Mapping




                                      EXPENSIVE
                                    Repetitive data
                                  movement and JOIN
                                      calculation



                  #NoSQLVersant
NoSQL at its Core
A Shift In Application Architecture
                                             UNIFED
                                          Application 
                                          A li ti
                                         driven schema




                                       COMMODITY HW
                                       COMMODITY HW
                                      Horizontal scale out, 
                                        distribution and 
                                          partitioning

     •   Google – Soft-Schema
     •   IBM – Schema-Less




                                  #NoSQLVersant
A Shift is Needed
► How Often do Relations Change?
                             g
  Blog : BlogEntry , Order : OrderItem , You : Friend


► R l ti
  Relations R l Ch
            Rarely Change, St R
                           Stop Recalculating Th
                                    l l ti Them

            ► Do you need ALL o you da a in o e p ace
               o      eed     of your data one place.

            ► You don’t. You can distribute it.




                                                    #NoSQLVersant
Measured V l
M      d Value
How NoSQL performance
 stacks up to Relational



                    #NoSQLVersant
PolePosition
           Performance Benchmark
► Established in 2003
   NoSQL
   N SQL -vs- ORM

► Code Complexity Circuits
   Flat Obj t
   Fl t Objects
   Graphs
   Inherited Objects
   Collections

► Data Operations
   CRUD
   Concurrency

► Scalability

                                  #NoSQLVersant
Contenders | Methodology
► Contenders
  ORM
  NoSQL

► Methodology
  External RDB Experts, Internal NoSQL Experts
  Open Source Benchmark Code for all contenders




                                        #NoSQLVersant
About the Code
► ORM
  Common Code Base


► Tested Database Engines
  Hibernate – MySQL / Postgres
  OpenJPA – MySQL / Postgres
  MongoDB
  Versant Object Database




                                 #NoSQLVersant
Circuit Structure
► Simulate CRUD on embedded graph of different Classes.
► Cl
  Class model - C
           d l Complex Ci it
                    l Circuit:

      class Holder0 { 
             String _name; 
             String name;
             List <Holder0> _children;
             Holder0[] _array; } 
      class Holder1 extends Holder0 { 
                                    {
             int _i1; } 
      class Holder2 extends Holder1 { 
             int _i2 <indexed>; }     ...class HolderN

extends…..



                                                #NoSQLVersant
Hibernate JPA Code
► Write – Generates Holder’s to user spec depth
  ComplexHolder cp = new ComplexHolder( );  
  em.makePersistent(cp);
► Read – Access root of graph and traverse
   cp = em.find( ComplexHolder.class, id ); cp.getChildren().touch();
► Query
   String query 
   String query = "from
                   from 
   org.polepos.teams.hibernate.data.Holder2 where i2=" + 
   currentInt;    Iterator it =  em.iterate(query); 
► Delete – Deletes Graph - cascading operation




                                                            #NoSQLVersant
ORM JPA Mapping
            XML Mapping File for each Persistent Class ( 11ea Files )
- <hibernate-mapping package="org.polepos.teams.hibernate.data" default-cascade="none" default-access="property" default-lazy="true" auto-import="true">
- <class name="ComplexHolder0" table="tComplexHolderNew0" polymorphism="implicit" mutable="true" dynamic-update="false" dynamic-insert="false" select-before-update="false"
optimistic-lock="version">
   ti i ti l k "      i ">
  <id name="id" column="fid" type="long" />
- <discriminator type="string" not-null="true" force="false" insert="true">
  <column name="DISCRIMINATOR" />
  </discriminator>
  <property name="name" column="fname" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never" />
- <list name="children" access="field" cascade="all" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true">
  <key column="parentId" on-delete="noaction" />
  <index l
  <i d column="elementIndex" />
                  " l      tI d "
  <many-to-many class="ComplexHolder0" embed-xml="true" not-found="exception" unique="false" />
  </list>
- <array name="array" access="field" cascade="all" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true">
  <key column="parentId" on-delete="noaction" />
  <index column="elementIndex" />
  <many-to-many class="ComplexHolder0" embed-xml="true" not-found="exception" unique="false" />
  </array>
- <subclass name="ComplexHolder1" discriminator-value="D" dynamic-update="false" dynamic insert="false" select before update="false">
                                        discriminator value="D" dynamic update="false" dynamic-insert="false" select-before-update="false">
  <property name="i1" column="i1" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" />
- <subclass name="ComplexHolder2" discriminator-value="E" dynamic-update="false" dynamic-insert="false" select-before-update="false">
  <property name="i2" column="i2" type="int" index="i2_idx" unique="false" optimistic-lock="true" lazy="false" generated="never" />
- <subclass name="ComplexHolder3" discriminator-value="F" dynamic-update="false" dynamic-insert="false" select-before-update="false">
  <property name="i3" column="i3" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" />
- <subclass name="ComplexHolder4" discriminator-value="G" dynamic-update="false" dynamic-insert="false" select-before-update="false">
  <property name="i4" column="i4" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" />
  </subclass>
  </subclass>
  </subclass>
  </subclass>
  </class>
  </hibernate-mapping>




                                                                                                                                   #NoSQLVersant
MongoDB Code
private void storeData(Mongo mongo) {
       collection(mongo).insert(new BasicDBObject("test", "object"));
   }

public ComplexHolder0 convertFromDocument(DBObject data, DeserializationOptions
   deserializationOption) {
       ComplexHolder0 instance = createInstance(getAsString(data, TYPE_ATTRIBUTE));
       instance.setName(getAsString(data, NAME_ATTRIBUTE));
       if ( ll ! d t
          (null != data.get(CHILDREN)) {
                           t(CHILDREN)) {
           instance.setChildren(fromMongoObjectToList(getAsList(data, CHILDREN), 
   deserializationOption));
       }
       if (null != data.get(ARRAY)) {
           final List<ComplexHolder0> arrayContent = fromMongoObjectToList(getAsList(data, 
                         p                y                 g   j         (g        (    ,
   ARRAY), deserializationOption);
           instance.setArray(arrayContent.toArray(new ComplexHolder0[arrayContent.size()]));
       }
       readAttributes(data, instance);
       return instance;
   } 




                                                                         #NoSQLVersant
MongoDB Mapping
private static void writeSubTypeAttributes(ComplexHolder0 holder, 
  BasicDBObject dataStorage) {
       if (h ld
          (holder instanceof ComplexHolder1) {
                  i t      f     l    ld   ) {
           dataStorage.put(FIELD_I1, ((ComplexHolder1) holder)._i1);
       }
       if (holder instanceof ComplexHolder2) {
           dataStorage.put(FIELD_I2, ((ComplexHolder2) holder)._i2);
           d t St        t(FIELD I2 ((C    l H ld 2) h ld ) i2)
       }

private static void readAttributes(DBObject dataStorage, ComplexHolder0 
  holder) {
  holder) {
       if (holder instanceof ComplexHolder1) {
           ((ComplexHolder1) holder)._i1 = (Integer) 
  dataStorage.get(FIELD_I1);
       }
       if (holder instanceof ComplexHolder2) {
           ((ComplexHolder2) holder)._i2 = (Integer) 
  dataStorage.get(FIELD_I2);
       }



                                                       #NoSQLVersant
g        _
Holder0.class.getPackage().getName();
nal String NAME_ATTRIBUTE = "name";
nal String CHILDREN = "children";
nal String ARRAY = "array";
nal String REFERENCE_TO_ORIGINAL_DOCUMENT = "_refToOriginal";
nal String FIELD_I1 = "_i1";
nal String FIELD_I2 = "_i2";
nal String FIELD_I3 = "_i3";
nal String FIELD_I4 = "_i4";        MongoDB Mapping
inal OneArgFunction<BasicDBObject, DBRef> refCreator;


tion(OneArgFunction<BasicDBObject, DBRef> refCreator) {
refCreator = refCreator;


atic Serialisation create(OneArgFunction<BasicDBObject, DBRef> 
tor) {
ull == refCreator) {
hrow new ArgumentNullException("requires a reference creator");

n new Serialisation(refCreator);


atic OneArgFunction<BasicDBObject, DBRef> 
eferenceCreator(final DBCollection collection) {
ull == collection) {
hrow new ArgumentNullException("requires a collection");

n new OneArgFunction<BasicDBObject, DBRef>() {
Override
ublic DBRef invoke(BasicDBObject basicDBObject) {
   final DB db = collection.getDB();
   final Object id = basicDBObject.get("_id");
   if (null == id) {
       throw new IllegalStateException("Expected an '_id' on the 
);
   }
   return new DBRef(db, collection.getName(), id);
                   ( ,             g      (),   );




                                                                    #NoSQLVersant
Versant JPA Code

► Write – Generates Holder’s to user spec depth
                                      p     p
  ComplexHolder cp = new ComplexHolder( );  
  em.makePersistent(cp);

► Read – Access root of graph and traverse
  cp = em.find( ComplexHolder.class, id );   
  cp.getChildren().touch();

► Q
  Query
  String query = "from org.polepos.teams.versant.data.Holder2 
  where i2=" + currentInt;    Iterator it = 
  session.iterate(query); 
      i   i      (     )

► Delete – Deletes Graph – Cascading Operation


                                                #NoSQLVersant
Versant JPA Mapping
Single XML File with primitive declaration entries


 <class name="ComplexHolder0">
        <field name name />
        <field name="name" />
        <field name="array" />
            <field name="children">
        <collection element‐
type="ComplexHolder0"/> </field>
 </class>




                                           #NoSQLVersant
Sh@t’s and Grins
► JDBC Code
JDBC StringBuilder sb = new StringBuilder(); sb.append("select " + 
   HOLDER_TABLE0 + ".id from " + HOLDER_TABLE0); sb.append(" INNER 
   JOIN " + HOLDER_TABLES[0]); sb.append(" on " + HOLDER_TABLE0 + 
   ".id =   "  + HOLDER_TABLES[0] +  ".id "); sb.append("  INNER JOIN  "  
    .id        + HOLDER TABLES[0] + .id  ); sb.append( INNER JOIN
   + HOLDER_TABLES[1]); sb.append(" on " + HOLDER_TABLE0 + ".id = " 
   + HOLDER_TABLES[1] + ".id "); sb.append(" LEFT OUTER JOIN " + 
   HOLDER_TABLES[2]); sb.append(" on " + HOLDER_TABLE0 + ".id = " + 
   HOLDER_TABLES[2] + ".id "); sb.append(" LEFT OUTER JOIN " + 
   HOLDER_TABLES[3]); sb.append( on
   HOLDER TABLES[3]); sb.append("  on  "  + HOLDER_TABLE0 +  ".id =   "  + 
                                           + HOLDER TABLE0 + .id         +
   HOLDER_TABLES[3] + ".id "); sb.append(" where " + 
   HOLDER_TABLES[1] + ".i2 = ?"); PreparedStatement stat = 
   prepareStatement(sb.toString()); ResultSet resultSet
   stat.executeQuery(); 




                                                         #NoSQLVersant
PolePosition
Benchmark Summary Results




                   #NoSQLVersant
FlatObject - Single Thread




                     #NoSQLVersant
Results – ComplexConcurrency
        @mongo - no safe mode




                                #NoSQLVersant
Results – QueryConcurrency
       @mongo – no safe mode




                               #NoSQLVersant
Results – InsertConcurrent
      @mongo – no safe mode




                              #NoSQLVersant
Results – ComplexConcurrency
         @mongo – safe mode




                              #NoSQLVersant
Results – QueryConcurrency
       @mongo – safe mode




                            #NoSQLVersant
Results – InsertConcurrent
       @mongo – safe mode




                            #NoSQLVersant
Conclusions
► Wake-up, smell the coffee
        p,
  JOINs are not needed - unless adhoc analytics
► Take care of business, dump a load of code
  Serialization is bad, data useful once structured
  Mapping is Mapping, even when it’s not an ORM
► Get on your Bad Motor Scooter and Ride
  NoSQL without Mapping rules the road


         Get the Code: http://www.polepos.org


                                             #NoSQLVersant
Q&A


      #NoSQLVersant
Contact
      Robert Greene
Vice President, Technology
   rgreene@versant.com
          @      t

  NoSQL Now! – Booth #
    SQ               #14




                           #NoSQLVersant

Leveraging your Knowledge of ORM Towards Performance-based NoSQL Technology

  • 1.
    Leveraging your Knowledge ofORM Towards Performance- based N SQL T h l b d NoSQL Technology By Robert Greene Versant Corporation U.S. Headquarters 255 Shoreline Dr Suite 450 Redwood City CA 94065 Dr. 450, City, www.versant.com | 650-232-2400 #NoSQLVersant
  • 2.
    Overview NoSQL at it’s Core SQ C Pole-Position – Overview About the Code Circuits Description RDB JPA Code MongoDB Code Versant JPA Code V t C d Results – Winners of the Race Developer Challenge #NoSQLVersant
  • 3.
    NoSQL at its core #NoSQLVersant
  • 4.
    Traditional DBMS ScaleArchitecture INEFFICIENT CPU destroying Mapping EXPENSIVE Repetitive data movement and JOIN calculation #NoSQLVersant
  • 5.
    NoSQL at itsCore A Shift In Application Architecture UNIFED Application  A li ti driven schema COMMODITY HW COMMODITY HW Horizontal scale out,  distribution and  partitioning • Google – Soft-Schema • IBM – Schema-Less #NoSQLVersant
  • 6.
    A Shift isNeeded ► How Often do Relations Change? g Blog : BlogEntry , Order : OrderItem , You : Friend ► R l ti Relations R l Ch Rarely Change, St R Stop Recalculating Th l l ti Them ► Do you need ALL o you da a in o e p ace o eed of your data one place. ► You don’t. You can distribute it. #NoSQLVersant
  • 7.
    Measured V l M d Value How NoSQL performance stacks up to Relational #NoSQLVersant
  • 8.
    PolePosition Performance Benchmark ► Established in 2003 NoSQL N SQL -vs- ORM ► Code Complexity Circuits Flat Obj t Fl t Objects Graphs Inherited Objects Collections ► Data Operations CRUD Concurrency ► Scalability #NoSQLVersant
  • 9.
    Contenders | Methodology ►Contenders ORM NoSQL ► Methodology External RDB Experts, Internal NoSQL Experts Open Source Benchmark Code for all contenders #NoSQLVersant
  • 10.
    About the Code ►ORM Common Code Base ► Tested Database Engines Hibernate – MySQL / Postgres OpenJPA – MySQL / Postgres MongoDB Versant Object Database #NoSQLVersant
  • 11.
    Circuit Structure ► SimulateCRUD on embedded graph of different Classes. ► Cl Class model - C d l Complex Ci it l Circuit: class Holder0 {  String _name;  String name; List <Holder0> _children; Holder0[] _array; }  class Holder1 extends Holder0 {  { int _i1; }  class Holder2 extends Holder1 {  int _i2 <indexed>; }     ...class HolderN extends….. #NoSQLVersant
  • 12.
    Hibernate JPA Code ►Write – Generates Holder’s to user spec depth ComplexHolder cp = new ComplexHolder( );   em.makePersistent(cp); ► Read – Access root of graph and traverse cp = em.find( ComplexHolder.class, id ); cp.getChildren().touch(); ► Query String query  String query = "from from  org.polepos.teams.hibernate.data.Holder2 where i2=" +  currentInt;    Iterator it =  em.iterate(query);  ► Delete – Deletes Graph - cascading operation #NoSQLVersant
  • 13.
    ORM JPA Mapping XML Mapping File for each Persistent Class ( 11ea Files ) - <hibernate-mapping package="org.polepos.teams.hibernate.data" default-cascade="none" default-access="property" default-lazy="true" auto-import="true"> - <class name="ComplexHolder0" table="tComplexHolderNew0" polymorphism="implicit" mutable="true" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version"> ti i ti l k " i "> <id name="id" column="fid" type="long" /> - <discriminator type="string" not-null="true" force="false" insert="true"> <column name="DISCRIMINATOR" /> </discriminator> <property name="name" column="fname" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never" /> - <list name="children" access="field" cascade="all" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true"> <key column="parentId" on-delete="noaction" /> <index l <i d column="elementIndex" /> " l tI d " <many-to-many class="ComplexHolder0" embed-xml="true" not-found="exception" unique="false" /> </list> - <array name="array" access="field" cascade="all" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true"> <key column="parentId" on-delete="noaction" /> <index column="elementIndex" /> <many-to-many class="ComplexHolder0" embed-xml="true" not-found="exception" unique="false" /> </array> - <subclass name="ComplexHolder1" discriminator-value="D" dynamic-update="false" dynamic insert="false" select before update="false"> discriminator value="D" dynamic update="false" dynamic-insert="false" select-before-update="false"> <property name="i1" column="i1" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" /> - <subclass name="ComplexHolder2" discriminator-value="E" dynamic-update="false" dynamic-insert="false" select-before-update="false"> <property name="i2" column="i2" type="int" index="i2_idx" unique="false" optimistic-lock="true" lazy="false" generated="never" /> - <subclass name="ComplexHolder3" discriminator-value="F" dynamic-update="false" dynamic-insert="false" select-before-update="false"> <property name="i3" column="i3" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" /> - <subclass name="ComplexHolder4" discriminator-value="G" dynamic-update="false" dynamic-insert="false" select-before-update="false"> <property name="i4" column="i4" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" /> </subclass> </subclass> </subclass> </subclass> </class> </hibernate-mapping> #NoSQLVersant
  • 14.
    MongoDB Code private voidstoreData(Mongo mongo) { collection(mongo).insert(new BasicDBObject("test", "object")); } public ComplexHolder0 convertFromDocument(DBObject data, DeserializationOptions deserializationOption) { ComplexHolder0 instance = createInstance(getAsString(data, TYPE_ATTRIBUTE)); instance.setName(getAsString(data, NAME_ATTRIBUTE)); if ( ll ! d t (null != data.get(CHILDREN)) { t(CHILDREN)) { instance.setChildren(fromMongoObjectToList(getAsList(data, CHILDREN),  deserializationOption)); } if (null != data.get(ARRAY)) { final List<ComplexHolder0> arrayContent = fromMongoObjectToList(getAsList(data,  p y g j (g ( , ARRAY), deserializationOption); instance.setArray(arrayContent.toArray(new ComplexHolder0[arrayContent.size()])); } readAttributes(data, instance); return instance; }  #NoSQLVersant
  • 15.
    MongoDB Mapping private staticvoid writeSubTypeAttributes(ComplexHolder0 holder,  BasicDBObject dataStorage) { if (h ld (holder instanceof ComplexHolder1) { i t f l ld ) { dataStorage.put(FIELD_I1, ((ComplexHolder1) holder)._i1); } if (holder instanceof ComplexHolder2) { dataStorage.put(FIELD_I2, ((ComplexHolder2) holder)._i2); d t St t(FIELD I2 ((C l H ld 2) h ld ) i2) } private static void readAttributes(DBObject dataStorage, ComplexHolder0  holder) { holder) { if (holder instanceof ComplexHolder1) { ((ComplexHolder1) holder)._i1 = (Integer)  dataStorage.get(FIELD_I1); } if (holder instanceof ComplexHolder2) { ((ComplexHolder2) holder)._i2 = (Integer)  dataStorage.get(FIELD_I2); } #NoSQLVersant
  • 16.
    g _ Holder0.class.getPackage().getName(); nal String NAME_ATTRIBUTE = "name"; nal String CHILDREN = "children"; nal String ARRAY = "array"; nal String REFERENCE_TO_ORIGINAL_DOCUMENT = "_refToOriginal"; nal String FIELD_I1 = "_i1"; nal String FIELD_I2 = "_i2"; nal String FIELD_I3 = "_i3"; nal String FIELD_I4 = "_i4"; MongoDB Mapping inal OneArgFunction<BasicDBObject, DBRef> refCreator; tion(OneArgFunction<BasicDBObject, DBRef> refCreator) { refCreator = refCreator; atic Serialisation create(OneArgFunction<BasicDBObject, DBRef>  tor) { ull == refCreator) { hrow new ArgumentNullException("requires a reference creator"); n new Serialisation(refCreator); atic OneArgFunction<BasicDBObject, DBRef>  eferenceCreator(final DBCollection collection) { ull == collection) { hrow new ArgumentNullException("requires a collection"); n new OneArgFunction<BasicDBObject, DBRef>() { Override ublic DBRef invoke(BasicDBObject basicDBObject) { final DB db = collection.getDB(); final Object id = basicDBObject.get("_id"); if (null == id) { throw new IllegalStateException("Expected an '_id' on the  ); } return new DBRef(db, collection.getName(), id); ( , g (), ); #NoSQLVersant
  • 17.
    Versant JPA Code ►Write – Generates Holder’s to user spec depth p p ComplexHolder cp = new ComplexHolder( );   em.makePersistent(cp); ► Read – Access root of graph and traverse cp = em.find( ComplexHolder.class, id );    cp.getChildren().touch(); ► Q Query String query = "from org.polepos.teams.versant.data.Holder2  where i2=" + currentInt;    Iterator it =  session.iterate(query);  i i ( ) ► Delete – Deletes Graph – Cascading Operation #NoSQLVersant
  • 18.
    Versant JPA Mapping SingleXML File with primitive declaration entries <class name="ComplexHolder0"> <field name name /> <field name="name" /> <field name="array" /> <field name="children"> <collection element‐ type="ComplexHolder0"/> </field> </class> #NoSQLVersant
  • 19.
    Sh@t’s and Grins ►JDBC Code JDBC StringBuilder sb = new StringBuilder(); sb.append("select " +  HOLDER_TABLE0 + ".id from " + HOLDER_TABLE0); sb.append(" INNER  JOIN " + HOLDER_TABLES[0]); sb.append(" on " + HOLDER_TABLE0 +  ".id =   "  + HOLDER_TABLES[0] +  ".id "); sb.append("  INNER JOIN  "   .id  + HOLDER TABLES[0] + .id  ); sb.append( INNER JOIN + HOLDER_TABLES[1]); sb.append(" on " + HOLDER_TABLE0 + ".id = "  + HOLDER_TABLES[1] + ".id "); sb.append(" LEFT OUTER JOIN " +  HOLDER_TABLES[2]); sb.append(" on " + HOLDER_TABLE0 + ".id = " +  HOLDER_TABLES[2] + ".id "); sb.append(" LEFT OUTER JOIN " +  HOLDER_TABLES[3]); sb.append( on HOLDER TABLES[3]); sb.append("  on  "  + HOLDER_TABLE0 +  ".id =   "  +  + HOLDER TABLE0 + .id  + HOLDER_TABLES[3] + ".id "); sb.append(" where " +  HOLDER_TABLES[1] + ".i2 = ?"); PreparedStatement stat =  prepareStatement(sb.toString()); ResultSet resultSet stat.executeQuery();  #NoSQLVersant
  • 20.
  • 21.
    FlatObject - SingleThread #NoSQLVersant
  • 22.
    Results – ComplexConcurrency @mongo - no safe mode #NoSQLVersant
  • 23.
    Results – QueryConcurrency @mongo – no safe mode #NoSQLVersant
  • 24.
    Results – InsertConcurrent @mongo – no safe mode #NoSQLVersant
  • 25.
    Results – ComplexConcurrency @mongo – safe mode #NoSQLVersant
  • 26.
    Results – QueryConcurrency @mongo – safe mode #NoSQLVersant
  • 27.
    Results – InsertConcurrent @mongo – safe mode #NoSQLVersant
  • 28.
    Conclusions ► Wake-up, smellthe coffee p, JOINs are not needed - unless adhoc analytics ► Take care of business, dump a load of code Serialization is bad, data useful once structured Mapping is Mapping, even when it’s not an ORM ► Get on your Bad Motor Scooter and Ride NoSQL without Mapping rules the road Get the Code: http://www.polepos.org #NoSQLVersant
  • 29.
    Q&A #NoSQLVersant
  • 30.
    Contact Robert Greene Vice President, Technology rgreene@versant.com @ t NoSQL Now! – Booth # SQ #14 #NoSQLVersant