A PostgreSQL-lel való megismerkedés – a MySQL szuper propagandájának köszönhetően
– kimaradt az életemből, illetve az utóbbi évek alatt nagyon sok ponton fejlődött. Most egy projekt kapcsán elkezdtem ismerkedni vele, az ezirányú tapasztalataimat fogom most és további bejegyzésekben megosztani. A cél nem egy teljes bemutatás, hanem azoknak a hasonlóságoknak, különbözőségeknek a megmutatása, melyekkel találkoztam.

A MacOSX-re történő PostgreSQL telepítés nem túl bonyolult folyamatát már bemutattam másik blogomon, két témára térnék ki most, az egyik a típusok, a másik pedig a dátumkezelés. Értelemszerűen és nyilvánvalóan – mivel mind a két rendszer az SQL szabvány felé próbál minél jobban közelíteni, hatalmas különbségek nincsenek az SQL parancsokat illetően. Megvannak azonban mind a két rendszerben olyan elemek is valósítva, melyek nem szabványosak, és ezek bár hasonlóak, egyáltalán, vagy nem teljesen egyezőek.
Típusok, adatbázis tábla létrehozása
Míg a PostgreSQL alatt részben használhatjuk a MySQL-ben megszokott típus elnevezéseket, az adat típusok elnevezését illetően mind filozófiabeli, mind pedig konkrét elnevezésbeli különbségek adódnak. Az INT, VARCHAR(200), DATE, TIME, TEXT típusok – legalábbis elnevezésükben – megegyeznek (bár a TEXT a MySQL beli LONGTEXT méretű szöveg tárolását teszi lehetővé). Konkrétumokat illetően azonban mindenképpen érdemes a két rendszer ezirányú dokumenticáióját átolvasni: MySQL adattípusok, PostgreSQL adattípusok.
Az AUTO_INCREMENT tulajdonsággal mező a MySQL újítása, PostgreSQL alatt nem áll rendelkezésre (és a szabványban sincs ilyen). Van azonban mind a két rendszerben olyan típus, mely kiváltja, mégpedig a SERIAL. MySQL-ben ez egy alias a ”BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE” típus és tulajdonságlistára, míg PostgreSQL alatt egy szekvenciát hoz létre (mely egy olyan eleme az adatbázisnak, melyből folyamatosan növekvő elemek kérdezhetőek le), és rendeli hozzá az alapvetően INTEGER típusú oszlophoz.
A BLOB típus szintén MySQL sajátosság, PostgreSQL alatt a BYTEA a megfelelője (szabványban nincsen rá külön megfelelő). Míg MySQL-ben direktben hozhatunk létre ENUM (felsorolás) típusú oszlopot, PostgreSQL alatt vagy deklrálni kell egy ENUM típust, vagy pedig a szabványos megkötésekkel lehet szimulálni: mezőnév VARCHAR(255) NOT NULL, CHECK (mezőnév IN (”érték1″, “érték2″, “érték3″…)). A TIMESTAMP típus viselkedése MySQL alatt is függ attól, hogy az adatbázisszerver milyen kompatibilitási módban fut. A jellemző viselkedés mindazonáltal az, hogy ez a mező automatikusan frissítésre kerül az éppen aktuális időponttal ha az adott sort változtatjuk (és ez az első TIMESTAMP típusú oszlop az adott táblában). PostgreSQL esetén DATETIME mezőként viselkedik a TIMESTAMP, azaz semmilyen értékkel nem töltődik ki automatikusan. PostgreSQL alatt hasonló funkcionalitás triggerekkel érhető el.
A fentiek alapján levonható a következtetés, miszerint egyszerű táblákat MySQL-t ismerők is könnyen létrehozhatnak, de komolyabb munkánál mindenképpen áttekintendő a PostgreSQL dokumentációja.
Dátum kezelés
A MySQL kellemes funkciólistával rendelkezik, ha a dátum (és idő) manipulációról van szó. Ez a PostgreSQL-ről is elmondható, nem kell panaszkodnia a dátum manipulációs függvényeit illetően. Az ismerkedés kapcsán két funkciót néztem meg, és ezeket emelném ki, mint egy példát a hasonlóságra, és egy példát a különbözőségre.
MySQL alatt az aktuális időpont a NOW() függvény segítségével kérdezhető le, de ez az érték elérhető a szabványos CURRENT_TIMESTAMP kifejezéssel, vagy a már nem annyira szabványos CURRENT_TIMESTAMP() függvénnyel. PostgreSQL alatt hasonló a helyzet, a NOW() és az SQL szabvány CURRENT_TIMESTAMP használható.
Ha egy adott dátumtól bizonyos távolságra levő dátumra vagyunk kiváncsiak, akkor mind a két adatbáziskezelő alatt az INTERVAL kifejezés jöhet szóba, azonban ezek eltérően paraméterezendőek. MySQL alatt például a SELECT now() + INTERVAL 2 day formátum a használandó, PostgreSQL alatt a SELECT now() + INTERVAL ‘2 days’ forma a nyerő. PostgreSQL alatt aposztrófok közé kell tenni az intervallumot leíró kifejezést, és az egyes számot-többes számot illetően megengedőbb (a helytelen 1 days és 2 day is működik), míg MySQL alatt nem lehet aposztróf, és csakis az egyes szám a megengedett.
Összefoglalás
Ismerkedésem kapcsán tervezem további “kalandjaim” megosztását is egyéb területek kapcsán – akármennyire is mind a két rendszer a szabvány SQL-hez próbál meg közelíteni, mint láthatjuk nem kis különbségek vannak. Az mindenesetre elmondható, hogy a PostgreSQL-ben jellemzően több lehetőségünk van, mint a MySQL-ben, még ha nem is mindig lesz könnyebb a helyzetünk ezzel (gondolok itt az ENUM vagy a TIMESTAMP mezőtípusokra).
0 Hozzászólás - “MySQL vs. PostgreSQL I.”