Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Php обёртка базы данной для возможности смены движка db
цитата
10/10/15 в 10:04
 S_Flash
Подскажите паттерн, которым обернуть все вызовы db, чтоб можно было потом добавить в код возможность работы с другим движком. Например, сейчас mongodb, а потом дописать, чтоб то же самое работало для mysql.
цитата
10/10/15 в 12:29
 Alexandur
Вообще PDO, но nosql оно не поддерживает.
цитата
10/10/15 в 15:13
 S_Flash
А как поступить, если я сам буду писать реализации под конкретные базы, включая простейший вариант в текстовом файле.
Например есть абстрактный класс, в котором обьявдены все нужные методы работы с абстрактной БД. Как реализовать смену реализации этого абсмтрактного класса, налету, в зависимости от настроек скрипта? Самый тупой спобоб, который приходит в голову, это смана файла инклуда с реализацией. Но это не совсем уже ООП! Ибо таким макром можно и процедуры обёртки инклудить с разной реализацией, раскидав их по разным файлам!
цитата
10/10/15 в 16:28
 Sterx
ОРМ для реляционных БД реализована
скорее всего свой велосипед писать
ибо принципиально разные подходы к хранению данных
цитата
10/10/15 в 16:30
 Sterx
Цитата:

Как реализовать смену реализации этого абсмтрактного класса, налету, в зависимости от настроек скрипта?

интерфейсом например
цитата
10/10/15 в 17:59
 S_Flash
Sterx писал:
интерфейсом например

Можешь схематически показать или дать линк на что-то похожее?
цитата
10/10/15 в 18:36
 Sterx

<?php
interface DataBaseMapper
{
    public function selectItem($id);
    public function selectItems($ids);
}

class MysqlMapper implements DataBaseMapper
{
    public function selectItem($id)
    {
        return .....;
    }
   
    public function selectItems($ids)
    {
        return .....;
    }
}

class MongoDBMapper implements DataBaseMapper
{
    public function selectItem($id)
    {
        return .....;
    }
   
    public function selectItems($ids)
    {
        return .....;
    }
}

таким образом в абстракции имеем набор методов одинаковых для каждого нового интерфейса, каждый из методов имеет свою реализацию для конкретной БД
цитата
10/10/15 в 19:07
 S_Flash
Sterx: А как это будет выглядеть в коде, где надо использовать конкретно базу в зависимости от какого-то условия? Предположим, для простоты в конфиге есть настройка $dbEngine = 'Mysql'; //или 'MongoDB'; (Или статический класс с тем же примерно полем по смыслу..) Как эта нвстройка должна влиять на код?

И как в самом файле, где нужно обращаться к базе использовать эту абстракцию? (Т.е. элементарно вызвать selectItems..)
цитата
10/10/15 в 19:48
 Sterx

<?php
    $dbEngine = 'MysqlMapper';
    $db = new $dbEngine();
    print_r($db->selectItem(123));
цитата
10/10/15 в 20:05
 Stek
Почему ты тогда не посмотреть в сторону doctrine, propel. Потратить время на обучение, но потом сильно сэкономить на изготовлении своего велосипеда.

Тем более имхо переход mongodb -> mysql весьма специфичный, что бы все предусмотреть заранее. А в orm уже более менее решено.
цитата
10/10/15 в 20:08
 Sterx
в doctrine и nosql и sql дружат?
цитата
10/10/15 в 20:31
 Stek
Да, так как ты работаешь с объектами записей. А хранение, выборка и прочее уже за тебя решает сам ORM. Конечно же такое будет не бесплатно, а стоить дополнительных серверных ресурсов.
Тот же symfony вроде как раз doctrine использует в качестве прослойки работы с базой данных.
цитата
10/10/15 в 22:05
 Ailk
Имхо такие переходники писать разово нужно. Не каждый день бд меняешь.
Поэтому смысла с такими заморочками абсолютно не вижу. К тому же с такими велосипедами потеряешь в производительности.
Касаемо паттернов. Основных пара это Active Record и Data Mapper.
цитата
11/10/15 в 12:14
 IgorZ
Stek писал:
Почему ты тогда не посмотреть в сторону doctrine, propel. Потратить время на обучение, но потом сильно сэкономить на изготовлении своего велосипеда.


Потом чтобы в готовом проекте колонку в таблице добавить столько гемору словить..
цитата
11/10/15 в 13:46
 rickdeckard
использовать ORM - но лучше написать свой слой для бизнес логики (набор функций на уровне бизнес логики а не абстракции на уровне драйвера).

т.к. при использованиие orm боремся с инструментом вместо реализации приложения
цитата
11/10/15 в 21:09
 Stek
gcc писал:
Потом чтобы в готовом проекте колонку в таблице добавить столько гемору словить..

А при чем тут добавление колонки, если изначально разговор шел о обертке над базой, что бы можно было с mongo на mysql съехать.
цитата
13/10/15 в 19:49
 rickdeckard
S_Flash писал:
Самый тупой спобоб, который приходит в голову, это смана файла инклуда с реализацией. Но это не совсем уже ООП! Ибо таким макром можно и процедуры обёртки инклудить с разной реализацией, раскидав их по разным файлам!


ну и что?
вполне нормальный способ чем городить какие то классы с интерфейсами.

require "dblayer/mysql.php";
//require dblayer/mongodb.php;

в файле реализуем несколько функции

entitySelect($table, $filter) - выборка списка элементов

entityGet($table, $key) - возвратить по ключу

entitySet($table, $key, $data) - сохранить по ключу

entityDelete($table, $key)

этих функций в принципе достаточно
цитата
13/10/15 в 21:24
 Sterx
вопрос личностной дрочки - у кого то стоит на ООП стайл, у кого то на функции
цитата
13/10/15 в 21:57
 S_Flash
Короче, заебался я! icon_smile.gif
Часть основных операций монги обернул. Потом, когда выборки посложнее пошли, понял, что хоть и оберну, но реализовать то же самое на других БД парадигмах хоть и можно, но оно не стоит того ни по времени не по ресурсам. Вторая база будет подстраиваться под запросы монги и потеряет львиную долю быстродействия. А скорость я всегдадержу в приоритете!
Перевёл всё на чисто монгу безповоротно. А надо будет переключиться, перепишу, хера тут уже делать!


Эта страница в полной версии