Помощь с выбором архитектуры классов

PassExcel

Новичок
Здравствуйте. Нужна ваша помощь в выборе подходящей архитектуры.

Имеется несколько базы данных (mysql,mssql,firebird и т.д.)


Общая задача сводится к тому, чтобы я получал информацию из баз через классы, методы которых у всех различаются.
И должен быть один глобальный класс с общими методами.


Например у всех баз - getVersion()
У mysql - нужно посчитать кол-во таблиц, processlist и т .д.
У mssql - нужно посчитать кол-во записей, настройки и т.д.

Т.е. у каждой базы, свои требования, что от туда мне нужно.

Вопрос в том, как это все организовать?

Мой вариант был таким, пока не зашел в тупик:

PHP:
/**
* Глобальный верхний класс. Здесь будут лежать общие методы для всех баз.
* 
*/
abstract class IODatabase {
	abstract function getVersion();
}

Теперь определим классы для каждой базы
PHP:
/**
* Общий класс для баз mysql
*/
class mysql extends IODatabase {
}

/**
* Общий класс для баз mssql
*/
class mssql extends IODatabase {
}

и т.д.


Теперь определяем необходимые классы метод необходимые для получения информации из базы
PHP:
/**
* Класс для учета кол-ва таблиц, пустых записей и т.д.
*/
class mysql_counter extends mysql {
	function countTables();
	function checkNulls();
}

/**
* Класс для просмотра листинга запросов
*/
class processlist extends mysql {
	function explain();
	function process();
}


/**
* Класс для получения информации о кол-ве записей, пользователей, коннектов
*/
class mssql_counter extends mssql {
	function countRecords();
	function countUsers();
	function countConnects();
}



и другие классы для всех типов
Но связать это все не получилось, не хватает знаний. Подскажите, в какую сторону мне нужно копать?
 

PassExcel

Новичок
Насколько я знаю, во фреймворках обеспечивается единый интерфейс для всех типов баз данных. Если я неправ, поправьте пожалуйста. У меня у каждой базы - свои классы и методы и я не понимаю, как заставить их вместе работать ,чтобы на выходе всей этой системы у меня был массив с данными возвращенными каждым методом заданной базы.
 

~WR~

Новичок
На первый взгляд - я бы воспользовался PDO.
http://ru.php.net/manual/en/book.pdo.php

Единые методы для всех баз данных.
Если же нужно что-то дополнительно - создаем дочерние классы, наследуя их от базового PDO, и определяем любые свои методы.
 

Redjik

Джедай-мастер
+1 к PDO, когда читал сразу такое решение в голове появилось
 

флоппик

promotor fidei
Команда форума
Партнер клуба
На первый взгляд - я бы воспользовался PDO.
Если же нужно что-то дополнительно - создаем дочерние классы, наследуя их от базового PDO, и определяем любые свои методы...
...и ломаем постоянные соединения :)
 

tz-lom

Продвинутый новичок
PDO это конечно гуд,но автор вроде не это хочет

вообщем подход то правильный у автора
PHP:
interface Database {
  public function getVersion();
  public function recalcIndexes();
}
а далее конкретные имплементации
PHP:
class MySQL implements Database {
  protected $pdo; // собственно соединение с базой

  public function getVersion() { ....} // суть в том что не надо это куда то выносить - внешний интерфейс это то что объединяет все базы 
  protected function countTables(){ .....} // внутренний - то что помогает при реализации
  protected function countNulls(){...}
}
 

PassExcel

Новичок
Некоторое время назад, я примерно так и сделал. Неудобство заключается в том, что для изменения методов (а они меняются довольно часто) приходится каждый раз править довольно большой класс MySQL.
Хотелось бы делать отдельные файлы, например

getinfo.php
PHP:
/**
* Класс, сборник методов начинающихся с getInfo
*/
class getInfo extends MySQL {
    function getInfoDatabase();
    function getInfoQuerys();
    function getInfoUsers();
...
}
count.php
PHP:
/**
* Класс, сборник методов начинающихся с count
*/
class count extends MySQL {
    function countTables();
    function countNulls();
...
}
И т.д. Удалил файл - вся группа методов тоже стала недоступной. Залил новый файл и все методы из него автоматически стали доступны.

Как это все правильно сделать? Что посоветуете?
 

tz-lom

Продвинутый новичок
как вариант:
PHP:
namespace db\connectors\MySQL;

use db\connectors\MySQL;

class getInfo()
{
  public function __construct(MySQL $dbconn)
  {
     // здесь ты запоминаешь класс или сразу из него извлекаешь то что нужно (дескриптор соединения,параметры)
     // соответственно сам класс MySQL можно реализовать в виде фабрики или прокси
     // или же делать абстрактную фабрику возвращающую конкретные имплементации конкретных интерфейсов
     // хотя возможно это чрезмерное усложнение
  }
}
 

~WR~

Новичок
Ух ты, а можно поподробнее с этого места. Видимо, речь о PDOStatement.
Каким образом наследование может повлиять на стандартную функциональность, если я специально этого не попросил в дочернем классе?

Или это баг?

Сам постоянно использую PostgreSQL без persistent соединений. Они создают неразрешимые (на мой взгляд) проблемы с транзакциями. А без них, даже в простых приложениях, я уже жизни не мыслю.
 

MiksIr

miksir@home:~$
Сам постоянно использую PostgreSQL без persistent соединений. Они создают неразрешимые (на мой взгляд) проблемы с транзакциями. А без них, даже в простых приложениях, я уже жизни не мыслю.
Пихайте ROLLBACK при старте скрипта, если уж так страшно =) Хотя обычно когда используется допольнительный pool - там не такой уж и большой выигрыш будет от постоянных соединений.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ух ты, а можно поподробнее с этого места. Видимо, речь о PDOStatement.
Каким образом наследование может повлиять на стандартную функциональность, если я специально этого не попросил в дочернем классе?

Или это баг?

Сам постоянно использую PostgreSQL без persistent соединений. Они создают неразрешимые (на мой взгляд) проблемы с транзакциями. А без них, даже в простых приложениях, я уже жизни не мыслю.
http://www.php.net/manual/en/pdo.setattribute.php
PDO::ATTR_STATEMENT_CLASS: Set user-supplied statement class derived from PDOStatement. Cannot be used with persistent PDO instances. Requires array(string classname, array(mixed constructor_args)).

Если не ошибаюсь, мне тогда tony2001 объяснил это тем, что проблема в хранимых результатах, которые в новом запуске скрипта нельзя нормально восстановить в нестандартный объект. Что-то такое было.
 
Сверху