Valery's Mlog

Mindlog of a Freak
June 2nd, 2005 by Valery Dachev

PHP: Database Abstraction Layer

Хубаво е, при разработката на какво да е приложение да се има наум възможността за лесна промяна условията на работа без да се пипа много по кода. лесно внасяне на промени в него. Твърдението е особено валидно със страшна сила за web системите изполазващи някакъв тип бази данни. Нека предположим, че по някаква причина (например така съм си свикнал или пък това ми предоставят повечето евтини hosting) съм решил да използвам MySQL. При това положение директно започвам да използвам функциите от mysql разширението (като mysql_connect(), mysql_query() и т.н.). Всичко това е добре, работи чудесно, но какво става, ако искам да сменя базите данни например с PostgreSQL (или не дай си Боже с MSSQL) ? В случая даже на най-простото приложение (т.е. използващо съвместими с SQL стандартите заявки), ще се наложи замяна имената и използването на функциите навсякъде. Още повече, че при по-сложни заявки, това въобще няма да е достатъчно – ще се налагат и промени в синтаксиса и въобще в структурата на някои заявки. Още повече, че не всички бази данни работят плътно по SQL92 и SQL99 стандартите. Така, при писането на SQL заявките, трябва да се съобразяват поддържаните от всички SQL сървъри заявки (нещо по въпроса има тук). Та, да се върна на примера. Няма ли да е къде-къде по-лесно ако всичките ми обръщения към SQL сървъра минават през библиотека от функции, която да осъществява тази връзка, достъпът до нея да е един и същи и да не зависи от типа на SQL сървъра, който се ползва ? Точно за това ще стане дума – абстрактен слой за работа с базите данни (“database abstraction layer”). При този подход, промяната на SQL сървъра, ще води до промяна само в този слой, а не до промени из цялото приложение. Ето какво имам предвид: картинка (взета от прекрасното ръководство тук).

За всеобща радост, не е необходимо да се преоткрива топлата вода. В Perl за целта съществува DBI, .NET Framework пък разполага с ADO.NET. В PHP можем да избираме, но като придобили най-голяма популярност се отличават най-вече PEAR DB (примери за използването на който могат да се намерят тук и там) и придобилият популярност напоследък ADOdb (ръководството – тук). На сайта на phpLens (PHP Application Server) може да се намери, както сравнение на функционалността между двете, така и на тяхната производителност. Струва си да се отбележи и съществуването на ADBdb разширение към PHP, което (ако е инсталирано) допълнително ускорява работата му.

И тъй като темата за персистенцията на данните ми е много актуална в работата напоследък, ще ми се да отбележа мястото на “database abstraction layer” в цялата картинка, а именно между базата данни (каквато и да е тя вече) и слоя за персистенция на данните. Разслояване на приложението и установяването (и запазването) на интерфейсите (протоколите) за комуникация между слоевете дава възможност за поддръжка на приложението на ниво слой и лесната му адаптация към променени условия на работа.

Comments

One Response to “PHP: Database Abstraction Layer”
  1. object-relational mapping му е майката уе :)

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: