Adatbázis Absztrakciós Rétegek - Miért így?
2008-08-25T16:58:39+02:00
2008-08-26T12:08:26+02:00
2022-07-25T21:42:33+02:00
  • Peldaval... Melyik az elegansabb, es adatbazisismeret nelkul erthetobb, kenyelmesebb, portolhatobb?

    <?php $factory = Mapper_PersistenceFactory::getFactory('Domain_Movie'); $finder = $factory->getFinder(); $idObj = $factory->getIdentityObject(); ... try { $idObj->field('name')->equals($movieTitle) ->field('start')->greaterThan(time()) ->lowerThan(time() + (24 * 60 * 60)); $idObj->order('start', 'asc'); } catch (Domain_Exception $ex) { // hibakezeles echo $ex->getMessage(); } try { $movieCollection = $finder->find($idObj); } catch (Mapper_Exception $ex) { // hibakezeles echo $ex->getMessage(); } echo "{$movieTitle}\n"; echo "----------------\n"; foreach ($movieCollection as $movie) { echo "\t{$movie->start} in room {$movie->room}\n"; }

    vagy

    <?php $dbh = mysql_connect($host, $user, $passwd); mysql_select_db($db, $dbh); // hibakezeles ... $movieTitle = mysql_real_escape_string(trim($movieTitle), $dbh); $sql = " SELECT * FROM `movie` WHERE `name` = '{$movieTitle}' AND `start` > " . time() . " AND `start` < " . (time() + (24 * 60 * 60)) . " ORDER BY `start` ASC "; $result = mysql_query($sql, $dbh); // hibakezeles echo "{$movieTitle}\n"; echo "----------------\n"; while ($row = mysql_fetch_assoc($result)) { echo "\t{$row['start']} in room {$row['room']}\n"; }

    ?

    A masodiknal az alkalmazaslogika tele van szemetelve adatbazis-specifikus reszletekkel. Az elsonel szukseg van kiszolgalo osztalyokra, amik bonyolultabbak a nativ adatbaziskezelesnel, viszont sokkal rugalmasabbak, es teljesen elvalasztanak az adatbazistol. Esetleges adatbaziscsere (ne adj isten text file-okra atteres) eseten pedig csak par osztalyhoz kell hozzanyulni az osszes kod atnyalazasa helyett.
    Mutasd a teljes hozzászólást!
  • Igen nagy tevedes lenne azt gondolni, hogy a legegyszerubb lekerdezeseken kivul barmit is egyforman kell megirni my/ms/pgsql-nek.

    Sql query-t meg idealis esetben nem az alkalmazasfejleszto irogat. Alkalmazasfejleszto ne adatbazissal, es tablakkal dolgozzon, hanem objektumokkal/domain fogalmakkal. Az adatok tarolasat, es a megfeleltetest objektumok/fogalmak kozott oldja meg az, aki az absztrakcios reteget irja.

    Ha mar mindenaron relativ konnyen portolhato alkalmazasra van szukseg (altalaban nem), akkor igen: a (miutan megertetted a mierteket nem tul) bonyolult megoldasok az ar a kenyelemert.

    Ajanlott olvasmany: P of EAA
    Innen is plane a Domain Logic-, Data Source Architectural-, Object-Relational * patterns. Az ott megnevezett tervezesi mintakra tovabb keresve eleg gyorsan vilagossa valik a mit miert.
    Mutasd a teljes hozzászólást!
  • Namost szerintem manapság az ember nem töltöget le 20e soros osztálykönyvtárakat, nem írogat sajátot egy olyan egyszerű alap feladatra, hogy query, hanem használja a PDO-t, és csókolom.

    Ennél sokkal fontosabb dolgok várnak az ember fiára. Például meg kell valósítani az eredmények cache-lését a memóriában a program futási idejére. Erre való technikák a DataSet (.net) vagy a Hibernate (java) modellek. Ott van az SDO is (aszem ibm fejlesztés, elég sok nyelvben létezik már), nagyon ígéretes és jó technika (PDO-val dolgozik).

    Egyre inkább terjednek az ORM modellek is, azaz még sql utasításokat sem kell firkálgatni, az adott adatbáziskezelő réteg generálja neked, te szimplán objektumokkal dolgozol, az adatbázis csak egy háttér adattároló, a létezéséről nem is kell tudni. (Sztem ezé lesz a jövő.)

    A másik meg, hogy a beírt példában a prepare medódusban mi a fenét keres a tárolt eljárás?

    Szumma: ilyen connect meg query burkoló maximum tanulási célokat szolgálhat.
    Mutasd a teljes hozzászólást!
  • Na lehet hogy az én hibám lehet hogy nem jól írtam le mi zavar engem kimondottan, úgyhogy írok egy konkrét példát.
    class DBQuery { /** * Holds a reference to an object which implements the DB interface. */ protected $db; /** * Set to true if this is a stored procedure. */ protected $stored_procedure = false; /** * Holds a query with all the strings removed. */ private $query; /** * Used to match quotes in SQL */ private static $QUOTE_MATCH = "/(\".*(?<!\\\)\")|('.*(?<!\\\)')/Ue"; /** * An array containing all the strings, if any, of the query. */ protected $query_strings = array(); protected $result; /** * Class Constructor * @param DB $db Reference to an object which implements the DB interface. */ public function __construct(DB $db) { $this->db = $db; } public function prepare($query) { $this->stored_procedure = true; } public function compile($args) { } public function execute($query) { } }
    Mi a pardon a kifejezésért túrónak ennyi nyavalyát beleírni? Úgyértem egy query függvény egy string-et vár ami a megfelelő SQL parancsot tartalmazza. Miért írnak ennyit ha laikusként aztmondom, hogy
    public function query($param) { $this->query_result = @mysql_query($sql); return $this->query_result; }
    értelem szerűen a mysql_query helyére belehet pakolni mssql_query() satöbbi. Most ez csak feltünési viszketegség, hogy nézzétek mit tudok vagy van valami különösebb oka is?
    Mutasd a teljes hozzászólást!
  • PHP5 PEAR::DB csomag is egy főosztályt használ. Ott egy DSN (ha jól emlékszem) karakterlánc alapján működik.
    Mutasd a teljes hozzászólást!
  • Üdv mindenkinek!
    Gondolkodóba estem miután átnéztem egy pár adatbázis absztrakciós osztályt. Nagyjából mindegyik támogatta a MySQL, Postgres, Oracle, MsSQL adatbázisokat. Amit kérdezni szeretnék, miért írják meg őket ennyire bonyolultan? Úgyértem a legtöbbet végrehajtott függvények a quaery-k fetch-ek num_rows...
    Ennek ellenére az ember ha magától akar írni ugyebár azt gondolja, hoyg remek létrehozok egy interfész-t és implementálom az egyes osztályokba aztán megfelelően csak:
    public function query($sql) { $query = mysql_query($sql); return $query; }
    és csak cserélgeti a paramétereket. Miután letölt egy kész absztrakciós osztályt és belenéz mit lát? 20e soros kódot amiben véletlenül sincs benne egy query függvény sem de ugyanazt az elvet követi, hogy minden SQL típushoz mást osztály van létrehozva?
    Miért van túlbonyolítva, van valami különösebb oka vagy csak legyen minél bonyolultabb annál jobb?
    Mutasd a teljes hozzászólást!
abcd