Как проектируется DAO?

WebPHPDev

Новичок
Объясните пожалуйста, или дайте ссылки, если можно, на небольшие примеры реализации DAO. Погуглил, но очень мало информации по этому вопросу. Не понимаю совершенно самостоятельного смысла DAO модели, - чем она занимается вообще, какие методы в ней должны содержаться, что реализовать...

У меня проект на ООП, хочу вот несколько повысить свой уровень, чему-то новому научиться. Сейчас он с MySQL работает, в дальнейшем хотелось бы иметь возможность подключать к БД на текстовых файлах, PostgreSQL. Вот для этого и хочу попытаться выполнить это применив шаблон DAO.

Как я понимаю у меня будет два класса: DAO и MySQL. Последний реализует подключение к БД, выполняет переданный ему запрос, возвращает результат, но что делает DAO и в какой форме общается с MySQL - абсолютно непонятно, к сожалению. Может кто подскажет чего? И ещё - не знаю совершенно, что такое DTO - мне казалось это и есть DAO) но их разграничивают оказывается :(
 

zerkms

TDD infected
Команда форума
DAO представляет абстракцию от хранилища для твоего приложения. Т.е. приложение не знает, что за хранилище (или несколько хранилищ одновременно) и как выгребает и модифицирует данные.

При этом DAO сам по себе не является абстрацией от хранилища. Другими словами - то, что ты называешь DAO - это конкретная реализация, которая работает с конкретной субд. И по определению DAO уметь работать сразу с кучей субд не должно.

DBAL - должен, DAO - нет :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
DAO может и с файлами работать, если написать
 

zerkms

TDD infected
Команда форума
DAO может и с файлами работать, если написать
Угу. DAO - это просто интерфейс доступа к данным. Хоть с файлами, хоть с facebook api. Но при этом он не обязан быть универсальным и уметь работать со всеми субдешечками подряд
 

WebPHPDev

Новичок
badmovie
Спасибо, вот это я уже смотрел :) это чуть ли не единственное объяснение DTO в рунете :)

Ещё за гранью понимания остаётся вот что:
1. PDO, по сути это и есть DAO? Только своеобразная DAO, я так понимаю, поскольку в некоторых случаях PDO может и не обеспечить работы с разными БД (запросы могут не подойти к другой БД). Хотя, может именно поэтому оно и не является DAO :)

2. Какие методы реализуются обычно в DAO? Можно ли небольшой пример? Мне не понятно, каким образом внутри себя, оно связывается с драйвером MySQL и другими. Если у нас интернет-магазин, в случае с DAO, методы у DAO будут что-то типа: getPrice, setPrice, getGoodTitle, setGoodTitle...? А если количество полей не определяется чётко (фиксированно), это проблема будет однако :) Наверное всё-таки не так как-то должно оно быть :)
Если же в DAO должны быть методы вроде: сделатьЗаписьВБД("какая-то-запись"), то непонятно на каком языке пишется эта "какая-то запись". Вот в этом наверное и фишка, что на своём внутреннем языке обратиться нужно к DAO, а далее оно и ретранслируется и в MySQL, и в PostgreSQL, и на текстовые файлы, и во, что душе угодно? Без такого "внутреннего языка" не могу представить реализацию DAO... не представляю просто каким запрос к DAO может быть, чтобы та передавала всё, что надо к различным драйверам БД, с которой она умеет интегрироваться. Кстати, а может я уже не о DAO говорю? :)
 

WebPHPDev

Новичок
Походу, если думать о том, что PDO это и есть DAO - можно и правда так сказать с некоторыми допущениями. Но если в DAO потребуется иметь возможность работы с текстовыми файлами (нашего формата), то тогда DAO будет отдельным слоём, который будет включать в себя возможность работы с этими текстовыми, так и возможность работы с PDO.. Так получается? :)
 

zerkms

TDD infected
Команда форума
WebPHPDev
PDO это не DAO. DAO скрывает детали реализации работы с хранилищем от клиента. Типа:

