MySQL kontra MongoDB programozás SQL és NoSQL megközelítés egy konkrét példán keresztül
Kardos Sándor
[email protected]
(c) 2013 Component Soft Ltd
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
(c) 2013 Component Soft Ltd
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 (c) 2013 Component Soft Ltd
?
Relatív elterjedtség
(c) 2013 Component Soft Ltd
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 (c) 2013 Component Soft Ltd ●
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 ●
(c) 2013 Component Soft Ltd
MySQL – Kik használják?
(c) 2013 Component Soft Ltd
MySQL – Milyen programozási nyelvből használható?
(c) 2013 Component Soft Ltd
MySQL – Több adatbázis-kezelő motor
(c) 2013 Component Soft Ltd
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)
(c) 2013 Component Soft Ltd
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
(c) 2013 Component Soft Ltd
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
(c) 2013 Component Soft Ltd
●
Használók pl.:
(c) 2013 Component Soft Ltd
Támogatott nyelvek C C++ C# Erlang Java Javascript Perl PHP Python Ruby Scala (c) 2013 Component Soft Ltd
● ●
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) (c) 2013 Component Soft Ltd
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)
(c) 2013 Component Soft Ltd
MongoDB Memcached
MongoDB
Sebesség
Key-Value stores
RDBMS
Funkcionalitás
(c) 2013 Component Soft Ltd
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 (c) 2013 Component Soft Ltd
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) (c) 2013 Component Soft Ltd
Példa: Blog – Milyen adatokat tároljunk?
(c) 2013 Component Soft Ltd
Blog adatbázis – relációs séma
(c) 2013 Component Soft Ltd
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" } (c) 2013 Component Soft Ltd
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()); }
(c) 2013 Component Soft Ltd
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(); } (c) 2013 Component Soft Ltd
Ö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
(c) 2013 Component Soft Ltd
Köszönöm a figyelmet!
(c) 2013 Component Soft Ltd