Прозрачная работа с несколькими базами данных на PHP
Тема следующая. Приходилось ли работать с несколькими базами данных на одном сервере ? Если кому и приходилось расскажите какие были проблемы ?
Зачем: Надоели стандартные методы работы с базой. Думаю создать модуль, который будет прозрачен для разработчика, за счет которого можно работать с любой базой данных любого типа в любой момент, указав всего лишь тип (mysql,mssql и т.п.) и название базы данных (его указываешь в настройках баз), а на выходе получить обьект с (договоренными/обще принятыми) методами типа ->query, ->next и т.п. Вся инфа по тому как сделать запрос, генерация ошибок, колво строк и т.п. выполняет сам полученный обьект... |
|
http://framework.zend.com/manual/ru/zend.db.html
Советую почитать перед началом - можно подчерпнуть много полезных идей. Сам ни чего такого ещё не делал, но планирую. Вообще идея хорошая ибо для добавления поддержки очередного СУБД нужно править только один класс, да и объекты как-то симпатичнее кучи переменных в глобальном пространстве. |
Цитата:
А в самом модуле будет так: $db = F_SQL::dbo('Название модуля','идентификатор базы') $db->q("SELECT * FROM {$db->__}название таблицы"); echo $db->count; //количество полученных строк запроса while ($r = $db->next()){ ... } ... где $db->__ - префикс для работы с таблицами модуля. тем самым модуль прозрачен к сайту полность. все настраивается админом, какой главнй префикс. к какой базе привязан модуль и т.п. |
Цитата:
При подобном проектировании, конечная цель -- вообще избавиться от sql везде, кроме как непосредственно в классах, реализующих каждый database engine. Правильно как-то так: Код:
$db->get_object_list($type, $tbl_name, $fields, $filter, $offset, $count); |
Цитата:
В моем случае не играет роли на каком языке написан запрос. При создании обьекта $db в нем уже будут готовые функции для работы с тем или инным типом базы данных. В твоем же случае я не представляю как это сделать. Ведь синтаксис разных баз разный... и преобразовывать один в другой просто как минимум лишняя трата времени, а во вторых не файл что преобразование будет правильным. |
Цитата:
В этом случае да, мы просто в конфиге меняем класс, который будет использоватся, и кушам печенье. Иначе мы бегаем, высунув язык, по коду, и меняем ручками запросы, которые ВНЕЗАПНО перестали работать на другой БД. |
e1f,
:yes: PeaceCoder, Zend и ещё раз Zend. Семое главное это архитектура (идея как всё должно работать). Реализовать сможет любой, у кого есть более или менее прямые руки. Если сейчас архитектуру не додумать то потом уже не исправить, только переделывать. |
Сдается мне что уже есть такое - тот же самый PEAR DB packages (с Zendом не работал).
Или не прав ? |
sergdev,
всё верно, такого много, но это всё ЧУЖОЙ КОД. |
e1f,
Да я уже думал об этом, хотелось бы вообще сделать такой класс, которому пишешь стандартизированный запрос, а класс его переделывает под ту или инную базу и его синтаксис. Планирую ща следующее. изучить стандарт SQL, внести немного своих фич под свою CMS, а класс, как раз таки, стандартный синтаксис будет конверитровать под тот или иной тип базы данных учитывая фичи CMS. Планирую сделать так что, например, модуль пользователей использует одну базу, а модуль групп другую, причем на разных типах баз.. а подав единый запрос включающий выборку с одной и другой базы, указав всего лишь модули и их таблицы, получить ответ.... |
Цитата:
|
Цитата:
|
PeaceCoder,
Зачем нужно две БД одной CMS? В чём смысл? Так безопаснее? Быстрее? Почему не 5? Сервер железный, пусть работает? |
Цитата:
Простой пример. сделано несколько сайтов на разных доменах и базах но с одним сервером..., более банальный пример - сайт альянса в игре. Все сайты кланов хранятся на разных доменах и серверах, но например по "соглашению" можно взять например темы новостей каждого клана и вывести на сайте альянса.... или например, сайт онлайн игры. все ссервера лучше размещать на отдельных серверах и базы соответсвенно... но инфа на главном сайте то должна быть? |
Не, мне до такого не додуматься даже. Признаю свою вину, меру, степень, глубину....
|
Цитата:
|
Цитата:
Пример: есть модуль пользователей с таблицей users, групп с таблицей groups и форум с таблицами topics, forums Можно будет делать такой запрос $db->q("SELECT T.*,G.Color,U.Nick FROM M_FORUM.topics AS T, M_GROUPS.groups AS G, M_USERS.users AS U WHERE G.UserID=U.id AND T.UserID=U.id"); где M_FORUM, M_GROUPS и M_USERS - названия модулей. Такой запрос будет действовать не зависимо от того какие базы юзают каждый из модулей и на каком они синтаксисе. При этом об префиксах можно будет вообще забыть. Они будут генерится автоматом =) |
PeaceCoder в своем стиле... т.е. твоя библиотека автоматически определяет использованный диалект и преобразует в нужный? Или она определяет свой, православный?
p.s. пару сообщений, правда про orm p.p.s. что меня больше всего смущает, так это то, что ты придумываешь проблему и начинаешь отстаивать ее актуальность. Нет чтобы просто сказать: "Интересно мне, любопытно или что там еще..." ;) |
Цитата:
|
Цитата:
А по сути: кому писать сайт будет гибко - пользователям джумлы что-ли? Они писать умеют? |
Joomla не самая гибкая CMS. Если говорить о гибкости, то ей нужно меряться с Drupal.
|
Цитата:
|
PeaceCoder, говноидея. Полностью согласен с x-yuri в том, что Вы выдумываете идею ради идеи.
|
Цитата:
|
Цитата:
Ну, и какие же возможности появляются? Крошево запросов в веб-части како было, тако и осталось, зато они теперь какие-то мутные, и я плохо представляю себе, как написать их. Далее, мне понадобился запрос, к примеру, с WITH. Mysql его не поддерживает, емнип. Я пишу -- все работает, потому что модули используются не mysql, а oracle, к примеру. Я радостно дописываю запрос и ухожу домой. Потом кто-то меняет в моем запросе только имя модуля, и вуаля -- ничего не пашет. Вот что тут делать пользователю Вашей "системы"? Надо садится, и руками переписывать sql-запросы. Как был каменный век, так и остался. |
e1f,
Как выражается иногда subzey, я Вам соболезную. Цитата:
|
А причем тут требования на использование модулей? Или Вы имеете в виду, что я не смогу использовать модули Oracle и MySQL в одном запросе? Так толку тогда с такой системы, когда я вроде бы и могу
Код:
SELECT * FROM _oracle_db, _mysql_db |
Цитата:
|
Цитата:
Ну и вдогонку -- все же, запросы будут формироватся пользователем вашей CMS? Как будет реализован квотинг данных? Забота об этом возлагается на пользователя? |
Цитата:
Цитата:
$db->q("SELECT * FROM ... WHERE ...='".sql_escape($data)."'" Может есть идеи как избавиться от функции ? |
Цитата:
Код:
PDO::prepare |
bind_param
|
Цитата:
Цитата:
$params = array( 'host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'drupal' ); // Инициализация адаптера с указанием нужного диалекта $db = Zend_Db::factory('Pdo_Mysql', $params); // Выполнение запроса $result = $db->fetchAll( $db -> select() -> from('users') -> order('uid') -> limit(15) ); |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
// Запрос номер 1 (вложенный) $query1 = $db -> select() -> from('blocks', 'delta') -> where('bid = 2'); // Запрос номер 2 $query2 = $db -> select() -> from('users') -> where('uid = ?' , $query1) -> limit(2); // Посмотрим как выглядит строка запроса print $query2->assemble(); /* Вот она: SELECT users.* FROM users WHERE (uid = (SELECT blocks.delta FROM blocks WHERE (bid = 2))) LIMIT 2 */ // Теперь выполним этот запрос $result = $db->fetchAll($query2); // Распечатаем массив результатов print_r($result); Теперь обратим внимание на строку: -> where('uid = ?' , $query1) Запрос 1 будет подставлен вместо знака вопроса. В принципе, можно использовать и конкатенацию, но тогда добавлять скобки придётся руками. -> where('uid = (' . $query1 . ')' ) Ещё можно так: -> where('uid = (SELECT delta FROM blocks WHERE bid = 2)') но это уже совсем быдлокодерство. P.S.: Сдавайтесь PeaceCoder ;) Zend рулит. Хотя, конечно есть и минусы: они перестраховщики большие - много линних проверок и перепроверок. |
Цитата:
Цитата:
|
Цитата:
class my_class { function __toString() { return 'Вдруг как в сказке скрипнула дверь ;)'; } } $my_obj = new my_class(); print $my_obj; |
Часовой пояс GMT +3, время: 01:15. |