MySQL kontra MongoDB programozás SQL és NoSQL megközelítés egy konkrét példán keresztül Kardos Sándor sandor@component.hu
Miről lesz szó? Miért érdemes őket összehasonlítani? MySQL általános jellemzői MongoDB általános jellemzői Blog adatbázis és lekérdezése MySQL-ben Blog adatbázis és lekérdezése MongoDB-ben Összegzés
Miért érdemes őket összehasonlítani? Ugyanazt az adattárolási feladatot több módon is meg lehet oldani Természetesen az adott feladathoz leginkább illeszkedő megoldást szeretnénk Ehhez érdemes ismerni a tulajdonságaikat A MySQL már nagyon elterjedt, a MongoDB pedig nagyon gyorsan terjed?
Relatív elterjedtség
MySQL A világ legnépszerűbb nyílt forráskódú relációs adatbáziskezelője! több mint napi 70000 letöltés több mint 12 millió aktív telepítés minden földrészen használják stabil, kipróbált (1995 óta fejlesztik) az Oracle 2010-ben felvásárolta választható GPL vagy fizető licenc
MySQL Tradícionális RDBMS: Az adatokat táblákban tárolja, melyekben minden rekordnak ugyanolyan mezői vannak, és ezek sorrendje is azonos A táblák között kapcsolatok definiálhatók A szabvánnyal kompatibilis SQL, sok ügyes kiterjesztéssel Adatbázis-tervezésre komoly elméleti háttér
MySQL Kik használják?
MySQL Milyen programozási nyelvből használható?
MySQL Több adatbázis-kezelő motor
MySQL InnoDB, az alapértelmezett motor Tárolható adatmennyiség: 64TB Tranzakciók MVCC Indexek (B-tree, Clustered) Tömörített adattárolás Gyorsítótárak (Index, Data, Query)
MySQL InnoDB, az alapértelmezett motor Replikáció Sor szintű zárolás Idegen kulcsok támogatása Online biztonsági mentés Automatikus helyreállítás leállás után
JSON dokumentumokat tároló, nem relációs adatbáziskezelő (humongous: óriási nagy) A legnépszerűbb NoSQL adatbáziskezelő Nyílt forráskódú: AGPL licenc, driverek: Apache licenc A 10gen nevű cég fejleszti (2007 óta) Windows, Linux, OS X, és Solaris felett is működik
Használók pl.:
Támogatott nyelvek C C++ C# Erlang Java Javascript Perl PHP Python Ruby Scala
JSON (JavaScript Object Notation) Nincs adatbázis-séma: dokumentumonként más mezők tárolhatók { } "_id": "filemenu", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } Az adatbázis bináris formában tárolja (BSON)
MongoDB SQL utasítások helyett függvényhívások MySQL (lekérdezés egy táblából): SELECT * FROM grades ORDER BY score DESC LIMIT 100,1 MongoDB JavaScript (lekérdezés egy kollekcióból): db.grades.find().sort({'score': 1}).skip(100).limit(1)
MongoDB Memcached Key-Value stores MongoDB Sebesség RDBMS Funkcionalitás
MongoDB Jól skálázható, olcsó PC-ken futó, elosztott adatbázis, de Nincsenek tranzakciók Egy többsoros update egyes lépései utáni állapotot láthatják a párhuzamosan futó lekérdezések, de dokumentum szinten az atomicitás garantált Nincs JOIN Több collection-t érintő lekérdezést lépésenként kell megtenni, de egy relációs adatbázis több táblája helyett sokszor lehet egyetlen collection-t használni max. 16Mb / dokumentum
MongoDB jellemzői Generikus lekérdezések: mező érték, intervallum vagy reguláris kifejezés alapján Aggregáció: MapReduce Szerver-oldali JavaScript futtatás Indexek támogatása Replikáció: master-slave, csak a master írható, automatikus szerepváltás, ha a master kiesik Terhelésmegosztás: sharding, a fejlesztő által választott kulcs alapján az adatokat szétosztja shardokra (shard = master + slave-ek) Fájltárolás: hagyományos fájlrendszer skálázható kiváltására több gépen (GridFS)
Példa: Blog Milyen adatokat tároljunk?
Blog adatbázis relációs séma
Blog adatbázis MongoDB JSON kollekciók Posts collection { title: "Featured blog", author: "ASM", message: "Hi everyone!...", date: new Date('Jun 13, 2012'), comments: [{ commenter: "Alice", message: "First!"}, { commenter: "Bob", message: "Hi!"}], tags: ["blogs", "community", "featured blogs"] } Authors collection { _id: "ASM", password: "onewayhash" }
MySQL adatbázis-lekérdezés JAVÁ-ból try { Connection c = DriverManager.getConnection( "jdbc:mysql://localhost/blog", "user", "password"); Statement s = c.createstatement(); ResultSet rs = s.executequery( "SELECT title, message FROM posts"); while (rs.next()) { System.out.println(rs.getString("title") + " " + rs.getstring(2)); // field 2 is "message" } } catch (SQLException e) { System.out.println("SQL Exception: " + e.getmessage()); }
MongoDB lekérdezés JAVÁ-ból try { Mongo mongoclient = new Mongo("localhost"); DB db = mongoclient.getdb("blog"); DBCollection postscollection = db.getcollection("posts"); BasicDBObject whereclause = new BasicDBObject(); BasicDBObject columnselect = new BasicDBObject("title", true).append("message", true).append("_id", false); DBCursor cursor = postscollection.find(whereclause, columnselect); while (cursor.hasnext()) { System.out.println(cursor.next()); } } catch (MongoException e) { e.printstacktrace(); } catch (UnknownHostException e) { e.printstacktrace(); }
Összegzés MySQL InnoDB: hagyományos, tranzakcionális RDBMS MongoDB: elosztott JSON dokumentum tároló További, mélyebb ismeretekért ajánlom tanfolyamainkat: Oracle MySQL tanfolyamok (fejlesztői és rendszergazdai) Saját fejlesztésű MongoDB fejlesztői tanfolyam
Köszönöm a figyelmet!