$UserDAO->get($uid);

И совсем неважно откуда и как выбралось
 

fixxxer

К.О.
Партнер клуба
DBAL мне кажется плохой идеей. Например, если стоит требование совместимости с MySQL MYISAM, придется отказаться от транзакций, foreign keys и т.д. Зачем в таком виде юзать постгрес или оракл? Если речь об универсальности в плане установки на хостинги - дык там mysql везде.

Другое дело - DAO, который знает об особенностях конкретных хранилищ, и выполняет подходящие для оных запросы. Написанные ручками для каждого случая. Но это довольно трудоемко (хотя умный ORM с задачей справится).
 

zerkms

TDD infected
Команда форума
DBAL мне кажется плохой идеей. Например, если стоит требование совместимости с MySQL MYISAM, придется отказаться от транзакций, foreign keys и т.д. Зачем в таком виде юзать постгрес или оракл? Если речь об универсальности в плане установки на хостинги - дык там mysql везде.

Другое дело - DAO, который знает об особенностях конкретных хранилищ, и выполняет подходящие для оных запросы. Написанные ручками для каждого случая. Но это довольно трудоемко (хотя умный ORM с задачей справится).
Даже умный ORM хуже умного DBA ;-)

Мысли по вопросу - обычно полную абстракцию от хранилища хотят просто "про запас", слабо понимая зачем и чем это чревато :)
 

fixxxer

К.О.
Партнер клуба
Умный DBA скажет - не выпендриваться и делать под конкретную базу. :)
 

zerkms

TDD infected
Команда форума
Именно )

Или "потом сами будете тюнить своё приложение"
 

fixxxer

К.О.
Партнер клуба
Ага. Такие штуки любят маркетоиды придумывать - типа наша супер-CMS теперь работает с Ораклом. А то, что от того, как оно с ним работает, у любого DBA волосы дыбом встанут, это какбэ другой вопрос :)
 

WebPHPDev

Новичок
Так а для того, чтобы приложение с DAO работало, необходимо создать собственный язык запросов к ДАО?
 

zerkms

TDD infected
Команда форума
WebPHPDev
Считай, что DAO это просто класс. Он просто предоставляет приложению интерфейс.

$UserDAO->get($uid);

Вот тебе тривиальный пример. Какой ещё язык запросов - обыкновенный вызов метода
 

WebPHPDev

Новичок
WebPHPDev
Считай, что DAO это просто класс. Он просто предоставляет приложению интерфейс.

$UserDAO->get($uid);

Вот тебе тривиальный пример. Какой ещё язык запросов - обыкновенный вызов метода
А каким образом например установить цену определённому товару в таблице интернет-магазина по аналогии? :)
 

AmdY

Пью пиво
Команда форума
WebPHPDev
ты понимаешь с точностью до наоборот, это уход от языка запросов. ты просто говоришь дай мне это, а dao заботится о том, что и откуда взять. то, что его смешивают с active records это лишь частный случай.
попробую сообразить пример
$user = new UserDAO();
$user->find('Василий');
в методе файнд может быть поиск по базе и стоиться запрос большой запрос с джойнами, как-то обрабатываться и выплёвываться тебе в виде удобного массива.
может быть запрос запрос к файловой системе cat /etc/passwd и получишь список пользователей с паролями
может быть смешанный - типа выгребание из memcached + mysql + ldap и т.д.
 

Вурдалак

Продвинутый новичок
С точки зрения AmdY, zerkms и меня, DAO (в том виде, в котором я столкнулся с ним) — фактически то же самое, что и Data Mapper и Repository, то есть объект, соответствующий какой-то сущности (User, Book, ...), занимающийся манипуляцией объектов этой сущности. В случае с Yii под этим понимают другое: там просто какой-то модифицированный PDO. Кто как хочет, то так и понимает.
 

zerkms

TDD infected
Команда форума
Модифицированный PDO == Database Abstraction Layer, суть DBAL ;-)
 
Сверху