Сегодня я решил немного поковыряться во всем этом, хочется научить систему работать не только с MySQL.. В процессе ковыряния, пришел к выводу, что поддержку MySQL, MySQLi, Postgres и SQLite сделать возможно, а вот от всех остальных придется отказаться. Почему?
1. Прежде всего, трудно поверить и невозможно представить, что поддержка такого количества БД реально необходима. Подавляющее число сайтов в сети, используют либо MySQL, либо Postgres. Хостинги сейчас также ориентированы предоставлять именно эти БД. Поэтому довольно трудно найти сервер с установленными другими БД, а значит не получится как следует протестировать и отладить систему при использовании их. - Зачем писать по теории то, что никем не будет использовано, а также не будет гарантий корректной работы.
2. Отличие в SQL запросах. Например, в MySQL и ORACLE по-разному расставляются пределы выборки (LIMIT), кроме того мне смутно верится, что в MSSQL существует функция UNIT_TIMESTAMP и многое другое. Конечно, можно абстрагировать написание запросов в БД (для вставки, обновления и удаления я так и сделал, но как красиво абстрагировать SELECT я так и не придумал), однако такое чревато трудностями при написании/понимании SELECT запросов, что резко отпугнет не только новичков, но и других разработчиков.
Не знаю, как вам, но мне при виде:
$this->ipsclass->DB->build_query( array( 'select' => 't.*, t.posts as topic_posts, t.title as topic_title',
'from' => array( 'topics' => 't' ),
'where' => "t.tid IN({$topics})",
'limit' => array( $this->first, '25' ),
'order' => $this->sort_key . ' ' . $this->sort_order,
'add_join' => array(
array(
'select' => 'p.pid, p.author_id, p.author_name, p.post_date, p.post, p.post_htmlstate, p.queued',
'from' => array( 'posts' => 'p' ),
'where' => 'p.topic_id=t.tid AND p.new_topic=1',
'type' => 'left'
),
array(
'select' => 'm.*',
'from' => array( 'members' => 'm' ),
'where' => 'm.id=p.author_id',
'type' => 'left'
),
array(
'select' => 'me.*',
'from' => array( 'member_extra' => 'me' ),
'where' => 'me.id=p.author_id',
'type' => 'left'
),
array(
'select' => 'pp.*',
'from' => array( 'profile_portal' => 'pp' ),
'where' => 'pp.pp_member_id=p.author_id',
'type' => 'left'
),
)
) );
хочется закрыть файл и куда-то убежать.. Ведь если я, изрядно поднапрягшись, - еще могу понять, что хотел получить автор этого запроса; то самому написать нечто подобное - ПРОСТО НЕВОЗМОЖНО!
3. В MySQL, MySQLi, Postgres и SQLite по-моиму нет никакой разницы в запросах - принципы и функции те же.. Значит никому не придется привыкать к новым стандартам или прочим "новинкам". Я имею ввиду разработчиков сторонних модулей, которые, надеюсь, будут. Прав ли я?
Что думаете по этому поводу?
