📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 10/10/15 в 10:04 |
Подскажите паттерн, которым обернуть все вызовы db, чтоб можно было потом добавить в код возможность работы с другим движком. Например, сейчас mongodb, а потом дописать, чтоб то же самое работало для mysql.
|
|
|
|
С нами с 01.04.07
Сообщения: 4378
Рейтинг: 2970
|
Добавлено: 10/10/15 в 12:29 |
Вообще PDO, но nosql оно не поддерживает.
|
|
|
|
📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 10/10/15 в 15:13 |
А как поступить, если я сам буду писать реализации под конкретные базы, включая простейший вариант в текстовом файле.
Например есть абстрактный класс, в котором обьявдены все нужные методы работы с абстрактной БД. Как реализовать смену реализации этого абсмтрактного класса, налету, в зависимости от настроек скрипта? Самый тупой спобоб, который приходит в голову, это смана файла инклуда с реализацией. Но это не совсем уже ООП! Ибо таким макром можно и процедуры обёртки инклудить с разной реализацией, раскидав их по разным файлам!
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 10/10/15 в 16:28 |
ОРМ для реляционных БД реализована
скорее всего свой велосипед писать
ибо принципиально разные подходы к хранению данных
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 10/10/15 в 16:30 |
Цитата: |
Как реализовать смену реализации этого абсмтрактного класса, налету, в зависимости от настроек скрипта?
|
интерфейсом например
|
|
|
|
📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 10/10/15 в 17:59 |
Sterx писал: | интерфейсом например |
Можешь схематически показать или дать линк на что-то похожее?
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 10/10/15 в 18:36 |
Код: [развернуть] |
<?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 .....;
}
}
|
таким образом в абстракции имеем набор методов одинаковых для каждого нового интерфейса, каждый из методов имеет свою реализацию для конкретной БД
|
|
|
|
📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 10/10/15 в 19:07 |
Sterx: А как это будет выглядеть в коде, где надо использовать конкретно базу в зависимости от какого-то условия? Предположим, для простоты в конфиге есть настройка $dbEngine = 'Mysql'; //или 'MongoDB'; (Или статический класс с тем же примерно полем по смыслу..) Как эта нвстройка должна влиять на код?
И как в самом файле, где нужно обращаться к базе использовать эту абстракцию? (Т.е. элементарно вызвать selectItems..)
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 10/10/15 в 19:48 |
Код: [развернуть] |
<?php
$dbEngine = 'MysqlMapper';
$db = new $dbEngine();
print_r($db->selectItem(123));
|
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 10/10/15 в 20:05 |
Почему ты тогда не посмотреть в сторону doctrine, propel. Потратить время на обучение, но потом сильно сэкономить на изготовлении своего велосипеда.
Тем более имхо переход mongodb -> mysql весьма специфичный, что бы все предусмотреть заранее. А в orm уже более менее решено.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
-1
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 10/10/15 в 20:08 |
в doctrine и nosql и sql дружат?
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 10/10/15 в 20:31 |
Да, так как ты работаешь с объектами записей. А хранение, выборка и прочее уже за тебя решает сам ORM. Конечно же такое будет не бесплатно, а стоить дополнительных серверных ресурсов.
Тот же symfony вроде как раз doctrine использует в качестве прослойки работы с базой данных.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 10/10/15 в 22:05 |
Имхо такие переходники писать разово нужно. Не каждый день бд меняешь.
Поэтому смысла с такими заморочками абсолютно не вижу. К тому же с такими велосипедами потеряешь в производительности.
Касаемо паттернов. Основных пара это Active Record и Data Mapper.
|
|
|
|
С нами с 06.07.15
Сообщения: 110
Рейтинг: 171
|
Добавлено: 11/10/15 в 12:14 |
Stek писал: | Почему ты тогда не посмотреть в сторону doctrine, propel. Потратить время на обучение, но потом сильно сэкономить на изготовлении своего велосипеда.
|
Потом чтобы в готовом проекте колонку в таблице добавить столько гемору словить..
|
|
|
|
С нами с 09.08.12
Сообщения: 185
Рейтинг: 378
|
Добавлено: 11/10/15 в 13:46 |
использовать ORM - но лучше написать свой слой для бизнес логики (набор функций на уровне бизнес логики а не абстракции на уровне драйвера).
т.к. при использованиие orm боремся с инструментом вместо реализации приложения
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 11/10/15 в 21:09 |
gcc писал: | Потом чтобы в готовом проекте колонку в таблице добавить столько гемору словить.. |
А при чем тут добавление колонки, если изначально разговор шел о обертке над базой, что бы можно было с mongo на mysql съехать.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
-1
|
|
|
С нами с 09.08.12
Сообщения: 185
Рейтинг: 378
|
Добавлено: 13/10/15 в 19:49 |
S_Flash писал: | Самый тупой спобоб, который приходит в голову, это смана файла инклуда с реализацией. Но это не совсем уже ООП! Ибо таким макром можно и процедуры обёртки инклудить с разной реализацией, раскидав их по разным файлам! |
ну и что?
вполне нормальный способ чем городить какие то классы с интерфейсами.
require "dblayer/mysql.php";
//require dblayer/mongodb.php;
в файле реализуем несколько функции
entitySelect($table, $filter) - выборка списка элементов
entityGet($table, $key) - возвратить по ключу
entitySet($table, $key, $data) - сохранить по ключу
entityDelete($table, $key)
этих функций в принципе достаточно
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 13/10/15 в 21:24 |
вопрос личностной дрочки - у кого то стоит на ООП стайл, у кого то на функции
|
|
|
|
📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 13/10/15 в 21:57 |
Короче, заебался я!
Часть основных операций монги обернул. Потом, когда выборки посложнее пошли, понял, что хоть и оберну, но реализовать то же самое на других БД парадигмах хоть и можно, но оно не стоит того ни по времени не по ресурсам. Вторая база будет подстраиваться под запросы монги и потеряет львиную долю быстродействия. А скорость я всегдадержу в приоритете!
Перевёл всё на чисто монгу безповоротно. А надо будет переключиться, перепишу, хера тут уже делать!
|
|
|
|