Организация взаимодействия с базой данных

xrb

Новичок
Организация взаимодействия с базой данных

Предлагаю обсудить подходы к взаимодействию с базой данных.
Начну с того, что писать запросы прямо в коде своих скриптов не дело – это очевидно.
Поэтому надо выносить их в отдельный модуль, так что бы они все были в одном месте, и их легко можно было обновлять и добавлять.
Еще, было бы не плохо, что бы за взаимодействие с базой отвечал отдельный класс.
Самое простое решение, которое первое приходит на ум в данной ситуации – выносим класс взаимодействия с базой (назовем его DataBase) в отдельный файл, а запросы реализуем в виде методов класса.
Все вроде бы хорошо, но проблему совершенно не решает. Если проект большой, то файл разрастается на несколько тысяч строк и что то в нем править...

Предлагаю рассмотреть следующее решение:
DataBase имеет конструктор, который отвечает за соединение с БД, какие то еще вспомогательные методы (в умеренном количестве) и метод
call($MethodType,$MethodName,&$params)

PHP:
# Основной метод вызова запросов
function call($MethodType,$MethodName,&$params)
  {
   require_once  $this->classpath."queryes/$MethodType.$MethodName.php";
   return call_user_func($MethodType.'_'.$MethodName, $params,$this);
  }
Предполагается, что все запросы хранятся в отдельной папке “queryes” каждый запрос в отдельном файле с именем methodtype.methodname.php и оформлен там в виде функции вида methodtype_methodname(&$params,&$DB)
Таким образом работа call сводится к тому, что бы подгрузить файл с запросом, вызвать соответствующую функцию и передать ей параметры.
methodtype введено для удобства. Может принимать значения 'insert', 'update' и т.п.

Что бы каждый раз не создавать массивы перед вызовом call из скриптов можно дополнить метод call еще одним
PHP:
# метод вызова запросов с параметрами в самом методе (без использования массива в аргументе)
function pcall($MethodType,$MethodName)
  {
   if(func_num_args() > 2 )
     {
      $params = func_get_args();
      array_shift($params);
      array_shift($params);
     }
   else
     $params = Array();

   return $this->call($MethodType,$MethodName,$params);
  }
В последнем случае параметры можно будет перечислять через запятую, однако в самой вызываемой функции в этом случае необходимо учитывать что массив params не ассоциативный.
Буду рад услышать ваши замечания.
 

Фанат

oncle terrible
Команда форума
Начну с того, что писать запросы прямо в коде своих скриптов не дело – это очевидно.
Поэтому надо выносить их в отдельный модуль, так что бы они все были в одном месте, и их легко можно было обновлять и добавлять.
фигня какая-то
 

StUV

Rotaredom
xrb
сколько у тебя всего различных запросов (шаблонов запросов) ?
 

xrb

Новичок
Автор оригинала: StUV
xrb
сколько у тебя всего различных запросов (шаблонов запросов) ?
даже если используется 100 запросов и один запрос занимает 10 строчек кода это уже получается 1000 строк.
Конкретно у меня при реализации подхода "все запросы в одном файле" получилось более 5000 строк. Сколько именно там запросов ответить затрудняюсь
 

Фанат

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

вместо абстракции, которую должен давать класс, наоборот - жёсткая забивка кодов.
Это не класс, а набор подпрограмм в бейсике
 

voituk

прозревший
Это не класс, а набор подпрограмм в бейсике
Полностю согласен!

Класс "взаимодействия с базой" наоборот должен скрывать детали реализации и управления базой.

Я обычно использую базовый class для примитивных операций - например MiscUtils, а также для каждого набора сущностей информационной системы отдельные Manager/Factory классы.
Например BlogManager class, GalleryManeger class, GoodsFactory class и тд и тп
 

xrb

Новичок
Автор оригинала: bgm
Очередной велосипед.
может дадите ссылочку на невелосипед?
Вопрос не снят. Решение плохое. Допустим. Какое тогда хорошее?
Кратко суть вопроса такова: как отделить логику БД от логики приложения и при этом не получить огроменный файл со всеми запросами в куче?
 

bkonst

.. хочется странного?...
Например, использовать Object-Relational Mapping.
 

bgm

 
xrb
Вопрос не просто не снят. Такого вопроса просто нет и он существует исключительно в Вашем воображении. Учитесь пользоваться поиском, в конце да концов.

http://dklab.ru/lib/DbSimple/
 
Сверху